HAVRMの空空活動誌

「空空」は「うつらうつら」と読むらしいです.まぁ常に寝不足なもんで...

Ender-3活用記録 その1 ~3Dプリンタの選定と購入~

こんにちは,HAVRMです.

このブログを開設したときにちょっとだけ言及した安い3Dプリンタ「Creality Ender-3」についてそろそろ記事を書いていこうと思います.
初回のこの記事ではこの3Dプリンタを選定した理由について載せようと思います.
なお今回のAmazonリンクについては2018年夏頃販売されていた商品なので今では販売はされてないようです.

印刷の様子

購入に至った経緯

もともとロボットをやっていく中でフレーム等の購入や加工にコストがかかり過ぎるというのは経験として知っていました.個人で何かをしたいというときに電子回路等であれば安く材料が手に入りますが,構造物を作るのは大変でした.そこで当時(2018年頃)機種代が安くなり,簡単に材料等も手に入る熱積層型3Dプリンタで構造物を作ろうと考えました.
今でこそ,光造形型3Dプリンタも安くなっていますが,2018年頃は機種代がとても高く,それでいて強度もないということで最初から考慮していませんでした.

選定の基準(2018年夏頃)

当時は有名なメーカ(XYZprinting,FLASHFORGE等)のプリンタが主流で機種代も10万円以上のものが多かった記憶があります.2018年の初頭から中華製の安い3Dプリンタが出てはいましたが,あまりいいのはなく,なんなら自作したほうがいいんじゃないかとオープンソース系(RepRap等)が活発だった時期です.当時自分は工房等で3Dプリンタを使ったことがあり,その時の経験から次の条件の順でプリンタを自作を含めて検討していました.

  1. ノズル温度が250℃以上に加熱できるもの(様々な材質のため)
  2. ビルドプレートが加熱できるもの(定着性の向上のため)
  3. 価格が3万円未満のもの(予算の関係上)
  4. なるべく大きいものが印刷できるもの
  5. 筐体の剛性が高そうなもの(片持ちのフレームになっているもの等は除外)
  6. Z軸がシングルモータのもの(ダブルモータの場合両軸の同期が必須であり,安物では無理だと思っていた)

選定結果

これらの条件でAmaznoを調べていたところ,2018年の春ごろから販売されていた「Creality Ender-3」を見つけました.今でこそEnderシリーズは3Dプリンタとして有名になっていますが,当時はレビューも少なく,きちんと印刷できるものなのかいまいちわからない状況でした.なお,Ender-3の購入当時の仕様は以下のような感じです.当時購入したページ(販売元:HICTOP)等を参考にしています.
なお購入したのは一番初期の「Creality Ender-3」です.「Pro」とか「X」とかはついていないものです.

www.creality-3d.jp

  • 価格   :¥25,500 (2018/9/23)
  • 印刷サイズ:220×220×250mm
  • ノズル温度:~255℃
  • ベッド温度:~110℃(5分)
  • 積層ピッチ:0.1~0.4mm
  • 造形速度 :30~180mm/s
  • 造形材料 :PLA / ABS / WOOD / TPU / PETG 等
  • 押出方法 :間接式(押出モータとホットエンドが離れている)

この値段でこの性能かと驚いた記憶があります.本当にそうなのかは少し不安でしたが,動かなければ分解して,RepRap等を参考に自作すればいいやと考えていました.特にこの値段だと部品を集めるより安いというのもありました.

このようなことの他にも他の記事等で見た人は違和感を覚えるかもしれません.特に柔軟素材であるTPUがダイレクトエクストルーダー式でないのにもかかわらず,印刷可能となっています.結論としては実際に印刷できるのですが,他の記事ではできないと書いてあることが多いです.
実際に使った感じだと実際の仕様としては次のような感じです.

  • ノズル温度:(推奨)~250℃ (これ以上にすると内部が焦げる恐れ)
  • ベッド温度:外気温次第,冬場(15℃):~98℃,それ以外(25℃以上):~110℃
  • 造形速度 :~150mm/s(下限はなさそう,150mm/sでも詰まりやすいので注意)

全てが仕様通りというわけではないですが,嘘を言っているほどではないかなという感じです.

購入と組み立て

Amazonで購入し,2日後には届いていました.購入した時にHITOPのキャンペーンで本体購入時に材料1kgプレゼントということで白のPLAフィラメント(¥1,950)もセットで購入しました.

このプリンタは自分で組み立てる必要があったので届いた後組み立てをしたのですが,組み立て説明書が間違っていました.詳しいことは次の記事で書くつもりですが,組み立て動画の方をしっかり見ておいた方がいいと思います.

まとめ

今回はプリンタの選定と購入までになります.組み立て時の注意や修理等の記録は次回の記事で,各種材料(型番毎)の比較等はさらにその次の記事以降で書きたいと思います.購入してからもうすぐ5年,計5kg以上は印刷してきましたが,時々不調になりつつも今もしっかり印刷しています.あえて大がかりな更新は行わず,部品交換や一部パーツの後付け等のみで頑張っています.
なおこれまでに以下の材料の印刷をしてきました.

Raspberry Pi + IMX219マニュアルフォーカスカメラモジュールで写真撮影

こんにちは,HAVRMです.

Arducamのマニュアルフォーカス可能なRaspberry Pi用カメラモジュールを使おうとしたらQuick Startがちゃんとなってなかったのでまとめようと思います.内容はとても薄いので今回は写真等は載せないつもりです.

www.arducam.com

8MP IMX219 Auto Focus Camera Module with Motorized Lensとは

IMX219はRaspberry Pi公式のカメラモジュール「Pi Camera V2」に搭載されているSony製のカメラセンサです.これにマニュアルで調整可能なモータ内蔵のピント調節機構が内蔵されたモジュールになります.国内ではSwitch Science において¥3,916(2023/6/26)で販売されているカメラになります.

Raspberry Pi用オートフォーカスカメラモジュール(8MP / IMX219)www.switch-science.com

使い方

ハードウェア

ケーブルの挿し方等は適当に探せば出てきます.カメラモジュールにはあらかじめケーブルが刺してあるので,Raspberry PiのCAMERAと書かれたコネクタに金属端子が見えている側をSD側にして挿すだけです.

ソフトウェア

モータ内蔵のフォーカス可変カメラのQuick StartではIMX219については「/boot/config.txt」をいじればいいよとだけ書いてありますが,嘘です.
docs.arducam.com

実際は専用のjsonファイルをダウンロードする必要があります.じつはこのことは別のページに書いてあるのですが,Quick Startにはリンクがないのです...
docs.arducam.com

あと必須だとは思うのですが,i2CをONにする必要もあります.
www.arducam.com


実際の階層
Arducam Wiki
┃ ・・・
Raspberry Pi Camera
┃┃ ・・・
┃┣ Pivariety Camera
┃┃┃ ・・・
┃┃┣ libcamera and libcamera-apps ←ここを読まないといけない
┃┃┃ ・・・
┃┃┗ ・・・
┃┃ ・・・
┃┣ Motorized Focus Camera ←該当Quick Start
┃┃ ・・・
┃┗ ・・・
┃ ・・・
┗ ・・・

Raspberry Pi Camera Autofocus: The Complete Guide (V1, V2, HQ)


せめてこういう重要のなものは「Raspberry Pi Camera」直下やQuick Start内に記述してほしい...

必要な設定のインストールや実行

ここから先は説明通りにしていくだけで使えます.
@ libcamera and libcamera-apps

$ wget -O install_pivariety_pkgs.sh https://github.com/ArduCAM/Arducam-Pivariety-V4L2-Driver/releases/download/install_script/install_pivariety_pkgs.sh 
$ chmod +x install_pivariety_pkgs.sh
$ ./install_pivariety_pkgs.sh -p libcamera_dev
$ ./install_pivariety_pkgs.sh -p libcamera_apps

@ Motorized-Focus-Camera>Quick Start
「/boot/config.txt」の「[all]」内に以下の1行を追加

dtoverlay=imx219,vcm

@ Raspberry Pi Camera Autofocus: The Complete Guide (V1, V2, HQ)
同様に「/boot/config.txt」の「[all]」内に以下の1行を追加

dtparam=i2c_vc=on

また「raspi-config」でも「Interface Options」から「I2C」をONにする.

これらが終わったら再起動すればカメラが認識でき,撮影ができるはずです.今回は前回とは違い,Raspberry Pi 3 Model BとHDMIで画面に出して実行したためか「--qt-preview」のオプションは不要でした.
(以下のブログ参照)
havrm.hatenablog.com

