Jetson Nano開発メモ
#earthMetronome の構想を練ったり、壁打ちしてもらったり、この状況下(2020年5月)でも新しいことを始めている人々を手伝ったりしていたら、
安くてフレキシブルなプラットフォームでアプライアンスを作ってみたい
という願望がふつふつと。ソフトウェアエンジニアなのでソフトウェアは万能!信者なんだけど、でも専用ハードウェアを用意しないとできない・使いにくい事例を目の当たりにしたのです。つまり、PCやスマホ標準の内蔵・外付けデバイスでは限界がある、と。
世の中そんなワガママを実現させてくれるプラットフォームが、じつはいくつもありますが、Arduino系はいかにネットを足しても力不足、Raspberry Piはよく知ってるプラットフォームだけど限界も見えてきていた、のでハイパワーを求める開発者の中で今後主流になりそうなこれ "Jetson Nano" を使ってプロトタイプしてみることにしました。
前置きという言い訳w
開発メモです。万人のためのものではありませんぬ。Webページ切り貼りだらけになりそうだし。そしてコードまみれになります。ゴメンナサイ。詰まんないですきっと。
で。何つくるの?
まだ内緒だよーん。つか、できるかどうかまだ確証がもてないので。
じゃあ、どの辺いじるの?
カーネルw まあ実際にはデバイスドライバですね。なので必然的にカーネルソースやらドライバのソースをいじったり足したり、コンパイルしたりデバッグしたり、です。
あんたほんとにソフトウェアエンジニア!?
ですよーw。まあだいぶカビが生えてますが、その昔は、ってもう四半世紀前ですが、まともな商用ソフトウェア開発するには、ハードウェア・PCを知り尽くしていないとできない時代があったのです。カーネルとかドライバとかファームウェアはその辺の時代からいじり倒して、実際に開発してきました。
最近でこそバックエンドとかフロントエンドとか、Web系の仕事が多かったですが、根っこはデバイスドライバとかの超ローレベルの開発です。デバイスドライバ・ファームウェアからWebフロントエンドまでの「フルスタック」ですよ。
必要なもの
開発メモですからねー。主に読むのはきっと未来の自分。なので必要としたものをリストアップ。
Jetson Nano
割とどこでも買えますが、どこで買ったか忘れたよw Amazonだったかな。でもAmazonだとPrime対応でもいくつもあってかつ値段がばらばらなので、秋月のリンク。
この時点で最新のRaspberry Pi 4が6,000円ちょっと超えるくらいなので、だいたいその倍くらいですね。あ、5VのUSB micro B電源も一緒に。3Aあればうごきますが、スマホ用は2.1Aまでのが多いので。
これは筆者が使っているものそのものです。容量的には問題ありません。
64GB以上のmicro SDXCカード
たいていこの手のデバイスでは32GBの買うと十分なのですが、カーネルをビルドしだすと状況が違ってきます。実際32GBの買って、スワップファイルをオン(6GB)にしてビルドしたら、「残り800MBしかないよっ!」って叱られました。なので、今は128GBのを使っています。
なるべく速いのを買ってください。作業性が違います。 micro SDXC class 10 UHC-I U3 V30 とかがお勧めです。4K録画可能、とかいうやつ。
USBマウス・キーボード・HDMI液晶モニター
まあ何でもいいです。キーアサインはもちろん変えられますが、筆者は古い人間なので英語キーボードです。
USBシリアル変換アダプタ
Jetson NanoのブートイメージをインストールしてUbuntu立ち上げたら、ありゃりゃブートメッセージが見えない。つかそもそもブート追っかける可能性が高いし!となるとカーネルが起動時に出すメッセージはシリアルコンソールがないと見えません。
もちろんシリアル「端末」がもしまだあればw 直接つなげばいいんですが(レベル変換は必要)、まあPCからアクセスしたよね?ってことでこれを。
いわゆる"RS232C"用のDサブコネクタがついてる奴は買っちゃダメです。RS232Cってのがその昔の「シリアル」インターフェースなんだけど、今時のとは電圧レベルがちがうので。これは必要なケーブルもついてるのでお勧め。USB端子が遠ければ、延長ケーブルも必要かも。
つなげ方はこちら。Jetson Nanoのシリアル接続は、Rasberry Pi 互換の40ピンコネクタではなくて、亀の子になってる子亀のほうのボードのうらっかわにあります。GND / TXD / RXDの3つの線を繋ぐだけ。
シリアルターミナルエミュレータ
そのシリアルインターフェースからのテキストデータを表示したり入力したりするためのコンソール「プログラム」も必要です。歴史的にw 「ターミナルエミュレータ」という名前です。これはいっぱい種類あるので、それぞれお使いのPC / Mac にあるものを使ってください。Windows 10ではOS標準のシリアルターミナルプログラム「ハイパーターミナル」はなくなっちゃいました。昔はあったんだけどね。お世話になったなあ。
筆者は、全部 Windows 上の Linux (Ubuntu) - Windows Subsystem for Linux、通称WSL環境で作業したかったので、minicom を使っています。
takua@takuadev1 :~$ sudo apt-get install minicom
takua@takuadev1 :~$ minicom -b 115200 -D /dev/ttyS<ポート番号>
とかだったかな。こんな感じ。
で、実際にセットアップしてカーネルビルドを始めたら、
「熱い!」
ということに気づきました。パワフルなCPUなので、結構発熱します。デバイスが熱くなるのはかわいそうで嫌いなので、
4cm ミニファン
をヒートシンクにくっつけました。パソコン自作用として売られているこういうのが使えます。コネクタもそのままJetson Nano上の専用コネクタにささります。まあ筆者は転がってるファンで自作しましたがw
12V用で、Jetson Nanoからは5Vしか供給されませんが、まあ静かに回ってくれるので十分です。
ヒートシンクにはちょうどいい位置に穴が開いてますが、ねじ穴が切られていません。皆さん苦労しているようですが、私は3mmネジ用のタップでヒートシンクにねじを切ってM3ねじでくっつけています。こういうプロトって作るときはM3ねじ+ナットを多用しますが、板厚があるときはタップのほうが便利です。まあアルミ板にタップ切ってあると、なんどかネジ止め繰り返すとバカになりますが。
開発環境全景w
Jetson Nanoのセットアップ
このページから SD Image をダウンロードして、 balenaEtcher とかでSDカードリーダを使ってmicro SDXCカードにイメージコピーします。
カーネルコンパイルで疲労困憊る!
単なるダジャレが言いたかっただけです。カーネルのビルド手順は、だいたいこのサイトのままやってますが、
最新 Jetson Nano ではカーネルソースの場所とか変わっていますので、ここで該当するバージョンを探してください。
"4.2"は日付なのかな。上記のSDイメージのリリースが4.2だったので、それをダウンロードしました。あとは、上記Qiitaのサイトとだいたい同じです(ファイル名とかは若干変わってますが...)。
いじる前に!
で、カーネルやドライバのコードが無事Jetson Nano上に展開されたことと思います。となるとあとはコンフィグいじったり、コード書き換えたりしてビルドーインストールーデバッグ、の手順となりますが、その前に!まず「何もいじらないで」ビルドしてインストールして起動してみましょう。
筆者も上記Qiitaのサイトの「古い」カーネルソースを引っ張ってきてビルドして、カーネル書き換えて起動したら、ありゃ!起動しない!よくよく見るとこの記事は1年前だった!ということで最新ソースを持ってきて今まさにビルド中。でビルド時間かかるのでこれを書いてます(爆)。
なのでいじってその際のもろもろは、また次号!?かな。こうご期待!
おまけ
おお、自前ビルドカーネルで無事起動!w
U-Boot 2016.07-g45dfa3dff4 (Apr 08 2020 - 18:04:08 -0700)
TEGRA210
Model: NVIDIA P3450-Porg
Board: NVIDIA P3450-PORG
DRAM: 4 GiB
MMC: Tegra SD/MMC: 0, Tegra SD/MMC: 1
SF: Detected MX25U3235F with page size 256 Bytes, erase size 4 KiB, total 4 MiB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: No ethernet found.
Hit any key to stop autoboot: 0
switch to partitions #0, OK
mmc1 is current device
Scanning mmc 1:1...
Found /boot/extlinux/extlinux.conf
Retrieving file: /boot/extlinux/extlinux.conf
733 bytes read in 113 ms (5.9 KiB/s)
1: primary kernel
Retrieving file: /boot/initrd
5487746 bytes read in 291 ms (18 MiB/s)
Retrieving file: /boot/Image
34527240 bytes read in 1543 ms (21.3 MiB/s) **** ここに注目
append: tegraid=21.1.2.0.0 ddr_die=4096M@2048M section=512M memtype=0 vpr_resize usb_port_owner_info=0 lane_owner_info=t
## Flattened Device Tree blob at 83100000
Booting using the fdt blob at 0x83100000
reserving fdt memory region: addr=80000000 size=20000
Using Device Tree in place at 0000000083100000, end 00000000831777ed
Starting kernel ...
[ 1.094510] tegradc tegradc.1: dpd enable lookup fail:-19
[ 1.255398] imx219 7-0010: imx219_board_setup: error during i2c read probe (-121)
[ 1.255431] imx219 7-0010: board setup failed
[ 1.279241] imx219 8-0010: imx219_board_setup: error during i2c read probe (-121)
[ 1.279270] imx219 8-0010: board setup failed
[ 2.031767] cgroup: cgroup2: unknown option "nsdelegate"
[ 4.376541] random: crng init done
[ 4.379972] random: 7 urandom warning(s) missed due to ratelimiting
[ 5.272039] using random self ethernet address
[ 5.278270] using random host ethernet address
[ 5.942036] using random self ethernet address
[ 5.953877] using random host ethernet address
Ubuntu 18.04.4 LTS jetsonnano ttyS0
jetsonnano login:
「ここに注目」のところでカーネルを読み込んでますが、ここで出てきたサイズがさっきビルドした Image ファイルのサイズになってればOK。ファイルのタイムスタンプが出るといいのになあ。
次号はいつかなーw