見出し画像

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<ポート番号>

とかだったかな。こんな感じ。

画像1

で、実際にセットアップしてカーネルビルドを始めたら、

「熱い!」

ということに気づきました。パワフルなCPUなので、結構発熱します。デバイスが熱くなるのはかわいそうで嫌いなので、

4cm ミニファン

をヒートシンクにくっつけました。パソコン自作用として売られているこういうのが使えます。コネクタもそのままJetson Nano上の専用コネクタにささります。まあ筆者は転がってるファンで自作しましたがw

12V用で、Jetson Nanoからは5Vしか供給されませんが、まあ静かに回ってくれるので十分です。

ヒートシンクにはちょうどいい位置に穴が開いてますが、ねじ穴が切られていません。皆さん苦労しているようですが、私は3mmネジ用のタップでヒートシンクにねじを切ってM3ねじでくっつけています。こういうプロトって作るときはM3ねじ+ナットを多用しますが、板厚があるときはタップのほうが便利です。まあアルミ板にタップ切ってあると、なんどかネジ止め繰り返すとバカになりますが。

開発環境全景w

画像2

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

サポート Welcome! いただいたサポートは今後の研究開発や寄付に使わせていただきます。