最後に

いかがでしたか.ここ何回かArducamのカメラを触って思ったのはマニュアルが間違っていたり,使いにくいということです.社員さんたちはきちんと自分たちでゼロからやっているのかな...特に一度すればいい設定系は普通1種類しか使わない人にとってはきちんと書いてほしい内容なんだよね...
とはいえ,この会社のカメラモジュールは世界でよく使われているので英語であればいろいろ見つかりますし,ほしいキットもいろいろあるので一度見てみると面白いです.

Raspberry Pi Zero + IMX327で写真・動画撮影 Vol. 2 ~CSマウントレンズへの換装~

こんにちは,HAVRMです.
前回に引き続き,Raspberry Pi ZeroとIMX327で撮影した話になります.前回は付属のレンズを使っていましたが,単焦点レンズのため拡大等できませんでした.そこで広角から望遠まで変更できるCSマウントのレンズに換装したのでその時の話を書きます.

望遠での撮影の様子

IMX327やRasoberry Piでの使い方等は前回の記事を参考にしてください.
havrm.hatenablog.com

レンズについて

基本的にカメラはレンズでピントを合わせ,撮影素子に投影して撮影しています.一番原始的?な方法はピンホールカメラでレンズの変わりに極小の穴をあけることでピントを合わせる方法です.昔よく使われていた使い捨てカメラの場合,凸レンズが入っており(分解したものは1つでした),それでピントが合うようにしてあります.スマホのカメラにも数枚のレンズが入っており,仕様とか見るとレンズ枚数が書いてある場合もあります.
レンズを選ぶ際はいろいろ考える必要がありますが,今回は以下のことに気を付けて購入しました.あまり光学系に詳しくないので詳細を知りたい方は専門の人のブログ等を読むといいです.ほかにもセンササイズ等ありますが,センササイズはある程度マウントによって定まっているようなのである程度近ければOKにしています.

焦点距離

焦点距離はレンズで屈折させた光が一点に集まる距離ですが,これが倍率に直結します.焦点距離が長いほど倍率は高くなり,極端に短いと超広角や魚眼等といったものになります.なお画角も倍率に関係する値で,画角が狭いほど倍率は高いものになります.一般的に焦点距離100mm以上を望遠レンズというみたい(以下のサイト)ですが,これはあくまで一眼レフ等に使われる「フルサイズ」のセンサでの話になります.
ptl.imagegateway.net

この「フルサイズ」というのはセンサの全体のサイズのことで,フルサイズだと36×24mmの寸法になります.これより小さいセンサだと画角等計算する際にサイズに応じて補正を入れる必要があり,小さなセンサであればあるほど補正値が大きくなり,結果的に焦点距離が伸びます.今回のIMX327は「1/2.8″サイズ(対角線表記,6.46mm)」で,5.44×3.09mmのセンサになります.この時の補正値は大体6.7倍になるそうです(以下のサイトで計算).
omoide-photo.jp

今回はともかく焦点距離を長くできるものを探して選定しました.そのうえで広角側も広めのものを探しました.

解像度

意外と画像の品質に影響するのがレンズの有効画素数になります.レンズのシャープさにつながるものでセンサの画素数以上のものを選ばないとピンボケしたような写真になります.以下のサイトの比較がわかりやすいです.
fotootaku.com

今回のカメラは2.07MPなので2MP以上で選んでいます.

マウント

最後にレンズを取り付けられるかどうかに直結するマウントです.レンズとカメラを固定するねじやロック等のサイズを合わせないとそもそもレンズを固定できません.ArducamのIMX327はM12マウント(Sマウント)のものなのですが,これだと焦点を変えられるレンズは極端に少なくなります.違うマウントのレンズを使う場合,アダプターを使えば撮影できる場合があります.M12マウントにはCS/Cマウントのアダプターがあるため,CSマウントのレンズで選びました.

選定したレンズ

結局Amazonの次のレンズを選びました.

  • 焦点距離:6~60mm(フルサイズ換算:40.2~402mm)
  • 解像度 :2MP(日本版では書いてなかったが,ベトナム版?では同じ見た目のセンサが2MP対応となっていた)
  • マウント:CSマウント

センサイサイズは「1/3"サイズ」とIMX327の「1/2.8"サイズ」と近いので問題ないと思いました.
なおもともとついていたM12マウントのレンズの焦点距離は4.3mmなので最大広角の状態でも元のレンズより拡大された状態になります.

なおアダプターは以下のブログを参考にこれを選んでいました.
denor.jp

なおCSマウント→M12マウントはいっぱいありましたが,M12マウント→CSマウントはAmazonではこの1種類(いろいろな販売店が出品している)しかありませんでした.

実際に取り付けようとして...失敗

ということで早速変換アダプタをIMX327のM12マウントに取り付けようとしましたが,ねじが入りません...
まっすぐ入れても途中で斜めになったり,外に押し戻されたりしてはまりませんでした...
たまたまなのか相性が悪かったようなので別の方法で取り付けることにしました.

取り付け方の検討

もともとこういったカメラモジュールは基板にねじ止めして固定しています.その寸法はある程度決まっていて,特にM12マウントとCSマウントでは互換性がある場合があります.Arducamでもマウントだけを変えた商品を販売しています.
www.arducam.com
www.arducam.com

IMX327のマウントも同じ形なのでCSマウントだけで販売されていないか探してみました.なおサイズは以下の通りです.

  • ねじ   :(おそらく)M1.6
  • ねじ間距離:20mm
  • センサ枠 :□15×15mm

実際に買ったものは次のものです.

実際のとりつけ

なるべくほこり等のゴミがない場所で作業してください.

M12マウントの取り外し

まずはM12マウントを外します.とりあえず,裏面の明るさセンサのケーブルを抜きます.ただ引き抜けばいいです.

明るさセンサのケーブル(画像中赤丸内のコネクタ)

その後背面のねじを外していくのですが,中にセンサがあるのでなるべくマウントをずらさないように外していきます.下手にマウントがずれると中のセンサに傷がつく恐れがあります.

マウント固定ネジ(画像中赤丸内のねじ)

なお,ねじを外す際は以下のセットの「+3.0」を使いました.ねじのサイズ的にはもう一つ下の「+2.5」がよさそうでしたが,滑ったので大きめのものにしました.

外すとこんな感じになります.

マウントを外した様子

上の画像中の基板上にある黒い四角い素子が画像センサです.

CSマウントの取り付け

ここからはほこり等が入らないように素早い作業が必要です.
購入したCSマウントのセンサ側にある保護フィルムをはがし,取り付けえるのですが,明るさセンサと干渉しました...

明るさセンサとの干渉(赤丸部分)

そこで明るさセンサを無理やり斜めにし,どうにかつけることに成功しました.

明るさセンサを押しのけた様子

レンズの取り付け

最後にマウントのレンズ側にある保護フィルムをはがし,レンズを取り付ければ終了です.

保護フィルムをはがした状態
レンズを取り付けた様子

実際の撮影

今回も前回と同じく対象はガチャのデロリアンです.
www.takaratomy-arts.co.jp

レンズのレビュー等にも書いてありますが,ピントの調整がとても難しく,少し回しただけで大きく変わります.しかも倍率(焦点距離)を変えるとピントも一緒にずれるので調整がすごく大変です.ただ,ズーム等をしてもレンズの寸法自体は変化しないので何かに組み込むときとかはいいかもしれません.

至近距離(約15cm)

前回のM12マウントの時と同じような距離(15cmぐらいです)で撮影するとこんな感じになります.

撮影の様子(至近距離)
焦点距離6mm
撮影画像(オリジナル,焦点距離6mm,対象距離約15cm)

下の方に縁?が写ってしまっていますが,ほぼ全体がきれいに映っています.

焦点距離60mm
撮影画像(オリジナル,焦点距離60mm,対象距離約15cm)

焦点距離が60mmだとピント合わせの範囲ではピントが合わず,全体的にぼけた写真になりました.この距離でピントが合う一番望遠時の画像は下のものになります.

撮影画像(オリジナル,焦点距離?,対象距離約15cm)

おそらくレンズとセンサの位置自体をずらすとピントが合うようになる気もしますが,そのためには延長アダプター等が必要になるかもしれないので保留です.

遠方(約60cm)

次に望遠を生かすために約60cm離して撮影してみました.

