Jetson Nanoには2つのハードウェアPWMを出力できるピンが搭載されています。今回はこのチャンネルを使ってGPIOからPWM信号を出力する方法を解説します。
Jetson NanoでデジタルのON/OFF信号を出力するための方法も以下の記事で解説していますので、あわせてご覧ください。

また、以下のページでJetsonの活用方法について解説していますので、あわせてご覧ください。

環境
ハードウェア:NVIDIA Jetson Nano 4GB
JETPACK SDK:4.6.2
今回、JETPACKはJetson Nanoの最終サポートバージョンである4.6.2を使用しました。
インストール方法は以下の記事で解説していますので、あわせてご覧ください。

Jetson Nano本体は4GB版を使用しました。


Jetson IO ToolでPWM出力ピンの設定
まずはJetson IO Toolを使ってPWM出力ピンの設定を行います。GPIO32、GPIO33番ピンがPWM用の出力ピンとなっています。
以下のコマンドを実行します。
sudo /opt/nvidia/jetson-io/jetson-io.py
Jetson IO Toolを起動すると以下のような画面が表示されますんので、「Configure jetson 40pin Header」を選択します。

以下の画面が表示されたら「Configure for compatible hardware」を選択します。

「PWM0」と「PMW2」の項目のところにカーソルを移動してEnterキーを押すと「*」が付きますので、以下のように両方適用した状態にしてください。

「Save pin changes」を選択します。

「Save and exit without rebooting」を選択します。

以下の画面が表示されたら変更完了です。何かキーを押してJetson IO Toolを終了します。

Jetson IO Toolが終了したらJetson Nanoを再起動してください。
Jetson IO Tool起動時のエラー
Jetson IO Toolが起動直後すぐに終了してしまう場合は以下のコマンドを実行してください。
sudo mkdir /boot/dtb
sudo cp -v /boot/tegra210-p3448-0000-p3449-0000-[ab]0[02].dtb /boot/dtb/

ハードウェアPWMの確認
ハードウェアPWMが使えるようになったかを確認します。以下のコマンドを実行してください。
sudo cat /sys/kernel/debug/pwm
pwm-0とpwm-2が「null」になっていれば使用できる状態です。
platform/70110000.pwm, 1 PWM device
pwm-0 (pwm-regulator ): requested enabled period: 2500 ns duty: 0 ns polarity: normal
platform/7000a000.pwm, 4 PWM devices
pwm-0 ((null) ): period: 0 ns duty: 0 ns polarity: normal
pwm-1 (pwm-regulator ): requested enabled period: 8000 ns duty: 1440 ns polarity: normal
pwm-2 ((null) ): period: 0 ns duty: 0 ns polarity: normal
pwm-3 (pwm-fan ): requested enabled period: 45334 ns duty: 0 ns polarity: normal
ハードウェアの接続
今回は特に制御対象等は接続せず、Jetson NanoのGPIOの端子を直接計測します。

GPIO32、GPIO33番ピンとGNDをオシロスコープのプローブに接続しました。この状態でPWM信号を出力して波形を確認します。

今回使用したオシロスコープはOWON製のものです。アマゾン等でも購入することができます。

ハードウェアPWMの実装方法
Pythonで作成するプログラムから、GPIOライブラリの以下のメソッドを使用してPWM信号を出力します。
PWM周波数
GPIO.PWMメソッドでPWM周波数を指定します。単位はHzです。
p = GPIO.PWM(output_pin, FREQUENCY) # set (Hz) frequency
デューティ比
PWMのデューティ比をstartメソッドでしていします。単位は%です。
p.start(90) #set (%) duty-cycle

作成したソースコード
今回作成したソースコードは以下の通りです。
デューティ比を32番ピンは80%、33番ピンは50%と設定してPWMを出力します。
import Jetson.GPIO as GPIO
import time
#PWMピンを指定
output_pin1 = 32
output_pin2 = 33
#デューティを指定
duty1 = 80 #デューティー比を%で指定
duty2 = 50 #デューティー比を%で指定
#PWM周波数を設定
freq = 1000 #PWM周波数をHzで指定
#GPIOのpin指定方法を設定
GPIO.setmode(GPIO.BOARD)
#PWM1
GPIO.setup(output_pin1, GPIO.OUT, initial=GPIO.HIGH)
pwm1 = GPIO.PWM(output_pin1, freq) #周波数を設定
#PWM2
GPIO.setup(output_pin2, GPIO.OUT, initial=GPIO.HIGH)
pwm2 = GPIO.PWM(output_pin2, freq) #周波数を設定
#PWM出力
pwm1.start(duty1) #Dutyを設定
pwm2.start(duty2) #Dutyを設定
try:
while True:
pass
finally:
#CTRL+Cで停止
#PWM停止
pwm1.stop()
pwm2.stop()
#GPIO初期化
GPIO.cleanup()

実行結果
先ほど作成したソースコードを実行します。
Python3 jetson-nano-pwm-test.py
Pythonのプログラムが実行されるとオシロにPWMの波形が表示されました。

1ch目がGPIO32番ピンで80%、2ch目がGPIO33番ピンで50%の波形が正しく表示されています。


まとめ
今回はJetson NanoのPWM信号を出力する方法について解説しました。PWM信号が出力できるとJetsonでモーター制御などもできるようになりますので、ぜひ活用してみてください。
また、以下の記事で効率的にPythonのプログラミングスキルを学べるプログラミングスクールの選び方について解説しています。最近ではほとんどのスクールがオンラインで授業を受けられるようになり、仕事をしながらでも自宅で自分のペースで学習できるようになりました。
スキルアップや副業にぜひ活用してみてください。

スクールではなく、自分でPythonを習得したい方には、いつでもどこでも学べる動画学習プラットフォームのUdemyがおすすめです。
講座単位で購入できるため、スクールに比べ非常に安価(セール時1200円程度~)に学ぶことができます。私も受講しているおすすめの講座を以下の記事でまとめていますので、ぜひ参考にしてみてください。

それでは、また次の記事でお会いしましょう。


参考



コメント