Jetson Nano GPIO動作確認

最終的にはJetson Nanoを用いてロボットを制御したいため、今回はGPIOの動作確認(デジタル入出力、PWM出力)をしようと思います。

①Lチカ(1秒点灯)

Jetson Nanoのデジタル出力を確認するために、Lチカを試しました。

下記が回路図です。今回からKiCadを使用し始めました。慣れるまで時間がかかりそうですが、これでプリント基板も設計できるようなので、そのうち作成してみたいですね。

プログラムは下記のようになっています。

#=====================================================================================
#01_Ltika_time.py V1.0
#Put on a LED at regular intervals.
#
#Copyright (c) 2021 Weekly Engineering
#
#Released under the MIT license.
#see https://opensource.org/licenses/MIT
#=====================================================================================

import Jetson.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
GPIO.setup(33, GPIO.OUT)

GPIO.output(33, GPIO.HIGH)
time.sleep(1)
GPIO.output(33, GPIO.LOW)

GPIO.cleanup()

・import Jetson.GPIO as GPIO
Jetson NanoのGPIOを利用するためにインポートが必要です。

・GPIO.setmode(GPIO.BOARD)
GPIOピンの指定(33など)をボードの数字で指定するか、GPIOの数字で指定するかを選択できます。

・GPIO.setup(33, GPIO.OUT)
GPIOピンの入出力設定を行います。

・GPIO.output(33, GPIO.HIGH)
GPIOピンの出力レベルを設定します。

実際に動作させた際の動画がこちらです。

Lチカ(1秒点灯)

無事に点灯してくれていますね。GPIO周りのドキュメントがまだまだ少なく、苦労しましたが良かったです。

②Lチカ(スイッチ入力)

Jetson Nanoのデジタル入力を確認するために、スイッチによってLEDの点灯を制御してみることにしました。

下記が回路図です。先ほどの回路にスイッチ入力の回路を付け足した形ですね。Jetson Nanoの13ピンを入力としており、抵抗でプルアップしています。

このプルアップ抵抗が曲者で、最初はプルアップとして10kΩの抵抗を使用していましたが、スイッチをONにしてもOFFにしても、GPIOの入力は常にLOWとなってしまいました。調べてみたところ、プルアップ抵抗の抵抗値が高すぎるとJetson NanoではLowになってしまうようですね…。下記の方も同様のトラブルがあったようで、詳しくまとめられていました。

【参考】

簡単にまとめるとGPIOはJetson Nano内部で4kΩを介してGNDに接続されているようです。下記図1のようなイメージですかね…。

図1 GPIO内部回路 概要

プルアップ抵抗が3.3Vの電源に接続されているとすると、プルアップ抵抗の抵抗値は2kΩ以下程度にしないと、スイッチOFF時もHIGHと認識してくれないそうです。今回はプルアップ抵抗の抵抗値は75Ωとしたところ、HIGHを認識してくれました。

今更ですが図1をよく見ると、すでにGPIOは内部でプルダウンされているように見えるため、プルアップ抵抗は必要なかったような気もしますね。この辺りは詳しく調べていないため、詳しい方がいたら教えていただきたいです。

プログラムは簡単で、下記となります。

#=====================================================================================
#02_Ltika_sw.py V1.0
#Put on a LED by switchi input.
#
#Copyright (c) 2021 Weekly Engineering
#
#Released under the MIT license.
#see https://opensource.org/licenses/MIT
#=====================================================================================

import Jetson.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
GPIO.setup(13, GPIO.IN)
GPIO.setup(33, GPIO.OUT)

GPIO.output(33, GPIO.LOW)
for i in range(10):
    ledsta = GPIO.input(13)
    if ledsta == GPIO.HIGH:
        GPIO.output(33, GPIO.LOW)
    else:
        GPIO.output(33, GPIO.HIGH)
    time.sleep(1)

GPIO.cleanup()