撮影の様子(遠方)
焦点距離6mm
撮影画像(オリジナル,焦点距離6mm,対象距離約60cm)
焦点距離60mm
撮影画像(オリジナル,焦点距離60mm,対象距離約60cm)

iPhone 13 Proのカメラと比較すると大体13.7倍ぐらいの画像と同じ感じになります.

比較画像(iPhone 13 Pro,13.7倍)

実際の比較のために車の先頭にある会社(DMC)のロゴマークで比較してみます.

ロゴマーク比較(上:IMX327,下:iPhone 13 Pro 13.7倍)

iPhoneの場合,レンズ以外のズーム(iPhone 13 Proの場合×0.5,×1,×3)の場合,ピントが合う近いレンズの画像をデジタルズームし,減少した画素数は画像処理で補います.その過程でのっぺりとした画像になってしまいます.IMX327の画像もiPhone側に合わせて拡大したので少しボケたような画像になっていますが,ロゴマークはそこまで差はなくとも,ロゴマークがついている箇所(空気取り入れ口?)の凹凸がきちんと撮影できています.なおDMCのマークは「⊃m⊂」のようになっているのでIMX327のほうが近くなっています.

倍率を変える様子

倍率を変えながら撮影したのが下の動画になります.ズームに合わせてピントもずれるので調整しながらしていますが,ほとんどあってないです...またピント調整自体もDisplay HAT Mini(2インチ)を見ながらやっているので細かいところがよく見えてないです...
youtu.be

最後に

いかがだったでしょうか.IMX327に望遠レンズをつけて撮影するところまで行いました.もともと月等の天体をとりたくレンズを選んでいるので,次は実際に月等を撮影してみたいと思います(今日は新月の次の日なので月が見れません...).

Raspberry Pi Zero + IMX327で写真・動画撮影

こんにちは,HAVRMです.

低照度カメラIMX327を買ったのでRaspberry Pi Zeroで試してみました.使い方自体は他のRaspberry Piと同じだと思うので参考にしてもらえると嬉しいです.さらに前回のブログでやったDisplay HAT Miniと合わせて使ったときの話も載せます.

Raspberry Pi Zero + Display HAT Mini + IMX327での撮影の様子

havrm.hatenablog.com

注意:この作業は2023/6/1に作業した内容です.バージョンアップ等で変わる可能性があります.

IMX327とは

「IMX327」はSonyが出している低照度カメラ「STARVIS」の一種です.Arducamというメーカが「STARVIS」のカメラモジュールをいくつか出している中で,感度が高く,安いものを選びました.ほかには「IMX290」や「IMX462」が売られています.「IMX462」が一番性能がいいですがその分高く(¥9,944@Switch Science),フレームレートやわずかに画素数が低い以外同じ性能の「IMX327」がほぼ半額(¥4,972)なのでこちらを選びました.買ったものは以下のものです.なお同じページに各センサの比較表があります.

Arducam IMX327搭載 Raspberry Pi用低照度カメラwww.switch-science.com

実際に使ってみる

カメラとの通信ケーブルについて

モジュールのコネクタは22pinであり,あらかじめRaspberry PiのModel AやB用に15pinへの変換ケーブルが付属していますが,Raspberry Pi Zero等の22pin用のケーブルは付属していませんでした.手持ちでもなかったので,ケーブル長が短いものの中で,Amazonですぐ届くケーブル(10本入り)を購入しました.

「/boot/config.txt」の編集

最新のRaspberry Pi OSでは「libcamera」系のコマンドを使うことでいろいろなセンサの画像が撮れます.そうするためにあらかじめ「/boot/config.txt」にセンサ情報を入力する必要がありますが,Arducamの公式サイトでは「dtoverlay=imx327」と追記するように書いてありますが,それでは動きませんでした(泣).

docs.arducam.com

いろいろケーブルの接触Raspberry Piを変えてみたりした結果,この記述内容が間違っていることがわかりました.公式サイトでは「IMX290とIMX327は同じドライバーなので"dtoverlay=imx290"と記載する」と書いてありました orz

www.raspberrypi.com

ということで「dtoverlay=imx290, clock-frequency=74250000」と記入し,再起動するときちんとカメラを認識しました.
なお念のため「gpu_mem=128」も記入しておいた方がいいと思います(どっかのサイトを見てやったのですが,覚えてないです...).

実際のコマンド

ただ,プレビュー画面はエラーになってそのままだと表示できなかったので,「—qt-preview」オプションをつけた次のコマンドで実行しています.

$ libcamera-hello --qt-preview -t 0 #プレビュー表示をするだけ

なお撮影対象は「ホビーガチャ バック・トゥ・ザ・フューチャー デロリアン【タイムマシン】」の「デロリアンバック・トゥ・ザ・フューチャー Part.2)」です.
www.takaratomy-arts.co.jp

実際の写真

次のコマンドで撮影しています.このとき,「/boot/config.txt」に「clock-frequency=74250000」は記入していません.これは後述します.

$ libcamera-jpeg --qt-preview -o test.jpeg

ライトの元(オリジナルです)

IMX327で撮った写真(明かり有り)

(切り抜き画像)

IMX327で撮った写真(明かり有り,切り抜き)

比較対象(iPhone 13 Proの超広角レンズ,いつも通り切り抜き後画質を落としています.)

iPhone 13 Pro 超広角レンズでの写真(明かり有り)

ライトなし(ノートPCディスプレイの明かりのみ,オリジナル)

IMX327で撮った写真(明かりなし)
IMX327で撮った写真(明かりなし,切り抜き)

比較対象(iPhone 13 Proの超広角レンズ,いつも通り切り抜き後画質を落としています.)

iPhone 13 Pro 超広角レンズでの写真(明かりなし)

カメラの性能がいいiPhoneと比較してもそん色ない画像が撮れています.まだ露光時間等設定していないのでそれ次第ではもっと撮れると思います.

実際に取った動画

次のコマンドで撮影しています.カメラの向きのせいで動画の向きがおかしくなってます…

$ libcamera-vid --qt-preview -t 5000 -o test.h264

youtu.be

Pimoroni Display HAT Miniと合わせて使う場合(「clock-frequency=74250000」について)

Raspberry Pi Zero + IMX327のみでは「clock-frequency=74250000」の設定をした状態でうまく通信できていました.この時プレビュー画面は15FPSで安定して更新できていました.ただ,Display HAT Miniと一緒に使ったところ次のように画像が荒れました.

IMX327で撮った写真(明かり有り,荒れた写真)

どうも処理能力か通信能力が足らず,うまくいかなかったようです.そのため,上記のサイトにあった遅いほうの「clock-frequency=37125000」に変更したところ荒れずに写真が取れましたが,プレビュー画面は5FPS~15FPSで不安定になりました.なお「clock-frequency=37125000」を記入しない場合でも同じ状態なので,初期設定は「clock-frequency=37125000」になるようです.上記の写真等はこの「clock-frequency」の設定をしない状態で,Display HAT Miniで確認しながら撮影しました.

最後に

いかがでしたか.ネットでもあまり使っている人のいない(中途半端だからでしょうか...)IMX327を実際に使ったレビューになります.これで月とかが撮れないかいろいろ試していきたいと思います.

Raspberry Pi Zero + Pimoroni Display HAT Miniで画面表示

こんにちは,HAVRMです.
試しに買ったDisplay HAT MiniをRaspberry Pi Zero WH(2018)につけて画面の代わりにしようとしたら思いのほか苦労したので手順等まとめておこうと思います.

Raspberry Pi Zero + Display HAT Miniで表示している様子

注意:最近販売された(売り切れで買えない)Raspberry Pi Zero 2ではなく,その前のRaspberry Pi Zeroです.ZeroでできてZero 2でできないことはないと思いますが,違う可能性はあります.

参考:この作業は2023/6/1に作業した内容です.バージョンアップ等で変わる可能性があります.

はじめに

もともとRapsberry Pi Zero WH(以下RPi0WH)が販売された当初に買っていたのですが,想像以上の性能の悪さと忙しさで長年放置していました.最近ある程度時間ができ,また小型ディスプレイやカメラ等色々増えてきたので何かできないかと掘り出して使い始めました.Switch Scienceでいろいろ買う際についでにDisplay HAT Miniを購入したので,それを使おうとしたら想像以上に苦労しました...

使ったもの

