JetsonNanoでGPIOを使ってみました。どのPINが何番に対応してるの?みたいにわかりづらいところも多かったのでまとめてみました。
やったこと
- ターミナルから直接操作
- Pythonから操作(ライブラリ使用)
ピン対応表
下記のサイトにピン配置が載っている。中央のPin列が実際の位置を示している。
Name列に3.3VやI2Cとつけられているが、これが各ピンの役割である。GPIOとして使えるピンそんなにないやんけ、と思うだろうが、初期設定では実際にその役割を割り当てられているものは少なく、Sysfs GPIO列にgpioxxxと書いてあるピンはどれも使用することができる。入力出力の違いはないの?と思われる方もいるかもしれないがGPIOはSW的に入出力が決定できる。この対応表は頻繁に使用するので、PCの壁紙にするといいかもしれない。
Sysfs GPIO列はターミナルからの操作で使用し、Pin番号はPythonでの制御で使用する。
操作するピン
今回は以下のピンのみを使用する。 - Pin番号:37 - Name:SPI_2_MOSI - sysfs:gpio12
準備
入出力が実際に動いているか確認するために、LEDやら用意しておくと良い。注意点としては、入力を見るときは3.3VまたはGNDに確実に接続すること。ピンが刺さっていない状態はLowでもHighでもない状態である。(自分がやらかしたので)
あと、sudoつけなくてもgpioが操作できるよう、下記のようにグループに追加しておく。
$ sudo groupadd -f -r gpio $ sudo usermod -a -G gpio $USER
ターミナルからの制御
ターミナルからどうやってGPIO操作するの?というとSysfsを使用する。
わかりやすく言うとファイル操作によって、デバイスが操作できるという仕組みである。
入力
下記をターミナルから実行する。Pinの'12'を使用する。
$ echo 12 > /sys/class/gpio/export $ echo in > /sys/class/gpio/gpio12/direction
Pin12を3.3VやGNDに接続して下記を実行すると、その状態がわかる。
$ echo /sys/class/gpio/gpio12/value
出力
下記をターミナルから実行する。実行するとPin12がHighになり、LEDが接続されていると光る。
$ echo 12 > /sys/class/gpio/export $ echo out > /sys/class/gpio/gpio12/direction $ echo 1 > /sys/class/gpio/gpio12/value
ターミナルで操作後は
ちゃんとunexportしておく。
$ echo 12 > /sys/class/gpio/unexport
python
Pythonで操作するにはjetson.GPIOというライブラリを使用する。下記コマンドでインストール。
$ pip3 install Jetson.GPIO
※ Jetson.GPIOのReadmeにはsudo をつけるとなっているが個人的にはおすすめしない。あまり詳しくは書かないが、sudoをつけるとRootに、つけないとユーザーにインストールされるので、あれ?インストールしたはずのライブラリがないぞ?となりがち。セットアップするなら統一したほうが良い。
入力
下記を実行するとPinの入力状態がわかる。
import Jetson.GPIO as GPIO ch = 37 GPIO.setmode(GPIO.BOARD) mode = GPIO.getmode() GPIO.setup(ch, GPIO.IN) print(GPIO.input(ch))
ここでGPIO.setmodeはPinの指定方法を設定できる。詳しくはライブラリ参照。
GPIO.BOARDは物理Pinに対応した記法。GPIO.BCMは役割に対応したもの、らしい。
出力
下記を実行するとGPIOの出力ができる。値はGPIO.HIGHまたはGPIO.LOWを選択する。
import Jetson.GPIO as GPIO ch = 37 GPIO.setmode(GPIO.BOARD) mode = GPIO.getmode() GPIO.setup(ch, GPIO.OUT, initial=GPIO.HIGH) GPIO.output(ch, GPIO.HIGH)