一秒ごとにスイッチの状態を判別して、スイッチが押されていたらLEDを点灯するようにしています。

動画がこちらです。

Lチカ(スイッチ入力)

プルアップ抵抗で躓いたこと以外は特に問題なく動作しました。

③モータ(PWM制御)

Jetson NanoのPWM出力を確認するために、モータを動作させてみました。回路図が下記となります。

モータドライバのTA7291Pが家に余っていたので使用しています。モータの電源には別途6Vの電源を使用しています。

プログラムはこちらです。

#=====================================================================================
#04_motor_TA7291P_pwm.py V1.0
#Driving motor by PWM control.
#
#Copyright (c) 2021 Weekly Engineering
#
#Released under the MIT license.
#see https://opensource.org/licenses/MIT
#=====================================================================================

import Jetson.GPIO as GPIO
import time

in1 = 31
in2 = 32
vref = 33

GPIO.setmode(GPIO.BOARD)
GPIO.setup(in1, GPIO.OUT, initial=GPIO.HIGH)
GPIO.setup(in2, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(vref, GPIO.OUT, initial=GPIO.HIGH)

pwm = GPIO.PWM(vref, 200)    #GPIO.PWM(channel, freqency[Hz]) 

pwm.start(25)  #.start(duty[%])
time.sleep(1)

pwm.start(50)  #.start(duty[%])
time.sleep(1)

pwm.start(100)  #.start(duty[%])
time.sleep(1)

pwm.start(50)  #.start(duty[%])
time.sleep(1)

pwm.start(25)  #.start(duty[%])
time.sleep(1)

GPIO.setup(in1, GPIO.OUT, initial=GPIO.HIGH)
GPIO.setup(in2, GPIO.OUT, initial=GPIO.HIGH)
pwm.stop()
time.sleep(1)

GPIO.setup(in1, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(in2, GPIO.OUT, initial=GPIO.HIGH)

pwm.start(25)  #.start(duty[%])
time.sleep(1)

pwm.start(50)  #.start(duty[%])
time.sleep(1)

pwm.start(100)  #.start(duty[%])
time.sleep(1)

pwm.start(50)  #.start(duty[%])
time.sleep(1)

pwm.start(25)  #.start(duty[%])
time.sleep(1)

GPIO.setup(in1, GPIO.OUT, initial=GPIO.HIGH)
GPIO.setup(in2, GPIO.OUT, initial=GPIO.HIGH)
pwm.stop()
time.sleep(1)

GPIO.cleanup()

・pwm = GPIO.PWM(vref, 200)
pwm出力の設定を行います。pwm出力させるピンと、周波数[Hz]を設定します。

・pwm.start(25)
PWMのduty比[%]を設定します。この関数後はそのduty比でPWMが出力されます。

・pwm.stop()
PWM出力を停止します。

上記のプログラムを作成し、動作確認を行いましたが、まったく動作しませんでした。Vrefを抵抗を介して電源に接続すると、モータが動作したため、PWM出力ができていませんでした。

原因を調べると、Jetson Nano自体で、pwm出力としてピンを使用することを設定しておく必要があるそうでした。

下記のサイトを参考にしてJetson-IO toolでPWMを有効にし、再び試したところモータが動作しました。

【参考】https://qiita.com/kitazaki/items/a445994f1f46a1b15f78

モータ(PWM制御)

duty比を25%→50%→100%→50%→25%と変化させ、その通りに回転速度が変化してくれています。

まとめ

プルアップ抵抗やPWMピンの設定等で躓きましたが、無事GPIOの動作確認をすることができました。

今回からGitHubを使用し始めたので、興味のある方は見てください。(まだあまり使い方がわかっていないです笑)

https://github.com/edamame-y/Jetson-Nano-GPIO-check

以上です。次回はJetson Nanoでカメラをいじってみようと思います。深層学習に手を付けるのはいつになるのか…。

コメントを残す

メールアドレスが公開されることはありません。