RPi0WHなので必要電力は少なく(5V 150mA)なので電源を気にする必要なはないです.ただ,USBがOTG対応のMicro Bであり,またディスプレイポートがMini HDMIなのでそのあたりは集めるのに苦労します.今回は以前RPi0WH購入時に合わせて買ったものを使いました.

  • RPi0WH(当時¥1,500ぐらいだったと思います)
  • Micro SDカード(Amazonで5個まとめ買いしたものです)

  • MRS-MBH10BK(USB Micro BからUSBに変換するハブ,分解できそうという理由で選んだ記憶があります)

www.elecom.co.jp

  • ES-KB01X1(超小型キーボード,内蔵できそうとかという理由だった記憶が...)

  • Display HAT Mini(上記のようにSwitch Scienceで購入しました)

Display HAT Miniwww.switch-science.com
(以下詳細は後述)

OSのインストール

特にひねりはなく,Raspberry Pi Imagerを使ってRaspberry Pi OS 32bitをSDカードに書き込みました.昔と比べてだいぶ楽になりましたね...実際の操作方法等は調べれば出てくるのでそのあたりを参考にしてください.

実際の作業

実際に作業するのですが,普通の方法?ではうまくいかないです.いくつかあるのですが,理由としては以下のものがあります.

  • なぜかRaspberry Pi Zeroでディスプレイ用のコードをコンパイルすると画面が表示されない.以下で言及されています.当初出たエラーで調べました.

github.com

  • Display HAT Miniはいろいろなディスプレイに対応したライブラリ(「juj/ili9341」,以下にURLを添付します)ではなく,そこからフォークされたものを使う(なお販売元(Pimoroni)のサイトには元のライブライのリンクが貼ってあります).

github.com


このあたりの理解,確認が遅れたため手間取りました...

fbcp-ili9341をダウンロードしコンパイルする

さて,実際に作業を行うのですが,上記のようになぜかRPi0WHでコンパイルすると表示されません(バックライトは点きます).そのため上記のissuesの中であるように別のRaspberry Piコンパイルします(該当コメントは以下のものです).手元にRaspberry Pi 3 Model B(Model B+ではないです,以下RPi3B)があったのでそちらで作業します.

github.com

OSを書き込んだSDカードをRPi3Bに挿して起動する + 初期設定

Raspberry Pi 4や3 Model B+/Aとかでもいいとは思いますが,手元にあったのはRPi3Bだったのでこれを使いました.まず起動すると,初期設定等(SDカードの容量拡大等)行われますので,終わるまで待ちます.
軌道が終わった後「sudo apt update」と「sudo apt upgrade」を行いアップデートするか,画面右上に表示されるアップデート通知からアップデートしてください.その際はインターネットが必要なのでWifi等でインターネットにつなげてください.

SPIを有効化する

次にDisplay HAT Miniとの通信のためにSPIを有効化します.いつもの設定ソフトを以下のコマンドで開きます.

$ sudo raspi-config

コマンドを打つと以下の画面が表示されます.なお画面はSSHのものをスクショしています.

raspi-config初期画面

この画面の「Interface Options」を選択すると次の画面に遷移します.

raspi-config「Interface Options」画面

この画面の「SPI」を選択し,遷移した画面で「Yes」を選択します.

raspi-config「SPI」画面

設定が終わると次の画面が表示されるので「OK」で終了します.

raspi-config「SPI設定完了」画面

その後に最初の画面に戻るので「Finish」で終了します.

ライブラリーのコンパイル

今回使うライブラリはPimoroniが公開しているものになります.
github.com

ここに書いてある通り,作業していきます.まずは必要なソフト(cmake)をインストールします.

$ sudo apt-get install cmake

次にクローンするのですが,URLが異なります.Display HAT Mini用のブランチ(feature/pimoroni-display-hat-mini)があるのでそれをダウンロードします(なおGithub上のURLはそもそもフォークする前の「juj/ili9341」のURLなので注意してください).

$ cd ~
$ git clone -b feature/pimoroni-display-hat-mini https://github.com/pimoroni/fbcp-ili9341.git

次にコンパイル等行いますが,オプションについてはフォークする前のGithubにあるプルリクエスト(URLはPimoroniのサイトにあります)を参考にしますが,バックライト関係とDCポートのオプションも追加しておきます.

github.com

$ cd fbcp-ili9341
$ mkdir build
$ cd build
$ cmake .. -DPIMORONI_DISPLAY_HAT_MINI=ON -DSPI_BUS_CLOCK_DIVISOR=40 -DDISPLAY_BREAK_ASPECT_RATIO_WHEN_SCALING=ON -DBACKLIGHT_CONTROL=ON -DGPIO_TFT_DATA_CONTROL=9 -DGPIO_TFT_BACKLIGHT=13
$ make -j
/boot/config.txtの編集

これだけだとうまく表示できないので「/boot/config.txt」を編集します.参考はプルリクエスト中の以下のコメントです.
github.com

「/boot/config.txt」をテキストエディタでsudoを使って開き(自分は「nano」を使っているので「$ sudo nano /boot/config.txt」となります),以下の行をコメントアウトします.

...
# Enable DRM VC4 V3D driver
#dtoverlay=vc4-kms-v3d   ←この行をコメントアウトします
max_framebuffers=2
...

なお,HDMIを刺しているときにDisplay HAT Miniを使うとHDMIの画質になってしまう(解像度以上の画像になるため文字等読めない)のを防ぐために「/boot/config.txt」に以下の行を追加してもいいです.

hdmi_group=2
hdmi_mode=87
hdmi_cvt=320 240 60 1 0 0 0

なおGithubには「hdmi_force_hotplug=1」もするよう書いてありますが,書いた場合動かなかった気もします.自分はこれらの設定をせずに使っています.

これで設定が終わったので動かせるはずですが,Display HAT MiniはRPi0WHに取り付けたいのでRPi3Bには取り付けていないのでここで一度シャットダウンして,RPi0WHに挿しなおします.

RPi0WHへDisplay HAT Miniを取り付ける

電源をつける前にRPi0WHにDisplay HAT Miniを取り付けます.買ったときに六角の支柱が同封されていますが,この支柱に合わせた深さまで挿します.とても硬く,相当な力が必要でした...
実際にはソケットは最後まで刺さらず,写真のように少し隙間ができます.

RPi0WHにDisplay HAT Miniを指した様子

RPi0WHを起動してディスプレイを起動する

これらの準備が終わったら実際に電源をつけて表示させましょう.起動した後(RPi3BからRPi0WHにSDカードを刺しなおしても何も問題なく使えます),次のコマンドを打ってディスプレイを立ち上げます.

$ sudo /home/pi/fbcp-ili9341/build/fbcp-ili9341 &

ユーザ名が「pi」以外の場合は上記コマンドの「pi」をユーザ名に変えてください.
これで実際につくはずです.

起動したら常につくようにする

これだと毎回立ち上げないといけないので起動時に自動で実行するようにしましょう.「/etc/rc.local」にsudo権限で先ほど実行したコマンドを書き込みます.

sudo /home/pi/fbcp-ili9341/build/fbcp-ili9341 &

これで次の起動時から自動で画面が点くようになります.

RPi0WH起動時

最後に

いかがでしたか.実際に手順がわかると数分で終わるような作業ですが,実際には1日近くかかりました...やり方等はしっかりしてほしいですね...

Rock Pi 4A v1.4+Penta SATA HATによるNAS構築 Vol. 5 ~システム破損からの再セットアップ+OSアップデート~

こんにちは,HAVRMです.

前回,「Ubuntu Server 18.04」でインストールしたところHDDを認識でき,NASのセットアップを行ったところまで記事を書いていました.
havrm.hatenablog.com

その後,自動起動のcronを使って,いろいろプログラムを走らせていましたが,気づいたらシステムが強制終了しており,さらに再起動もできなくなっていました.
ということでシステムの復旧とついでにOSを「Ubuntu Server 20.04」,さらには「Ubuntu Server 22.04」へのアップデートを行います.

なお経験的に年度末にPCが壊れやすく,3年間使い倒したデザイナー用PC(性能はゲーミングPCと同じ)も壊れました.こちらはSSDの破損っぽいのでSSDを換装します(記事にするかもしれません).皆さんも年度末のこの忙しい時期ではありますが,データ等のバックアップをしっかりととるようにしてください.

再OSインストール

