2024年12月16日月曜日

Nvidia Jetson AGX OrinのGPIO制御はpythonのライブラリだとピンの位置番号で呼ぶ


背景

組込み用の計算機 Jetson AGX OrinでGPIO端子を利用するのに苦労したので、備忘録として関連情報と使い方を記事に残します。

使ったもの

  • Jetson AGX Orin(以後Orin)
    Jetpack6.0.1をインストールしたものを利用しました。
  • オスメスジャンパワイヤ
  • ブレッドボード
  • LED + 抵抗
  • Orinを操作する環境
    同一WiFiのPCからssh接続して操作しました。
    DisplayPortをモニタに繋ぎ、USBキーボードなどから操作するのでも良いです。

ジャンパワイヤでGND、3.3V、試験対象のピンを引き出し、LEDを光らせたりGNDや3.3Vに繋げて電位を変えたりしました。

GPIO操作ライブラリ jetson-gpioをインストール

pythonからGPIO制御をするのにNvidiaが公式でライブラリjeton-gpioを提供してくれています。
python環境とjetson-gpioのインストールコマンドはこちらです。
sudo apt install python3-pip
sudo pip install Jetson.GPIO

権限設定の説明に従いユーザーグループとudev rulesも設定します。
# user group
sudo groupadd -f -r gpio
sudo usermod -a -G gpio your_user_name
# udev rules
sudo wget https://raw.githubusercontent.com/NVIDIA/jetson-gpio/refs/heads/master/lib/python/Jetson/GPIO/99-gpio.rules /tmp/99-gpio.rules -O /etc/udev/rules.d/99-gpio.rules
sudo udevadm control --reload-rules && sudo udevadm trigger

上記の設定でpythonからjetson-gpioを通してGPIOを扱えます。

ピンは位置番号で呼ぶ(output可能なのは2本だけ)

「Jetson AGX Orin pinout」などで検索すると各ピンの役割やGPIO番号の一覧が出てきますが、jetson-gpioはそのGPIO番号は関係なくピンの位置番号で呼びます。
具体的に言うと、GPIO32と役割が振られているピンは13番ピンなので、プログラムでは13番で呼べます。

自分が試した環境だと利用可能なoutputとして利用可能なピンは2本、inputとして利用可能なピンは20本でした。

動作確認に利用したプログラムと結果を残します。
どのピンが何に使えるかは下記のコードを見てください。
#!/usr/bin/env python
# coding: utf-8

import Jetson.GPIO as GPIO
import time

TEST_AS="output"
# TEST_AS="intput"

## For Jetson AGX Orin
## 1: 3.3V
## 2: 5V
# PIN_TEST = 3 # invalid
# PIN_TEST = 5 # invalid
## 6: GND
# PIN_TEST = 7 # MCLK05 input ok
# PIN_TEST = 8 # invalid
## 9: GND
# PIN_TEST = 10 # invalid
PIN_TEST = 11 # UART1_RTS output ok
# PIN_TEST = 12 # I2S2_CLK input ok
# PIN_TEST = 13 # 13:GPIO32 output ok
## 14: GND
# PIN_TEST = 15 # 15:GPIO27 input ok
# PIN_TEST = 16 # 16:GPIO8 input ok
## 17: 3.3V
# PIN_TEST = 18 # 18:GPIO35 input ok
# PIN_TEST = 19 # SPI1_MISO input ok
## 20: GND
# PIN_TEST = 21 # SPI1_MISO input ok
# PIN_TEST = 22 # GPIO17 input ok
# PIN_TEST = 23 # SPI1_SCK input ok
# PIN_TEST = 24 # SPI1_CS0 input ok
## 25: GND
# PIN_TEST = 26 # SPI1_CS1 input ok
# PIN_TEST = 27 # invalid
# PIN_TEST = 28 # invalid
# PIN_TEST = 29 # CAN0_DIN input ok
## 30: GND
# PIN_TEST = 31 # CAN1_DOUT input ok
# PIN_TEST = 32 # GPIO9 input ok
# PIN_TEST = 33 # CAN1_DOUT input ok
## 34: GND
# PIN_TEST = 35 # I2S_FS input ok
# PIN_TEST = 36 # UART1_CTS input ok
# PIN_TEST = 37 # CAN1_DIN input ok
# PIN_TEST = 38 # I2S_SDIN input ok
## 39: GND
# PIN_TEST = 40 # I2S_SDOUT input ok

def onRising(channel):
print("rising at %ld" % time.time())

print(GPIO.JETSON_INFO)
GPIO.setmode(GPIO.BOARD)
if TEST_AS == "output":
GPIO.setup(PIN_TEST, GPIO.OUT)
else:
print("set %d as input" % PIN_TEST)
GPIO.setup(PIN_TEST, GPIO.IN)
GPIO.add_event_detect(PIN_TEST, GPIO.RISING, callback=onRising, bouncetime=2)

flag_output=True
while True:
if TEST_AS == "output":
print("output %d to %d" % (flag_output, PIN_TEST))
GPIO.output(PIN_TEST, flag_output)
flag_output = not flag_output
time.sleep(1)

おわり

outputで動作確認を試みたもののそれとして使えるピンが2本しか無かったので指定方法が分からず時間を取られましたが、pythonのjetson-gpioライブラリではピンの位置で指定し、出力として利用可能なピンは2本しかないと分かりました。

GPIOと呼ぶには入力か出力の片方しか動かせなくて不便ですが、動かせたので良しです。

参考

jetson-gpio
JETSON AGX Orin J30 GPIO EXPANSION HEADER PINOUT

0 件のコメント :