NVIDIA Jetson TX1、TX2、TX2 NX、AGX Xavier および Nano 開発ボードの GPIO ポートの構成とアプリケーション
序章
Jetson TX1、TX2、TX2 NX、AGX Xavier、および Nano 開発ボードには、デジタル入出力に使用できる 40 ピンを含む GPIO ヘッダーが装備されています。以下に示すように
Raspberry Pi の 40 ピン ヘッダーと同様に、これらの GPIO インターフェイスは、センサー、アクチュエーターなどのさまざまな外部デバイスの接続に使用できます。これらの GPIO インターフェイスの制御を容易にするために、NVIDIA は、デジタル入出力の制御に使用できる Python ライブラリを含む Jetson GPIO ライブラリ パッケージを提供しています。このライブラリには、Raspberry Pi の RPi.GPIO ライブラリと同じ API があるため、ユーザーは以前 Raspberry Pi で実行されていたアプリケーションを Jetson ボードに簡単に移植できます。このライブラリを使用すると、ユーザーは GPIO インターフェイスを読み取って制御するための Python コードを簡単に作成でき、必要に応じて構成をカスタマイズできます。これにより、Jetson 開発ボードは、ロボット工学、スマート ホーム システム、自動制御システムなどのさまざまな組み込みアプリケーションで使用できる強力なツールになります。これらにコンテンツを追加して肉付けします。
このドキュメントでは、Jetson GPIO ライブラリ パッケージの内容、システムの構成方法、提供されるサンプル アプリケーションとライブラリ API の実行方法について説明します。
ここでは、Jetson.GPIO に関するこのライブラリの使用方法を簡単に紹介します。公式の詳細な説明は次のとおりです。
https://pypi.org/project/Jetson.GPIO/ または https://github.com/NVIDIA/jetson-gpio
GPIOとBCMの比較表
環境構成
1.jetson-gpio をダウンロードします。
コマンド git clone https://github.com/NVIDIA/jetson-gpio を実行します。
git clone https://github.com/NVIDIA/jetson-gpio
2. ダウンロードしたファイルをディレクトリに移動します。ライブラリが /opt/nvidia のこのディレクトリに存在する場合は、次のコマンドを使用して元のディレクトリをバックアップする必要があります。
cd /opt/nvidia
sudo mv ~/jetson-gpio jetson-gpio_bak
3. Jetson-gpio ライブラリ フォルダーに移動し、ライブラリをインストールします。
cd /opt/nvidia/jetson-gpio
sudo python3 setup.py install
4. gpio グループを作成し、現在のログイン ユーザーをこのグループに追加し、そのグループを使用する権限を付与します。
sudo groupadd -f -r gpio
sudo usermod -a -G gpio user_name
sudo cp /opt/nvidia/jetson-gpio/lib/python/Jetson/GPIO/99-gpio.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && sudo udevadm trigger
注: user_name は使用するユーザー名です (たとえば、nano)
5. Python で GPIO ライブラリを使用するためのすべてのユーザーの権限を構成します。
sudo chmod a+rw /dev/gpiochip0
sudo chmod a+rw /dev/gpiochip1
sudo chmod a+rw /dev/gpiochip2
この場合、ソフトウェア環境が構成されます
例
環境を構成したら、ルーチンをテストできます。Jetson-gpio にはいくつかの簡単なルーチンが提供されています。簡単にテストできます。まず、サンプル プログラム ディレクトリ cd ~/opt/nvidia/jetson-gpio/samples/ に入ります。
1、simple_out.py
コード
#!/usr/bin/env python
# Copyright (c) 2019-2022, NVIDIA CORPORATION. All rights reserved.
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
import RPi.GPIO as GPIO
import time
# Pin Definitions
output_pin = 18 # BCM pin 18, BOARD pin 12
def main():
# Pin Setup:
GPIO.setmode(GPIO.BCM) # BCM pin-numbering scheme from Raspberry Pi
# set pin as an output pin with optional initial state of HIGH
GPIO.setup(output_pin, GPIO.OUT, initial=GPIO.HIGH)
print("Starting demo now! Press CTRL+C to exit")
curr_value = GPIO.HIGH
try:
while True:
time.sleep(1)
# Toggle the output every second
print("Outputting {} to pin {}".format(curr_value, output_pin))
GPIO.output(output_pin, curr_value)
curr_value ^= GPIO.HIGH
finally:
GPIO.cleanup()
if __name__ == '__main__':
main()
これは、BCM の PIN コーディング モードを使用する単純な入力プログラムで、PIN12 の値を読み取り、端末に出力できます。
配線: 以下の図に示すように、電源のプラス線、信号線、およびマイナス線をそれぞれピン 1、12、および 14 に接続します。
次に、プログラム python3 simple_out.py を実行します。
python3 simple_out.py
期待される効果: プログラムを実行すると、端末の印刷情報が表示され、物理ピン PIN12 にハイ レベルとロー レベル (2 秒ごとに交互に更新) が出力されます。
【注意】ここでの 18 は BCM コードを指し、上記の PIN12 は物理コード、つまり基板に印刷されたシルク スクリーン コードを指します。
Jetson TX2 NX ピンの動作レベルは 3.3V であるため、使用する場合は 5V レベルに接続しないでください。
ピンを接続する必要がある場合は、短絡やコンポーネントの焼損を避けるため、保護回路に注意してください。
2.制御リレーを介して下部コンピューターを制御し、4つのGPIOポートの宮殿制御を実現します。
control.py コード:
#!/usr/bin/env python
import RPi.GPIO as GPIO
import time
# Pin Definitions
output_pin1 = 18 # BCM pin 18, BOARD pin 12
output_pin2 = 23 # BCM pin 18, BOARD pin 16
output_pin3 = 24 # BCM pin 18, BOARD pin 18
output_pin4 = 25 # BCM pin 18, BOARD pin 20
def setup_gpio():
GPIO.setmode(GPIO.BCM) # BCM pin-numbering scheme from Raspberry Pi
# set pins as output pins with optional initial state of LOW
GPIO.setup(output_pin1, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(output_pin2, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(output_pin3, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(output_pin4, GPIO.OUT, initial=GPIO.LOW)
def control_status(flag=0):
if flag == 0:
print('0')
elif flag == 1:
GPIO.output(output_pin1, GPIO.HIGH)
time.sleep(2)
setup_gpio()
print('1')
elif flag == 2:
GPIO.output(output_pin1, GPIO.HIGH)
GPIO.output(output_pin2, GPIO.HIGH)
time.sleep(2)
setup_gpio()
print('2')
elif flag == 3:
GPIO.output(output_pin1, GPIO.HIGH)
GPIO.output(output_pin2, GPIO.HIGH)
GPIO.output(output_pin3, GPIO.HIGH)
time.sleep(1)
print('3')
elif flag == 4:
setup_gpio()
GPIO.output(output_pin1, GPIO.HIGH)
GPIO.output(output_pin2, GPIO.HIGH)
GPIO.output(output_pin3, GPIO.HIGH)
GPIO.output(output_pin4, GPIO.HIGH)
time.sleep(1)
print('4')
while True:
setup_gpio()
num = input("input your num")
control_status(int(num))
このコードは、Raspberry Pi の GPIO ピンを制御して High および Low レベルを出力し、外部デバイスのステータスを制御するために使用されます。具体的な機能は以下の通りです。
- RPi.GPIO と時間モジュールを紹介します。
- 4 つの GPIO ピンの BCM 番号、BOARD 番号、および対応するピン状態が定義され、ピンは setup_gpio() 関数で初期化されます。
- control_status() という名前の関数が定義されています。これは、外部デバイスを制御するという目的を達成するために、入力パラメーター (0 ~ 4) に従ってさまざまな GPIO ピンの出力ステータスを制御するために使用されます。
- メインプログラムでは、ループを通じてユーザー入力 num を継続的に受け取り、control_status() 関数を呼び出して外部デバイスを制御します。
要約する
Jetson TX2 NX の GPIO インターフェイスを介してリレーを制御するのは非常に簡単です。リレー モジュールを正しい GPIO ピンに接続し、Jetson GPIO ライブラリをインストールし、Python スクリプトを作成して実行するだけです。この技術は、さまざまな下位コンピュータ制御アプリケーションの実現に役立ちます。