前々回の記事でも書いたように「Ubuntu Server 20.04」を直接インストールするとHDDを認識できません.
そのため,改めて「Ubuntu Server 18.04」を再インストールし,「do-release-upgrade」を使って「Ubuntu Server 20.04/22.04」にアップデートします.
Rock PiのようなSBCの場合,OSが破損した際に原因によってはOSが入っているSDカードにアクセスできなくなる事例があります.自分はこれまでRaspberry Pi 2で2枚,Raspberry Pi 3で1枚,Raspberry Pi 4で1枚それぞれ壊しています(泣).
まずはSDカードが生きているか確認します.Windowsに刺したところ,SDカードの認識とドライブの認識(Rock Piの場合4つにパーティションを区切っています)はできました.なので前回と同様に「balenaEtcher」で書き込みしようとしたところ,「Starting...」から全然進みません...
ということでSDカードは破損(詳しく言うと書き込み不可の状態で固定)したと考え,新しいSDカードに書き込むこととします.

SDカードの再選定

ちょうど破損した際,Amazonのタイムセールがあり,それなりに性能のいいSDカードも割引されていました.ということでBAFFALOのUHS-1対応の32GBのmicroSDHCのRMSD-032U11HA/Nを570円で購入しました.

これにインストールを行います.
インストール手順は前回と同じなので省略します.

初期設定

前回と同様にHDDを認識するのを確認し,初期設定を行っていきます.なお結果は前回と同じなので書かないです.また実行順番も少し変えています.

# HDDを認識しているか確認
$ sudo fdisk -l

# アップデートとアップグレード
$ sudo apt update
$ sudo apt -y upgrade

# 削除されているパッケージのインストール
$ sudo unminimize

# SSHサーバーのインストール
$ sudo apt install openssh-server

# SSHサーバーが起動しているか確認
$ sudo systemctl status ssh

Ubuntu Server 20.04」へのアップデート

「do-release-upgrade」の実行

ということで最低限の準備ができたので,OSのアップデートをやってみます.なおここではSSHでログインして行ってみました.

# OSのアップデート
$ sudo do-release-upgrade
Checking for a new Ubuntu release
...
Reading cache

Checking package manager

Continue running under SSH?

This session appears to be running under ssh. It is not recommended
to perform a upgrade over ssh currently because in case of failure it
is harder to recover.

If you continue, an additional ssh daemon will be started at port
'1022'.
Do you want to continue?

Continue [yN]

という感じで「SSHでやるのはお勧めしないよ~」と言われたのでおとなしくローカルでアクセスしてやります.
ということで一度SSHからログアウトし,ローカルでログインしなおしてから改めて行います.
ローカルでログインし,同様に「sudo do-release-upgrade」を実行します.自分の場合は約30分かかりました.途中で色々聞かれますが,基本「y」か適切なものを選択すれば大丈夫です.画面を動画で撮っているので,気が向いたら文字起こしして,本記事に貼っておきます.
最後に「rebootしてください」ときたら「y」で許可し,再起動を待てばいいです.ここでは結構待ちました...

何よりもまずHDDの確認

ともかくHDDを認識できないと話が進まないので確認します.SSHでログインしなおして...

# 母艦側でログイン
$ ssh rock@xxx.xxx.xxx.xxx
...

#ログイン成功,以下SSHのウインドウ
$ sudo fdisk -l
Disk /dev/ram0: 4 MiB, 4194304 bytes, 8192 sectors
...

Disk /dev/sda: 5.47 TiB, ...
Disk model: WDC WD60EZAZ-00S
...

ということで認識されました!!

また,「Ubuntu Server 22.04」へのアップデートも言われているのでついでにやっちゃいましょう(出てから1年近くたっているのでバグとかないよね...).
一度NASを構築するとHDDの認識に失敗したときにOSの起動ができなくなるのでNASの構築が終わる前にやっちゃいます.

Ubuntu Server 22.04」へのアップデート

「do-release-upgrade」の実行→失敗

改めてSSHからログアウトし,ローカルでログインしなおします.
また最初なのでアップデート・アップグレードを行っておきます.

# アップデートとアップグレード
$ sudo apt update
...

$ sudo apt -y upgrade
...

# OSのアップデート
$ sudo do-release-upgrade
...
Not enough free disk space

The upgrade has aborted. The upgrade needs a total of 193 M free
space on disk '/boot'. Please free at least an additional 128 M of
disk space on '/boot'. You can remove old kernels using 'sudo apt
autoremove' and you could also set COMPRESS=xz in
/etc/initramfs-tools/initramfs.conf to reduce the size of your
initramfs.

...

となり,「/boot」の容量不足でアップデートできませんでした
あらためて容量を確認してみるとそもそも「/boot」には193MB必要なのに100MBしか用意されてないです...

$ sudo df -lh
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/mmcblk0p4  100M   38M  62M  38% /boot
...

ということで詰みです...
この後デバイス上で容量拡大できないかとfdiskを使っていろいろやってみたところOSが起動しなくなりました(泣).
ということで「Ubuntu Server 18.04」のインストールから再試行です...

パーティションの確認

とりあえず,「Ubutnu Server 18.04」を再インストールし,SDカードのパーティションを確認すると次のようになっています.

$ sudo fdisk -l /dev/mmcblk0
...

Device           Start      End  Sectors  Size Type
/dev/mmcblk0p1      64     8063     8000  3.9M Linux filesystem
/dev/mmcblk0p2   16384    24575     8192    4M Linux filesystem
/dev/mmcblk0p3   24576    32767     8192    4M Linux filesystem
/dev/mmcblk0p4   32768   262143   229376  112M EFI System
/dev/mmcblk0p5  262144 xxxxxxx xxxxxxx xxxxG Linux filesystem

問題となる「/boot」は「/dev/mmcblk0p4」なので両側がパーティションで挟まれています.これだと「/dev/mmcblk0p4」を拡大するためには先に「/dev/mmcblk0p5」の前に空き容量を作る必要があります.

実際に拡張する方法

こういったパーティションの移動やサイズ変更等はUbuntuGUIアプリであるGPartedを使うのが簡単です(というよりパーティションの移動ができるのはこれだけ?).またOSをインストールしたSDカードをRock Piに刺して起動すると,「/dev/mmcblk0p5」が最後まで拡張されていました.そのためOSインストールした後,Rock Piに刺す前に別のUbuntuでSDカードを読み込み,GPartedで編集しようと考えました.この状態では「/dev/mmcblk0p5」は2GB程度しかありません.
しかし,「/dev/mmcblk0p5」の移動はできたものの,「/dev/mmcblk0p4」の拡張がうまくできず,増加分はそのままunallocatedとなり,Rock Pi側での認識でも容量は増えていませんでした.要するにパーティションの範囲は広がったけど,ファイル容量としては使えない状態のようです.
この後様々な試行錯誤とOSの再インストールを繰り返した結果,うまくいく方法を見つけたのでそれを記述します.
なおここでは「/boot」領域は112MBから512MBに拡張します.
また以下のサイトを参考にしました.
forum.odroid.com

成功した方法

まずは大まかな流れを書きます.

  1. Ubuntu Server 18.04」のSDカードへのインストール
  2. 別のUbuntu PCでGparted を使って「/dev/mmcblk0p5」を400MB分後ろに移動
  3. GPartedで「/dev/mmcblk0p4」の領域を増やす
  4. SDカードをRock Piに刺してアップデートと,フルインストールを行う
  5. SDカードをRock Piから抜き,改めて別のUbuntu PCに刺す
  6. SDカードの「/boot」に相当するデータをのバックアップを取る
  7. SDカードの「/dev/mmcblk0p4」をFAT16からFAT32でフォーマットする
  8. 「/dev/mmcblk0p4」にバックアップした「/boot」のデータを入れなおす
  9. SDカードをRock Piに刺しなおし,再起動する

ということで細かく見ていきます.

1. 「Ubuntu Server 18.04」のSDカードへのインストール

これはいつも通りにすればいいので省略します

2. 別のUbuntu PCでGparted を使って「/dev/mmcblk0p5」を400MB分後ろに移動

これについても方法は調べれば出てくるのでここでは省略します.というのも画面を動画で撮ってはいるものの画角や明るさが悪いため,掲載できないレベルだからです.また後程用意できたら掲載します.

3. GPartedで「/dev/mmcblk0p4」の領域を増やす

これについても通常通り後半にできた未フォーマット領域を「/dev/mmcblk0p4」に統合すればいいですが,この時GPartedはエラーを吐きます(なおエラー内容はよくわからないです...なんかサポートに連絡しろ的な感じ?).その結果,パーティションの範囲としては512MBあるものの,実際に使える範囲は112MBのままとなります.この時点ではこのままで大丈夫なので次に進みます.

