JetsonNano GPIO

JetsonNanoでGPIOを使ってみました。どのPINが何番に対応してるの?みたいにわかりづらいところも多かったのでまとめてみました。

やったこと

  • ターミナルから直接操作
  • Pythonから操作(ライブラリ使用)

ピン対応表

下記のサイトにピン配置が載っている。中央のPin列が実際の位置を示している。

www.jetsonhacks.com

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を使用する。

sysfs - Wikipedia

わかりやすく言うとファイル操作によって、デバイスが操作できるという仕組みである。

入力

下記をターミナルから実行する。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)