今回はNVIDIA社のマイコンボード、Jetson NanoでDCモーターを制御する方法について解説します。
また、以下のページでJetsonの活用方法について解説していますので、あわせてご覧ください。
環境
ソフトウェア
JETPACK SDK:4.6.2
Python:3.6.9
ハードウェア
Jetson Nano:A02 4GB
モータードライバ:L298N
モーター:DAGU robot DG01D
今回、コントローラにはJetson Nanoの4GB版を使用しています。
モータードライバはL298Nを搭載したモジュールを使用しています。同じICであれば基板のメーカーが違っても使用できるかと思います。
ロボットのフレーム、モーター類はAmazonや楽天で販売されているキットを使用しています。
専用品ではないので、Jetsonやモータードライバ基板は止めれそうな位置のビスだけで固定しています。(4点では固定できていません)
この辺りは3Dプリンター等を持っていない場は、割り切って使うしかないかなと思っています。
Amazonで「スマートカー」等のキーワードで検索すると同じようなキットが見つかります。
楽天などでも安価で売られています。
ネジ穴が合わない場合はドリルで加工するなどの処理が必要です。
ハードウェアの接続
今回、モータードライバICはL298Nを使用します。モータードライバの詳細については以下の記事で解説していますので、あわせてご覧ください。
L298NモジュールとJetson NanoのGPIOを配線して接続していきます。
今回のはJetson NanoとL298Nの端子の対応表は以下となります。
Jetson Nano GPIO | L298Nモジュール 制御端子 |
GPIO32 | ENB |
GPIO33 | ENA |
GPIO16 | IN1 |
GPIO18 | IN2 |
GPIO22 | IN4 |
GPIO23 | IN3 |
GND | GND |
実装方法
ここからは実際にPythonのコードの実装方法を解説します。
回転方向
モーターの回転方向の制御はモータドライバモジュール(L298N)の端子IN1~IN4に対してON/OFFのデジタル信号を入力することで行います。
Jetson NanoからデジタルのON/OFF信号を出力する方法は以下の記事で解説しています。
回転速度
DCモーターの回転速度はモーターに印加する電圧で変化します。モータドライバモジュール(L298N)のENA、ENBにPMW信号を入力することで各モーターの回転速度を制御することができます。
Jetson NanoでPWM信号を出力する方法は以下の記事で解説しています。
作成したソースコード
作成したソースコードは以下の通りです。
今回は動作テストということでPWMデューティ比80%固定で、両モーターを進行方向に回転させるように処理を実装しました。
import Jetson.GPIO as GPIO
import time
#PWMピン番号を指定
output_pwm1 = 32
output_pwm2 = 33
#DIOピン番号を指定
output_pin1 = 22
output_pin2 = 24
output_pin3 = 16
output_pin4 = 18
#デューティを指定
duty1 = 80 #デューティー比を%で指定
duty2 = 80 #デューティー比を%で指定
#PWM周波数を設定
freq = 1000 #PWM周波数をHzで指定
#GPIOのpin指定方法を設定
GPIO.setmode(GPIO.BOARD)
#PWMピン設定
GPIO.setup(output_pwm1, GPIO.OUT, initial=GPIO.HIGH)
GPIO.setup(output_pwm2, GPIO.OUT, initial=GPIO.HIGH)
pwm1 = GPIO.PWM(output_pwm1, freq) #周波数を設定
pwm2 = GPIO.PWM(output_pwm2, freq) #周波数を設定
#DIOピン設定
GPIO.setup(22, GPIO.OUT)
GPIO.setup(24, GPIO.OUT)
GPIO.setup(16, GPIO.OUT)
GPIO.setup(18, GPIO.OUT)
#左回転
def turn_left():
GPIO.output(output_pin1, 1)
GPIO.output(output_pin2, 0)
GPIO.output(output_pin3, 0)
GPIO.output(output_pin4, 1)
#右回転
def turn_right():
GPIO.output(output_pin1, 0)
GPIO.output(output_pin2, 1)
GPIO.output(output_pin3, 1)
GPIO.output(output_pin4, 0)
#前進
def forward():
GPIO.output(output_pin1, 1)
GPIO.output(output_pin2, 0)
GPIO.output(output_pin3, 1)
GPIO.output(output_pin4, 0)
#後退
def back():
GPIO.output(output_pin1, 0)
GPIO.output(output_pin2, 1)
GPIO.output(output_pin3, 0)
GPIO.output(output_pin4, 1)
def main():
# GPIOでモータの回転方向を制御
forward()
#PWM出力
pwm1.start(duty1) #Dutyを設定
pwm2.start(duty2) #Dutyを設定
try:
while True:
pass
finally:
#CTRL+Cで停止
#PWM停止
pwm1.stop()
pwm2.stop()
#GPIO初期化
GPIO.cleanup()
if __name__ == '__main__':
main()
実行結果
こちらが先ほどのプログラムを実行したときの動画です。
後ろのオシロスコープにはENAとENBに対して出力したPWM信号が表示されています。
両モーターを進行方向に回転させることができました。
オシロスコープはOWON製のものを使用しています。
まとめ
今回はJetson NanoでDCモーターを駆動する方法を解説してみました。モーターを制御できるようになったことでSLAMや機械学習のアプリケーションを移動体に搭載して使用できるようになります。ぜひ活用してみてください。
また、Jetsonの使い方やTensorRTを使った機械学習モデルの実装方法を学びたい方には以下の講座がおすすめです。
私も実際にこの講座を購入して受講していますが、以下の方法でフランス語字幕を日本語字幕にリアルタイム翻訳して視聴できています。
また、以下の記事で効率的にPythonのプログラミングスキルを学べるプログラミングスクールの選び方について解説しています。最近ではほとんどのスクールがオンラインで授業を受けられるようになり、仕事をしながらでも自宅で自分のペースで学習できるようになりました。
スキルアップや副業にぜひ活用してみてください。
スクールではなく、自分でPythonを習得したい方には、いつでもどこでも学べる動画学習プラットフォームのUdemyがおすすめです。
講座単位で購入できるため、スクールに比べ非常に安価(セール時1200円程度~)に学ぶことができます。私も受講しているおすすめの講座を以下の記事でまとめていますので、ぜひ参考にしてみてください。
それでは、また次の記事でお会いしましょう。
コメント