4. SDカードをRock Piに刺してアップデートと,フルインストールを行う

これは前回に言ったことですが,「Ubuntu Server 18.04」のRock Pi 4用のイメージは最低限のソフトしか入っていない状態です.そのためそれをインストールする必要があります.

# アップデートとアップグレード
$ sudo apt update
$ sudo apt -y upgrade

# 削除されているパッケージのインストール
$ sudo unminimize

ここまで出来たら一度Rock Piをシャットダウンします.シャットダウンのコマンドは次の通りです.

$ sudo shutdown now

# or

$ sudo halt

下のは強制終了のものだったような気もしなくもないですが,シャットダウンできます.ただ,どちらでも様々なLEDやUSB機器へは電源が供給されっぱなしなので,しばらく時間をおいてから電源ごと引っこ抜きましょう.

5. SDカードをRock Piから抜き,改めて別のUbuntu PCに刺す

ここで改めでSDカードを抜き,別のUbuntu PCに刺します.

6. SDカードの「/boot」に相当するデータをのバックアップを取る

まずは「/boot」に当たる部分をマウントする必要があります.
GPartedでも何でもいいのでSDカードの認識名(「/dev/mmcblk0」等)を確認し,その4番目のパーティション(「/dev/mmcblk0p4」や「/dev/sdc4」等)を適当な箇所にマウントします.自分は「/media/<ユーザ名>/boot」にしました.
いかに実際のコマンドを書きます.なお自分は「Ubuntu 18.04.05 LTS」のLive USBで作業していたのでユーザ名は「ubuntu」となります.

# まずはマウントするフォルダを作ります
$ sudo mkdir /media/ubuntu/boot

# 対象のパーティションをマウントします.自分はUSB変換器を使ってつなげていたので「/dev/sdc4」となっていました
$ sudo mount /dev/sdc4 /media/ubuntu/boot

# 中身を.tar形式で保存します.おそらくオプションが大事ですが,追いきれてないです...
# なお参考にしたサイトの最後にあったほうを使っています
# これを実行すると実行している階層に「boot.tar」ファイルができ,これがバックアップとなります
$ find /media/ubuntu/boot -type f -printf "%P\n" | xargs tar cf boot.tar -C /media/ubuntu/boot
7. SDカードの「/dev/mmcblk0p4」をFAT16からFAT32でフォーマットする

参考ページにも書いてありますが,FAT16の場合制限がきつめなのでFAT32にフォーマットします.しかしそれによってデータが全部なくなります.

# 先にSDカードをアンマウントします
$ sudo umount /media/ubuntu/boot

# 実際にフォーマットします
# オプションは確認していませんが,パーティションの設定をきちんと保持していました
$ sudo mkfs.fat -F32 -v -I -n "boot" /dev/sdc4
8. 「/dev/mmcblk0p4」にバックアップした「/boot」のデータを入れなおす

改めてパーティションをマウントしなおし,データを改めて書き込みます.

# マウントします
$ sudo mount /dev/sdc4 /media/ubuntu/boot

# バックアップを展開し,貼り付けます
$ sudo tar -xvf boot.tar -C /media/joel/boot

# 作業が終わったら改めてアンマウントし,SDカードを取り出します
$ sudo umount /media/ubuntu/boot
9. SDカードをRock Piに刺しなおし,再起動する

SDカードをRock Piに刺しなおし,再起動します.起動後実際に領域が増えたか確認します.

# ファイル容量が増えたか確認
$ sudo df -lh
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/mmcblk0p4  511M   39M  473M   8% /boot
...

ということで容量が増えていることを確認できます.

上の順番の理由+失敗した方法

だいぶ複雑な方法になっているのは次の理由があります.

Rock Piに刺す前に「/dev/mmcblk0p4」をフォーマットをしない理由

先にフォーマットしてしまうと起動時に「/boot」が見つからず,また最初のアップグレードから「rockchip-fstab」がインストールできず,パーティションが見つからないとエラーを吐くためです.
領域を拡張しただけではこのエラーは起きないので,まずは拡張した領域を認識してもらって,後でその中身を書き換える方法になっています.

改めて「do-release-upgrade」の実行→成功

領域も拡張できたので改めて「do-release-upgrade」を実行します.今回は15分ほどで終わりました.

# OSのアップデート
$ sudo do-release-upgrade
...
# 何度か聞かれるので基本「y」で進めます

終わった後再起動していいか聞かれるのでそのまま再起動しましょう

HDDの確認

ということで改めでHDDを認識できるか確認します

$ sudo fdisk -l
Disk /dev/ram0: 4 MiB, 4194304 bytes, 8192 sectors
...

Disk /dev/sda: 5.46 TiB, ...
Disk model: WDC WD60EZAZ-00S
...

ということで認識できています!!

まとめ

とりあえずここで気力が尽きたのでここまでとします.
あとは前回と同様にNASのセットアップをしていくだけです.
「/boot」の容量不足の問題だけでせっかくの休日が丸一日潰れました(泣).
誰もやってないことをやるとこういうことが多々あります...
なお,Radxa(Rock Piのブランド名)のWikiには「Debianでこのバグは修正されているからDebianにしたら?」という回答しかなかったです(なおRock Pi 4ではなかったです)...

Rock Pi 4A v1.4+Penta SATA HATによるNAS構築 Vol. 4 ~HDDの認識とNASのセットアップ@Ubuntu Server 18.04~

こんにちは,HAVRMです.

前回は「Ubuntu Server 20.04」でHDDの認識に失敗したので,「Ubuntu Server 18.04」をインストールしなおし,再挑戦します.

前回↓
havrm.hatenablog.com

前回からの簡単な説明

組み立てが終わったのでHDDを認識しようとしたら,認識してくれませんでした.というのも公式で確認されているのは「Ubuntu Server 18.04」で,現在使っている「Ubuntu Server 20.04」は未確認だからです.ということで改めて「Ubuntu Server 18.04」でやり直していこうと思います.

初回↓
havrm.hatenablog.com

「Ubutnu Server 18.04」のイメージ作成

基本的には初回でやったのと同じようにインストールしていきます.

マイクロSDカードの取り外し

書き込むためにはマイクロSDカードを取り出す必要があります(Rock Pi 4AにはUSB3.0 OTGがあるのでRock Pi 4Aをライター代わりに使うこともできるのかもしれないです).ただすでにHATを取り付けたため,外すのは大変(やったことがある人はよくわかると思います)です.2×20のしっかりとはまったピンソケットは外す際にピンヘッダが曲がる可能性もあり,あまりやりたくはないです.
ということでマイクロSDカードをふさいでいるのはフラットケーブルなのでこれを外しちゃいましょう.ただ,HAT側のコネクタは内側にあるので,アクセスが大変(というより無理?)なので,PCIE2FPC側を外します.
第2回ででのコネクタのつなげ方の逆をやればいいので,バーを外して,コネクタを引っこ抜けばいいです.

第2回↓
havrm.hatenablog.com

実際にフラットケーブルを抜くとこのようになります.

フラットケーブルを抜いた様子

OSイメージのダウンロード

ということで,OSイメージを探したのですが,現在のダウンロードサイトを遡っても「Ubuntu Server 20.04」しかなく,「Ubuntu Server 18.04」がないです.改めて「rockpi 4B ubutnu 18.04」と調べると古いRadxaのホームページが見つかりました.

rockpi.eu

ちょうど当時のダウンロードページを引いたみたいで,「Ubuntu Server 18.04」がありました.念のためリンクを貼っておきます.クリックするとダウンロードが始まります.

Ubuntu Server 18.04

この時ダウンロードされるのは「rockpi4b-ubuntu-bionic-minimal-20190104_2101-gpt.img.gz」のみでした.

OSイメージのインストール

このファイルを「balenaEtcher」で指定し,OSを上書きします.この時ドライブが4つに分かれていますが,そのままドライブを選択すると全体に上書きしてくれました.

OSの起動とセットアップ

ということで,マイクロSDを挿しなおし,フラットケーブルも挿入しなおして起動します.あらかじめHDDは挿しておきます.

OSの起動

ここは初回と同じようにユーザ名とパスワードがともに「rock」です.ただ最初起動したときは画面がHDではなく,640×480で表示されていました.またSSHもインストールされていませんでした.さらにインジケータのRock Pi 4A上の青色LEDが全く光らず,調べてみましたが,光らせる方法が見つかりませんでした(泣).LEDを光らせるためにはあるファイルに状態等書く必要があるのですが,そのファイル自体がなく,お手上げです...
なお「Ubuntu Server 20.04」ではコマンドラインの「$」の前は初期状態で「rock@rockpi-4b」でしたが,「Ubuntu Server 18.04」の場合,「rock@linux」でした.

