ラズパイをJetson Nanoのサブボードとして使いたい
久しぶりに、ちょっとマニアックな電子工作ネタを書いてみます。みなさん、Jetson Nano使っていますか?Jetson Nano便利ですよね。ただ、Jetson Nanoですが、自分の場合以下のようなケースで困ることがあります。
- 重いディープラーニングと、リアルタイム性必要な処理を同時に走らせるときに負荷分散したい
- 標準でアナログオーディオ出力※がないので、オーディオが必要なアプリを作りづらい
そんなときに良いなと思ったのが、Jetson Nanoとラズパイの組み合わせです。ラズパイならオーディオ出力含めた、豊富な入出力がありますし、かなりの計算能力があり負荷分散も可能です。
特に、Jetson Nanoとラズパイは、ピンコンパチなので、Jetson Nanoから電源供給してシリアル通信すれば、Jetson Nanoのサブボードとして使えそうです。Jetson Nanoとラズパイの組み合わせは、かなり便利そうですね。
もちろん通信だけなら、Ether経由でもできるのですが、直接コンパクトに接続できる点は、シリアル通信の利点だと思います。今回の内容は、半田付け無しで簡単に接続できるので、初心者にもオススメの内容となっています。
なお、本文の最後に記載していますが、私の環境ではJetson Nanoからラズパイに電源供給した際は、Jetson Nanoでディープラーニング等の重い計算処理を走らせるとシリアル通信が正しくできない問題が発生しました。その場合は、ラズパイの電源を外部から供給することで解決できます。
追記 ※Jetson Nano、HDMI経由のオーディオ出力は可能です。HDMIアダプター等を使えば、オーディオ信号を取り出すことは可能です。具体的な周辺機器に関しては、以下記事を参照下さい。
ハードウェアのセットアップに関して
Jetson Nanoとラズパイ(Raspberry Pi)のハードウェアのセットアップに関して
Jetson NanoとラズパイはRaspberry Pi4を使用しました。
それぞれのハードウェアの購入先、セットアップ方法は以下記事を参照下さい。セットアップ記事では、ディープラーニングの環境構築まで説明していますが、この記事に関しては、それぞれ起動するところまでセットアップすればOKです。
イメージは以下を使用しています。
- Jetson Nano: JetPack 4.2.2
- Raspberry Pi 4: Raspbian Buster with desktop 2019-09-26
それぞれ、他のバージョンのイメージでも基本的には問題ないと思います。
ラズパイのハードウェアに関しては、後述しますが、ラズパイ3だとシリアル関係でハマりどころがあるので注意して下さい。
Jetson Nanoとラズパイの接続方法
Jetson Nanoとラズパイの接続方法は、以下の図の通りジャンパワイヤで接続するだけです。
ジャンパワイヤは、以下のようなメス-メスのものが使用できます。
接続するピンは、以下の通りです。
Jetson Nano | ラズパイ |
---|---|
2pin(5V) | 2pin(5V) |
6pin(GND) | 6pin(GND) |
8pin(UART TX) | 10pin(UART RX) |
10pin(UART RX) | 8pin(UART TX) |
UARTは送信(TX)と受信(RX)が入れ替わるのに注意して下さい。
また、ラズパイの電源をJetson Nanoから供給せずに別電源とする場合(5Vを繋がない場合)でも、電位を合わせるためにGNDは接続するようにして下さい。
Jetson Nanoとラズパイのピン配置に関しては以下が見やすいです。
NVIDIA Jetson Nano J41 Header Pinout - JetsonHacks
Jetson Nanoとラズパイのソフトウェア設定
Jetson Nano側の設定
Jetson Nanoでシリアルを使うために、以下コマンドを実行します。詳細に関しては、Jetson Nano – UARTのページを参照下さい。
$ systemctl stop nvgetty
$ systemctl disable nvgetty
$ udevadm trigger
$ sudo apt-get install python3-serial
シリアルポートは、/dev/ttyTHS1
になります。書き込み権限が必要なので、起動のたびに以下コマンドで実行権限を与える必要があります。
$ sudo chmod 666 /dev/ttyTHS1
毎回実行するのが面倒くさい場合は、udevを設定して下さい。以下コマンドで設定できます。
$ wget https://raw.githubusercontent.com/karaage0703/jetson-nano-tools/master/udev_rules/55-tegraserial.rules
$ sudo mv 55-tegraserial.rules /etc/udev/rules.d/
udevについて詳しく知りたい人は、「udev rules」などで検索してみて下さい。Linuxで複数のUSBデバイスやシリアルデバイスを使うときに便利な仕組みです。
Raspberry Pi側の設定
以下コマンドでRaspi-configを起動します。
$ sudo raspi-config
以下の通りUARTをEnableにします。
5 Interfacing-Option -> P6 Serial -> Enable
続いて/boot/cmdline.txt
のconsole=serial0,115200
を削除します。
シリアルポートは、/dev/serial0
になります。
シリアル通信実行
通信の受け手側(今回はRaspberry Pi)で以下のコマンドを実行します。
$ wget https://raw.githubusercontent.com/karaage0703/jetson-nano-tools/master/scripts/uart_recieve.py $ python3 uart_recieve.py
送信側(今回はJetson Nano)で以下コマンド実行します。
$ wget https://raw.githubusercontent.com/karaage0703/jetson-nano-tools/master/scripts/uart_send.py $ python3 uart_send.py
Raspberry Pi側のターミナルに b'test'
と表示されたら、正しくJetson NanoとRaspberry Piが通信できています。
シリアルデバイス名を修正すれば、受信側と送信側を入れ替えても同じことができると思います。
うまく動かないとき(ハードウェアデバッグ)
うまく動かないときは、ソフトウェア、ハードウェア両面でのデバッグが必要となります。以下記事を参考にデバッグにチャレンジしてみて下さい。
ちなみに、私の場合はJetson Nanoでディープラーニングをしているときにだけ、シリアル通信がうまく動かないという問題がありました。Jetson Nanoの通信波形をロジアナやオシロで確認したのですが、問題無かったので絶望していたのですが、もしやと思ってラズパイの電源を、Jetson Nanoからの供給から、別電源に切り替えたら解決しました。ずっと通信を疑っていたら解決できなかったと思います。こういう問題の切り分けに、測定器は非常に便利です。
まとめ
ラズパイとJetson Nanoの組み合わせて使う方法を紹介しました。電源供給から通信までできると、色々できることの組み合わせが広がりそうですね。今回は、説明しきれませんでしたが、通信に関しては「ラズパイ x ラズパイ」「Jetson Nano x Jetson Nano」といった組み合わせにも応用できると思います。ちなみにArduinoとの組み合わせだと、電圧が異なるためレベル変換が必要となるため、USB経由でのシリアル通信が手軽でオススメです(過去にコチラに記事を書いています)
今後、この組み合わせだからできるアプリケーションも紹介していきたいなと思います。
最後に、便利なこれらマイコンを解説した本「Jetson Nano超入門」を書いたり、「ラズパイマガジン」に寄稿していますので。この記事に興味を持った方、役に立ったという方は、よければこちらも是非ご覧になって下さい!
【国内正規代理店版】Raspberry Pi 4 Model B/4GB OKdo版【技適マーク付】
- メディア: Personal Computers
参考リンク
Jetson Nano - UART - JetsonHacks
Rubyを使ってRaspberry Pi3でシリアル通信(UART通信)をする - mcommit's message
関連記事
変更履歴
- 2020/01/27 オーディオ出力に関して、修正と追記