qshinoの日記

Powershell関係と徒然なこと

Jetson GPIO control

Jetson Nano GPIO

Jetson Nano のGPIOをpython or sh で制御。

  1. python lib install
  2. coding & run
  3. 追記: sh で制御

python3ライブラリ インストール

gpioライブラリのダウンロードから、セットアップまで。

# constant
nv=/opt/nvidia
nvg=$nv/jetson-gpio
nvgm=${nvg}-master
user=`id -un`
rules=99-rules
nvrules=$nvg/etc/$rules
udrules=/etc/udev/rules.d

# Downloading the Library 
wget https://github.com/NVIDIA/jetson-gpio/archive/master.zip 

sudo unzip master.zip -d $nv

# ls -l $nv

sudo rm -rf $nvg
mv $nvgm $nvg
# ls -l $nvg

# Install Python Library 
cd $nvg

# python3 
sudo python3 setup.py install 

# python2 
# sudo python setup.py install 

# Setting User Permissions 
sudo groupadd -f -r gpio
sudo usermod -aG gpio $user 

# Install custom udev rules 
# cat $nvrules
sudo cp $nvrules $udrules/

# Reload the udev rules 
sudo udevadm control --reload-rules && sudo udevadm trigger

gpio control

pythonからgpio制御

  • pin 15 : LED
  • pin 13 : button in
import Jetson.GPIO as GPIO

def gptest():
    led= 15         # pun 15 out to led
    button = 13 # pin 13 from button
    GPIO.setmode(GPIO.BOARD)     
    GPIO.setup(led, GPIO.OUT) 
    GPIO.output(led, GPIO.HIGH) 
    GPIO.output(led, GPIO.LOW) 
    GPIO.setup(button, GPIO.IN) 
    GPIO.input(button) 
    GPIO.cleanup()

if( __name__ == '__main__' ):
    main()

cli

コマンドで制御する場合

# Map GPIO Pin
# gpio79 is pin 12 on the Jetson Nano
$ echo 79 > /sys/class/gpio/export
# Set Direction
$ echo out > /sys/class/gpio/gpio79/direction
# Bit Bangin'!
$ echo 1 > /sys/class/gpio/gpio79/value
$ echo 0 > /sys/class/gpio/gpio79/value
# Unmap GPIO Pin
$ echo 79 > /sys/class/gpio/unexport
# Query Status
$ cat /sys/kernel/debug/gpio

ref

article

https://www.jetsonhacks.com/2019/06/07/jetson-nano-gpio/

Jetson Nano J41 header pinout

https://www.jetsonhacks.com/nvidia-jetson-nano-j41-header-pinout/

日本語記事

http://www.neko.ne.jp/~freewing/raspberry_pi/nvidia_jetson_nano_gpio_blink_led_switch/

nvidia jetson gpio library

API使用手順

  1. import Jetson.GPIO as GPIO
  2. GPIO.setmode(GPIO.BOARD), BOARD以外のモードあり。
  3. channel setup
  4. inout
  5. 必要なら、エッジ検出。block, nonblock, callback
  6. pwmもdtb書き換えで利用可能。

import

import Jetson.GPIO as GPIO

mode.setup

GPIO.setmode(GPIO.BOARD)
# or 
GPIO.setmode(GPIO.BCM)
# or 
GPIO.setmode(GPIO.CVM) 
# or 
GPIO.setmode(GPIO.TEGRA_SOC)

mode = GPIO.getmode()
  • BOARD : GPIO Pin#
  • BCM : BCM GPIO#
  • CVM : Carrier board sig name
  • TEGRA_SOC : Tegra soc name

warnings

GPIO.setwarnings(False)

input 以外のピンへのsetmodeにはwarningが出る。上記で抑制。

channel setup

GPIO.setup(channel, GPIO.IN) GPIO.setup(channel, GPIO.OUT) GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH)

inout

GPIO.input(channel)

戻り値は、GPIO.LOW, HIGH

GPIO.output(channel, state)

stateは、inの戻り値と同じ。

cleanup

GPIO.cleanup()

event

下記はブロックする。

GPIO.wait_for_edge(channel, GPIO.RISING)

.FALLING, .BOTHが使える。

  • timeout is in milliseconds

GPIO.wait_for_edge(channel, GPIO.RISING, timeout=500)

  • set rising edge detection on the channel

以後はブロックしないが、コード側で監視が必要。

GPIO.add_event_detect(channel, GPIO.RISING)
run_other_code()
if GPIO.event_detected(channel):
do_something()

callback

  • set rising edge detection on the channel
# define callback function
def callback_fn(channel):
print("Callback called from channel %s" % channel)

# add rising edge detection
GPIO.add_event_detect(channel, GPIO.RISING, callback=callback_fn)

コールバック関数は別スレッドで動作する。ただし、全てのコールバックで一つのスレッドを利用するため、複数のコールバックを登録しても、コールバック同士は逐次実行となる。

下記では複数のコールバックを登録。

def callback_one(channel):
print("First Callback")

def callback_two(channel):
print("Second Callback")

GPIO.add_event_detect(channel, GPIO.RISING)
GPIO.add_event_callback(channel, callback_one)
GPIO.add_event_callback(channel, callback_two)

デバウンス

短期間に複数のイベントが発生するのを防ぐ方法。下記にてデバウンス時間を設定可能。指定期間のイベントは纏めて一つのコールバックが呼ばれる。

# bouncetime set in milliseconds
GPIO.add_event_detect(channel, GPIO.RISING, callback=callback_fn,
bouncetime=200)

イベント削除

GPIO.remove_event_detect(channel)

機能確認

GPIO.gpio_function(channel)

戻り値は、GPIO.IN or .OUT

PWM

サンプルで確認

samples/simple_pwm.py for details on how to use PWM channels.

なお、JetsonのPWMはハード制御で、PWMコントローラ接続ピンのみ対応。

PWMコントローラとのpin接続は、pinmux で制御。Device tree で設定。

動的な設定はできないため、dtbの変更が必要になる。

https://github.com/NVIDIA/jetson-gpio/blob/master/README.md