HDDを認識しているかの確認

これでHDDを認識できなかったらどうしようもないので,とりあえず「fdisk」で確認してみます.この時は3.5inchの6TBのHDDを挿入しています.
なおsudo実行時にパスワードを入力するための行については以降で表示しません.

$ sudo fdisk -l
Disk /dev/ram0: 4 MiB, 4194304 bytes, 8192 sectors
...

Disk /dev/sda: 5.5 TiB, xxxxxxxxxxxxxxxxxx bytes, xxxxxxxxxx sectors
Units: sectors of 1 * xxx = xxx bytes
Sector size (logical/physical): xxx bytes / xxx bytes
I/O size (minimum/optimal): xxx bytes / xxx bytes

Disk /dev/mmcblk0: xx.xx GiB, xxx bytes, xxx sectors
...

認識されました!!
これで安心して作業が進められます.

SSHのインストール

とはいえ,Rock Pi 4Aのコンソールで作業するのはコピー等できず,面倒なのでSSHをインストールします.

# 先にアップデート・アップグレードを行います
$ sudo apt update
...
$ sudo apt -y upgrade
...

# SSHをインストールします.
$ sudo apt install openssh-server
...

なおupdateの時,「PUBKEY」が違います等,複数のWarningが表示されましたが,Fatalではないので無視します.
インストール後はSSHが自動で起動するので,SSHでログインできることを確認し,「$ exit」でログアウトします.というのもこの後ユーザ名の変更を行うのでログインしたままだと変更できないからです.
なおこれ以降はSSHで作業しています.

ユーザ名・パスワードの変更

ということでユーザー名とパスワードを変更します.前回は新しいユーザを作って削除する方法でしたが,この時のオプションのせいか,次のような問題が起きてました.

  • 「Tab」や「↑」,「↓」が使えず,毎回同じコマンドを全部書かないといけない
  • 「$」の前に「ユーザ名」や「PC名」が表示されない.

ということで初回ブログでも紹介したブログを見ながらユーザ名を変更していきます.

nekodeki.com

まずは最初からある「rock」ユーザで設定変更用のユーザを作成します.

# まず設定変更用のユーザ(tester)を作成します
$ sudo useradd -m tester

# このユーザにsudo権限を与えます
$ sudo usermod -G sudo tester

#このユーザのパスワードを指定します
$ sudo passwd tester
Enter new UNIX password: <testerのパスワード>
Retype new UNIX password: <testerのパスワード>
passwd: password updated successfully

# ログアウトします.
$ exit

次に作成したユーザ「tester」で「rock」ユーザを変更していきます.ということで「tester」でログインしなおし

# ユーザ名を変更します
$ sudo usermod -l <新しいユーザー名> rock

# ユーザ名が変更されたか確認します
$ cat /etc/passwd
root ...
...
tester:x:1001:1001::/home/tester:/bin/sh   # ←今ログインしているユーザ
<新しいユーザ名>:x:1000:1000:ROCK Pi,912,,:/home/rock:/bin/bash
# ↑「rock」から変更したユーザ

# ホームディレクトリの位置を新しいユーザ名に変更します
$ sudo usermod -d /home/<新しいユーザ名> -m <新しいユーザ名>

# ホームディレクトリが変更されたことを確認します
$ cat /etc/passwd
root ...
...
tester:x:1001:1001::/home/tester:/bin/sh
<新しいユーザ名>:x:1000:1000:ROCK Pi,912,,:/home/<新しいユーザ名>:/bin/bash
# ↑「/home/rock」から変更されました

# パスワードも変更します
$ sudo passwd <新しいユーザ名>
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

# ユーザに関するコメントを「新しいユーザ名」に変更します
$ sudo usermod -c <新しいユーザ名> <新しいユーザ名>

# 変更されたことを確認します
$ cat /etc/passwd
root ..
...
tester:x:1001:1001::/home/tester:/bin/sh
<新しいユーザ名>:x:1000:1000:<新しいユーザ名>:/home/<新しいユーザ名>:/bin/bash
# ↑「ROCK PI」から変更されました

# 変更したユーザにsudo権限を与えます
$ sudo usermod -G sudo <新しいユーザ名>

# ログアウトします
$ exit

ということで新しいユーザ名に変更できました.
では設定用に作った「tester」ユーザを削除しましょう.新しいユーザでログインしなおし,

# まずは新しいユーザでsudo権限が実行できるか見ます
$ sudo apt update
...

# 「tester」ユーザを削除します
$ sudo userdel -r tester
userdel: tester mail spool (/var/mail/tester) not found

ということでユーザ名についての変更は完了です.きちんと「Tab」や「↑」,「↓」も使えて満足です.

削除されているパッケージのインストール

SSHでログインした際に次のようなメッセージが表示されていました.

