Jetson開発ボードでGPIOを使ってみる

#はじめに
　JETSON TX2の開発ボードには、RaspberryPiのピン互換のJ21があります。[（ピン配置）](https://www.jetsonhacks.com/nvidia-jetson-tx2-j21-header-pinout/) 
　RaspberryPiの[WiringPi](http://wiringpi.com/)ように、お手軽にGPIOを操作できるライブラリとして、NVIDIAのGitHubに、Python向けのGPIOライブラリが公開されています。

- [Jetson.GPIO (GitHub)](https://github.com/NVIDIA/jetson-gpio)
- [Jetson.GPIO (PyPI)](https://pypi.org/project/Jetson.GPIO/)

（[こちら](https://github.com/NVIDIA/jetson-gpio/blob/master/lib/python/Jetson/GPIO/gpio_pin_data.py)を見る限り、XAVIER, TX2, TX1, NANOに対応しているようです）

　ここでは、LEDを点滅させるところまで試してみました。

#インストール
[こちらの手順](https://github.com/NVIDIA/jetson-gpio#configuring-the-system)に従って、インストールします。

##前準備
python3の開発環境をインストール

```console
~$ sudo apt install python3-dev python3-pip
```

##Jetson.GPIOのインストール

GitHubからダウンロードしてインストール。

```console
~$ sudo su
/home/nvidia# cd /opt/nvidia/
/opt/nvidia# git clone https://github.com/NVIDIA/jetson-gpio.git
/opt/nvidia# mv /opt/nvidia/jetson-gpio-master /opt/nvidia/jetson-gpio
/opt/nvidia# cd jetson-gpio
/opt/nvidia/jetson-gpio# python3 setup.py install
```

gpioグループの追加と、使用するユーザをそのグループに追加

```console
/opt/nvidia/jetson-gpio# sudo groupadd -f -r gpio
/opt/nvidia/jetson-gpio# sudo usermod -a -G nvidia
```

udevルールをコピーして、udevに新しいルールを適応する

```console
/opt/nvidia/jetson-gpio# cp /opt/nvidia/jetson-gpio/etc/99-gpio.rules /etc/udev/rules.d/
/opt/nvidia/jetson-gpio# udevadm control --reload-rules && sudo udevadm trigger
/opt/nvidia/jetson-gpio# exit
```

最後にスーパーユーザーから抜けます。

#サンプルを試す

[GPIOの出力のサンプルプログラム](https://github.com/NVIDIA/jetson-gpio/blob/master/samples/simple_out.py)は、GPIO18(ピン番号12)を2秒間隔でON/OFFを繰り返します。
ここに抵抗とLEDを付けておきます。[Ctrl-C]で停止します。

（自作のRaspberryPi用絶縁IOボード[PiFA-HAT](https://github.com/trihome/RasPi_PiFA-HAT)で動作検証。D6が点滅しています）
![P_20190502_124913_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145581/9208647b-47c7-9c22-b0e1-7b1a2d1e0b98.jpeg)

```console
/opt/nvidia/jetson-gpio$ cd samples/
/opt/nvidia/jetson-gpio/samples$ ./run_sample.sh
Usage: ./run_sample.sh <sample application>
sample_application: simple_input.py
                    simple_output.py
                    button_led.py
                    button_event.py
                    button_interrupt.py
/opt/nvidia/jetson-gpio/samples$ ./run_sample.sh　simple_out.py
Starting demo now! Press CTRL+C to exit
Outputting 1 to pin 18
Outputting 0 to pin 18
Outputting 0 to pin 18
Outputting 0 to pin 18
^CTraceback (most recent call last):
  File "./simple_out.py", line 48, in <module>
    main()
  File "./simple_out.py", line 39, in main
    time.sleep(1)
KeyboardInterrupt
nvidia@tegra-ubuntu:/opt/nvidia/jetson-gpio/samples$
```

#補足

##その１
`./run_sample.sh`を使わず、直接`simple_output.py`を実行するには、下記のようにします。

```console
/opt/nvidia/jetson-gpio/samples$ export PYTHONPATH="/opt/nvidia/jetson-gpio/lib/python/
/opt/nvidia/jetson-gpio/samples$ ./simple_output.py
```

##その２
[GPIOの出力のサンプルプログラム](https://github.com/NVIDIA/jetson-gpio/blob/master/samples/simple_out.py)の26行目は、GPIOの番号をリストにすると、まとめてON/OFFできます。
例えば、GPIO4, 5, 8, 13, 17, 24, 25をまとめて操作する場合は下記のように修正します。

```python:修正前
# Pin Definitions
output_pin = 18  # BOARD pin 12, BCM pin 18
```

```python:修正後
# Pin Definitions
output_pin = [4, 5, 8, 13, 17, 24, 25]
```

##ひとりごと
18年春にTX2を入手してから、お手軽にGPIOを使う方法がないかと探していましたが、

- https://github.com/anilsathyan7/JetsonTX2-GPIO
sudoを使う必要がある。

- https://www.jetsonhacks.com/2015/12/29/gpio-interfacing-nvidia-jetson-tx1/
良さそうだったけど、TX1用なので、ピン配置をTX2に書き換えないとならない。

といった感じで、なかなか良いサンプルが見つけられず・・・
このタイミングで、NVIDIA公式からライブラリが出てくれたのは、本当に有り難い事です。
（ホントにRaspberryPi感覚で使えます）

- https://devtalk.nvidia.com/default/topic/1030443/using-gpio-on-nvidia-jetson-tx2/

（その他の情報）

以上、ご参考になれば幸いです。