前回、AI業界の “Hello World!” である MNISTをやってしまったので、遅ればせながらマイコン業界の “Hello World!”である Lチカを Jetson Nanoにもやっていただくことにいたしました。128個のCUDAコアをもつJetson Nanoには恐れ多い仕事ですが、エッジでAI狙いのJetsonですからIOくらい制御していただいても文句は言いますまい。
最初に失敗談を申し述べます。
/opt/nvidia/jetson-gpio/samples
にgpio操作のサンプル(Pythonスクリプト)が存在します。ですから素直にREADME.md を読んで、その通りにすれば Jetson NanoからGPIOを操作するなど失敗するわけないのです。しかし、例によって早とちりしました。まずサンプルソースを開いてみたところこんな感じ(サンプルの一つの一部を引用させていただきます)
先頭を見ればNVIDIA社のソースに間違いありません。それでいて下の方、
import RPi.GPIO as GPIO
これみて早合点してしまいました。
嘘!、RPi.GPIO で制御できるの??
言っておきますが、できるわけありません。しかし数時間前、私はPIP3でRPi.GPIOをJetson nanoにインストールしたあげく、あえなく、ラズパイでしか走らないもんね、と拒絶されました。ちゃんと README.md 読みましょう。
RPi.GPIO くりそつの Jetson.GPIO というモジュールがあるのです。それこそ必要なもので、これをインストールさえすれば、
RPi.GPIO という名で Jetson.GPIO を呼ぶことができる
よって、さもラズパイ上のGPIOプログラムが走るように見えるのでした。ただし、私のように本物のRPi.GPIOをインストールしてしまうと、それがJetson.GPIOの別名を隠してしまうので、RPi.GPIOをアンインストールしておかねばなりませぬ。そんなことをする人はいないだろうけれど、念のため。
ピンの呼び方にもラズパイへの配慮があり、モードを
GPIO.BCM
に設定すれば、ラズパイのCPU-SoCであるBCM2835とその後継機と互換のピン番号で操作できるようになります。勿論、Jetson Nanoのボードに書かれているピン番号で呼ぶことも可能(全4通りの呼び方可能)。
端の3.3Vの電源と近くのGPIOを一本だけつかってLEDを光らせるサンプルがこちら。led_pinで指定しているのは、Raspberry Pi上でのピン番号であります。そして、あえてJetson.GPIOのインポートをコメントアウトし、RPi.GPIOというお名前で呼び出してます。GPIO.outputでLOW出力していますが、LOWでLED ON, HIGHでLED OFFです。
頭の方でGPIO.setwarnings(False)しているのは、onとoffを別のプログラムから制御していると、その度にうるさい警告がでるので、それを抑止するためであります。RPi.GPIO同様 実行には特権必要です。
$ sudo python3 led_on.py
といった具合。実際、Jetson Nanoから配線引き出してLEDを光らせているところがこちら。
すみません、Lチカで、ここまで引っ張ってしまいました。本日はこれまで。