Jetson GPIO control
Jetson Nano GPIO
Jetson Nano のGPIOをpython or sh で制御。
- python lib install
- coding & run
- 追記: 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使用手順
- import Jetson.GPIO as GPIO
- GPIO.setmode(GPIO.BOARD), BOARD以外のモードあり。
- channel setup
- inout
- 必要なら、エッジ検出。block, nonblock, callback
- 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()
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の変更が必要になる。