Welcome to Ubuntu 18.04.6 LTS (GNU/Linux 4.4.154-59-rockchip-xxxxxxxx aarch64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, you can run the 'unminimize' command.

どうやら必要最低限しか事前インストールされておらず,「unminimize」コマンドで標準搭載されているコマンドをインストールしてくれるようです.

最初にいろいろ注意書きがあり,「続けますか」と聞かれるので「y」を入力して実行します.

$ sudo unminimize
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

This script restores content and packages that are found on a default
Ubuntu server system in order to make this system more suitable for
interactive use.

Reinstallation of packages may fail due to changes to the system
configuration, the presence of third-party packages, or for other
reasons.

This operation may take some time.

Would you like to continue? [y/N] y

Re-enabling installation of all documentation in dpkg...
Updating package list and upgrading packages...
Hit ...
...

これにはおよそ8分半かかりました.何度か「apt-get」を繰り返していたようです.

HDDの初期化とマウント

ということで初期セットアップが終わったのでNASの構築に移ります.ただHDDは新品でパーティションも何もないのでHDDの初期化から始める必要があります.
なお今回使ったHDDは次のものです.

HDDの初期化

「fdisk」コマンドでも初期化はできますが,2TB以上はできません.そのため「gdisk」を使います.参考にしたサイトは↓です.

www.nemotos.net
www.nemotos.net

ということでHDDの全体をNTFS(HDDの標準フォーマット)にフォーマットします

# 改めてHDDのディスク名を確認します.
$ sudo fdisk -l
Disk /dev/ram0: 4 MiB, 4194304 bytes, 8192 sectors
...

Disk /dev/sda: 5.5 TiB, xxxxxxxxxxxxxxxxxx bytes, xxxxxxxxxx sectors
Units: sectors of 1 * xxx = xxx bytes
Sector size (logical/physical): xxx bytes / xxx bytes
I/O size (minimum/optimal): xxx bytes / xxx bytes

Disk /dev/mmcblk0: xx.xx GiB, xxx bytes, xxx sectors
...

# HDDのディスク名「/dev/sda」に対し作業を行います
$ sudo gdisk /dev/sda
GPT fdisk (gdisk) version 1.0.3

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries.

# 記事にある通り,パーティションを「n」で作成します
# 特にいじることもないのでそのまま「Enter」で進みます
Command (? for help): n
Partition number (1-128, default 1):
First sector (34-11721045134, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-11721045134, default = 11721045134) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'

# 次にパーティションテーブルを確認します
Command (? for help): p
Disk /dev/sda: xxxxxxxxxxxxx sectors, 5.5 TiB
Model: WDC WD60EZAZ-00S
Sector size (logical/physical): xxx/xxx bytes
Disk identifier (GUID): xxxxxxxxxxxxxxxxxxxxxxx
Partition table holds up to xxx entries
Main partition table begins at sector xx and ends at sector xx
First usable sector is xx, last usable sector is xxxxxxxx
Partitions will be aligned on xxxxxxxxx boundaries
Total free space is xxxx sectors (xxxxx KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            xxxx     xxxxxxxxxx   5.5 TiB     8300  Linux filesystem

# 最後に書き込みます
# 途中で確認されるので「Y」を入力します
Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sda.
The operation has completed successfully.

# ちゃんとパーティションが作られたか確認します
$ sudo fdisk -l
Disk /dev/ram0: 4 MiB, 4194304 bytes, 8192 sectors
...

Disk /dev/sda: 5.5 TiB, xxxxxxxxxxxxxxxxxx bytes, xxxxxxxxxx sectors
Units: sectors of 1 * xxx = xxx bytes
Sector size (logical/physical): xxx bytes / xxx bytes
I/O size (minimum/optimal): xxx bytes / xxx bytes
Disklabel type: gpt
Disk identifier: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Device     Start         End     Sectors  Size Type
/dev/sda1   xxxx xxxxxxxxxxx  5.5T Linux filesystem


Disk /dev/mmcblk0: xx.xx GiB, xxx bytes, xxx sectors
...

# /dev/sda1ができていることを確認しました
# これをNTFSにフォーマットします
# 「-Q」でクイックフォーマットにしないと
# とても時間がかかりそうでした
$ sudo mkfs.ntfs -Q -L rockhdd-1 /dev/sda1
Cluster size has been automatically set to xxxx bytes.
Creating NTFS volume structures.
mkntfs completed successfully. Have a nice day.

# ちゃんとNTFSにフォーマットされているか確認します
$ sudo parted -l
Model: ATA WDC WD60EZAZ-00S (scsi)
Disk /dev/sda: 6001GB
Sector size (logical/physical): xxxB/xxxxB
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name              Flags
 1      xxxxkB  6001GB  6001GB  ntfs         Linux filesystem


Model: SD SD64G (sd/mmc)
...

ということでHDDを初期化し,NTFSのフォーマットすることができました.

HDDのマウント

今の状態ではHDDの認識はしていても,マウントしてないのでファイルにアクセスできない状態です.そこでシステム上に専用のフォルダを作成し,マウントします.
通常,マウントファイルは「/mnt」下に置きます.

なおここからはNAS化の作業に当たり,これ以降のNASのセットアップも合わせて以下のサイトを参考にしています.
piro.sakura.ne.jp

# 「/mnt」直下に専用のフォルダを作成する
# ここでは「rockhdd-1」としていますがなんでもいいです
$ sudo mkdir -p /mnt/rockhdd-1

# マウントしたい領域のUUID(固有ID)を調べる
$ sudo blkid
...
/dev/sda1: LABEL="rockhdd-1" UUID="xxxxxxxxxxx" TYPE="ntfs" ...
...

# 自動でマウントするよう設定する
# 自分は普段テキストエディタとして「nano」を使用しています
$ sudo nano /etc/fstab

# 以下の行を追加
UUID=xxxxxxxxxxx /mnt/rockhdd-1 ntfs defaults 0 0

# マウントしてみる
$ sudo mount -a

# きちんとマウントできたか確認する
$ df -h --total
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/sda1       5.5T  xxxx  5.5T   x% /mnt/rockhdd-1
...

ということで無事マウントできました.

Sambaとネットワークのセットアップ

Sambaとは

SambaとはNASを構築できるソフトです.Linuxで広く使われており,商品としてのNASに搭載されていることもあります.

Sambaのインストールと設定

これは「Ubuntu Server 18.04」の標準にはないのでインストールする必要があります.
その後セットアップまで行っちゃいます.

ここでは上記のサイトに加え,以下のサイトも参考にしています.
www.yamamo10.jp

# インストールします
$ sudo apt install samba
...

# Samba用のアカウント(アクセスできるアカウント)を設定します
# これはすでにあるユーザ名じゃないといけないらしいです
# ここではユーザ名を「UUUU」にします
# またログイン用のパスワードも設定します
$ sudo smbpasswd -a UUUU
New SMB password: <パスワード>
Retype new SMB password: <パスワード>
Added user UUUU

# 設定を行います.
$ sudo nano /etc/samba/smb.conf

# 次の行を最後に追加します
# 「[hoge]」が表示される名前になるはずです
# この設定だと,「UUUU」でログインすれば,フルアクセスできるという状態です
[rockhdd-1]
path = /mnt/rockhdd-1
guest ok = no
read only = no
writable = yes
create mask = 0666
directory mask = 0777
browseable = yes
valid users = UUUU

# 構文があっているか確認します
# 自分は「syslog」に注意が表示されたけど,編集した箇所じゃないので無視しました
$ testparm
...

# Sambaの再起動
$ sudo service smbd restart

# Smabaの状態の確認
$ service smbd status
● smbd.service - Samba SMB Daemon
  Loaded: ...
  Active: active (running) ...
...

ということでSambaのセットアップを行い,実際に動かしました.
Windowsで接続する場合は,もしこのRock Pi 4AのIPアドレスが「192.168.11.32」であれば
「\\192.168.11.32」
エクスプローラーの検索に書き込むとアクセスできます.

エクスプローラーで表示した様子

この後,設定した「rockhdd-1」を開こうとすると次のようなログイン画面が表示されます.

ログイン画面

ここで先ほど設定したSambaのユーザ名とパスワードを入力するとアクセスできます.この画面の下にある「資格情報を記憶する」にチェックを入れておくと次回からはこの画面なしでアクセスできます.

IPアドレスを固定する

このままでも使う時に問題はないですが,もし次起動したときIPアドレスが変わると,何らかの方法で確認することになります.そこでこういったサーバについてはIPアドレスを固定することが多いです.通常は「/etc/network/interface」下にあるファイルを書き換えて設定しますが,Rock Pi 4Aの場合は「nmtui」で設定します.

参考サイト↓
forum.radxa.com

nmtuiを実行します

$ sudo nmtui

nmtuiを実行すると次のような画面に切り替わります(SSHであっても).なお画面自体はWindowsのWSL上でSSHをしているものをスクショしています.

nmtui起動画面

赤背景になっているのが選択中のものになります.今回は接続の設定を変えたいので「Edit a connection」を選択(Enter)します.
そうするとこのような画面になります.

接続選択画面

現在このデバイスには有線接続しかないのでこのまま「Wired connection 1」を編集します.選択は矢印キーで移動しますが,「<Add>」→「<Edit...>」→「<Delete>」の順で選択されます.なので「<Edit...>」に移動し,選択するとこのような画面になります.

編集画面

いろいろ設定できるのですが,今回はIPv4のアドレス(xxx.xxx.xxx.xxxのもの)を編集します.ただこの状態だと中身が見えないので「IPv4 CONFIGURATION <Automatic>」と同じ行にある「<Show>」を選択します.そうすると実際の情報が表示されます.

設定表示

ということで上から順に設定していきます.
まず「<Automatic>」から「<Manual>」に変更します.これは選択式なので「<Automatic>」を選択すると候補が出てくるので「<Manual>」を選びます.
次に「Addresses」に好きな値を入れます.とはいってもルールがあるので,ここは現在つながっているIPアドレスにします.もし,今のIPアドレスが「192.168.11.32」だった場合,「192.168.11.32/24」と最後に「/24」を追加して入力します.
次に「Gateway」と「DNS servers」ですが,基本はルータのIPアドレスでいいです.いろいろいじくりまわしている人はわかると思うので省きますが,通常は今のIPアドレスの最後の桁を「1」にすればOKです.なので今回の場合は「192.168.11.1」となります.
実際に入力するとこのようになります.

設定後

このまま下の「<OK>」を選択すると前の画面に戻るので下にある「<Back>」で最初の画面に,その画面の「<Quit>」で終了します.そうすると元のターミナル画面に戻ります.最後は設定を反映させるためネットワークを再起動します.ただコマンドを間違えたのか再起動できなかったので私はRock Pi 4Aごと再起動しました.

# 「-r」オプションで再起動になります
$ sudo shutdown -r now

再起動後も同じIPアドレスになっていることを確認したら完了です.

まとめ

ということでHDDの認識からSambaの実行まで行いました.実際にファイル転送等してみましたが,Rock Pi 4Aの温度はヒートシンク・ファンなしの状態で45~55℃の範囲で推移していました.室温がとても低い(15℃程度)というのもあると思いますが,思ったほど発熱していない状況です.ファンとヒートシンクのめどもついたのでケースを作ります.それについても記事にします.
OSについてはUbuntu Server 18.04のサポート期限が2023年4月までなのでまだ大丈夫ですが,そのうち20.04にアップグレードしないといけないです.新しいイメージで入れなおすと認識しないので,この状態で「do-release-upgrade」でアップグレードしてみたいと思います.以前RPi2をUbuntu 14.04から16.04にアップグレードした際もそれでうまくいった記憶があるので,そのうち挑戦したいと思います.とりあえずはPCの容量表示が真っ赤なので青色に戻るまでデータを移行します...