Jetson Nano の 2 つのハードウェア PWM を使用できたのでメモに残しておきます。
PCA9685 などの I2C 接続 PWM Servo Driver が不要になります。
※ NVIDIA Developer の元の記事はこちら。
※ 参考にした記事はこちら。
環境
- Jetson Nano
- JetPack 4.3(r32.3.1)イメージファイル (nv-jetson-nano-sd-card-image-r32.3.1.zip)
- Geekservo (灰色) x 2個
手順
最初に root になっておきます。(コマンドプロンプトが $ から # に変わります。)
$ sudo su
#
PWM の状態を確認します。
# cat /sys/kernel/debug/pwm
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: 20000000 ns duty: 2000000 ns polarity: normal
pwm-1 (pwm-regulator ): requested period: 8000 ns duty: 1440 ns polarity: normal
pwm-2 ((null) ): period: 20000000 ns duty: 5000000 ns polarity: normal
pwm-3 (pwm-fan ): requested enabled period: 45334 ns duty: 0 ns polarity: normal
レジスタに PWM の設定をします。
Pin 32 に PWM0 を割り当てます。
# busybox devmem 0x700031fc 32 0x45
# busybox devmem 0x6000d504 32 0x2
Pin 33 に PWM2 を割り当てます。
# busybox devmem 0x70003248 32 0x46
# busybox devmem 0x6000d100 32 0x00
ディレクトリを移動します。
# cd /sys/devices/7000a000.pwm/pwm/pwmchip0
Pin32 の PWM0 を操作します。(値の単位はns)
# echo 0 > export
# echo 20000000 > pwm0/period
# echo 2500000 > pwm0/duty_cycle
# echo 1 > pwm0/enable
Pin33 の PWM2 を操作します。(値の単位はns)
# echo 2 > export
# echo 20000000 > pwm2/period
# echo 1500000 > pwm2/duty_cycle
# echo 1 > pwm2/enable
PWM の状態を確認します。
# cat /sys/kernel/debug/pwm
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 (sysfs ): requested enabled period: 20000000 ns duty: 2500000 ns polarity: normal
pwm-1 (pwm-regulator ): requested period: 8000 ns duty: 3920 ns polarity: normal
pwm-2 (sysfs ): requested enabled period: 20000000 ns duty: 1500000 ns polarity: normal
pwm-3 (pwm-fan ): requested enabled period: 45334 ns duty: 0 ns polarity: normal
一度有効 (enabled) の状態にすれば duty_cycle の値を変更するだけでサーボモーターを動かすことができます。
例として Pin33 の PWM2 を連続操作します。
# echo 1500000 > pwm2/duty_cycle; sleep 1; echo 2500000 > pwm2/duty_cycle
最後に PWM を無効にします。
Pin32 の PWM0 を解除します。
# echo 0 > unexport
Pin33 の PWM2 を解除します。
# echo 2 > unexport