Jetson NanoでFPVラジコンを作る(5)
今回はいよいよラジコンのステアリングサーボとモーターを制御してみる。 JetsonにはハードウェアPWMが2系統あるのでそれを使って制御できないか試してみる。
結論からいうと上手くいかなかったが、どうも同じことを試した人はほとんどいなかったようなので一応以下記録として残しておく。
(詳しい人であればそもそもこんな問題は踏まないのかもしれないが)
前回記事
Jetson NanoでFPVラジコンを作る(1) - 自由課題
Jetson NanoでFPVラジコンを作る(2) - 自由課題
Jetson NanoでFPVラジコンを作る(3) - 自由課題
Jetson NanoでFPVラジコンを作る(4) - 自由課題
ここなどを見るとJetsonにはPWM出力が2つついていて、JetPack4.3からスクリプトを使用してピンの設定ができるようになったらしい。
NVIDIA公式の解説は以下。
というわけで説明に沿って起動してみる。
$ sudo /opt/nvidia/jetson-io/jetson-io.py
起動すると以下のような画面が出力される。
=================== Jetson Expansion Header Tool =================== | | | | | 3.3V ( 1) ( 2) 5V | | i2c2 ( 3) ( 4) 5V | | i2c2 ( 5) ( 6) GND | | unused ( 7) ( 8) uartb | | GND ( 9) (10) uartb | | unused (11) (12) unused | | unused (13) (14) GND | | unused (15) (16) unused | | 3.3V (17) (18) unused | | unused (19) (20) GND | | unused (21) (22) unused | | unused (23) (24) unused | | GND (25) (26) unused | | i2c1 (27) (28) i2c1 | | unused (29) (30) GND | | unused (31) (32) unused | | unused (33) (34) GND | | unused (35) (36) unused | | unused (37) (38) unused | | GND (39) (40) unused | | | | | | | | Select one of the following options: | | | | Configure Jetson for compatible hardware | | Configure 40-pin expansion header | | Exit | | | | | | | | | | | | | ====================================================================
ここで"Configure 40-pin expansion header "を選択すると以下のような画面になる。
2ch両方使うのでpwm0とpwm2を有効にする。
=================== Jetson Expansion Header Tool =================== | | | | | Select desired functions (for pins): | | | | [ ] aud_mclk (7) | | [ ] i2s4 (12,35,38,40) | | [*] pwm0 (32) | | [*] pwm2 (33) | | [ ] spi1 (19,21,23,24,26) | | [ ] spi2 (13,16,18,22,37) | | [ ] uartb-cts/rts (11,36) | | | | Back | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ====================================================================
元の画面に戻ると設定を保存してrebootを促す項目が追加されている。
=================== Jetson Expansion Header Tool =================== | | | | | 3.3V ( 1) ( 2) 5V | | i2c2 ( 3) ( 4) 5V | | i2c2 ( 5) ( 6) GND | | unused ( 7) ( 8) uartb | | GND ( 9) (10) uartb | | unused (11) (12) unused | | unused (13) (14) GND | | unused (15) (16) unused | | 3.3V (17) (18) unused | | unused (19) (20) GND | | unused (21) (22) unused | | unused (23) (24) unused | | GND (25) (26) unused | | i2c1 (27) (28) i2c1 | | unused (29) (30) GND | | unused (31) (32) pwm0 | | pwm2 (33) (34) GND | | unused (35) (36) unused | | unused (37) (38) unused | | GND (39) (40) unused | | | | | | | | Select one of the following options: | | | | Save and reboot to reconfigure pins | | Save and exit without rebooting | | Export as Device-Tree Overlay | | Discard pin changes | | Exit | | | | | | | | | ====================================================================
設定はkernelの設定としてdevice treeに保存される。
=================== Jetson Expansion Header Tool =================== | | | | | | | | | | | | | Configuration saved to file | | /boot/kernel_tegra210-p3448-0000-p3449-0000-b00-user-custom.dtb. | | | | Press any key to reboot the system now or Ctrl-C to abort | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ====================================================================
reboot後にpwmデバイスがあるか確認すると、スクリプトで設定した通りにpwm-0とpwm-2という空きのPWMのポートが2つ見えている。
$ sudo 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: 0 ns duty: 0 ns polarity: normal pwm-1 (pwm-regulator ): requested 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
Linux kernelのPWMインターフェイスに関するドキュメントはここ。
ドキュメントの記載通りにPWMコントローラごとにsysfs上にノードができていることが確認できる。アドレスを見るにpwmchip0というのが使用可能なほうのものらしい。
$ ls -la /sys/class/pwm/pwmchip* lrwxrwxrwx 1 root root 0 3月 26 04:47 /sys/class/pwm/pwmchip0 -> ../../devices/7000a000.pwm/pwm/pwmchip0 lrwxrwxrwx 1 root root 0 3月 26 04:56 /sys/class/pwm/pwmchip4 -> ../../devices/70110000.pwm/pwm/pwmchip4
exportというファイルを操作することによりPWMチャンネルをsysfs上からアクセスできるようになる。
$ echo 0 > /sys/class/pwm/pwmchip0/export $ echo 2 > /sys/class/pwm/pwmchip0/export
設定は正しく認識されたらしい。
$ sudo 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 period: 0 ns duty: 0 ns polarity: normal pwm-1 (pwm-regulator ): requested period: 8000 ns duty: 1440 ns polarity: normal pwm-2 (sysfs ): requested period: 0 ns duty: 0 ns polarity: normal pwm-3 (pwm-fan ): requested enabled period: 45334 ns duty: 0 ns polarity: normal
ということで、いよいよ制御を行ってみる。まずはステアリングサーボから。 接続はこんな感じ。電源は3.3Vではなく5Vで、信号線は32番ピンを使用する。
ちなみにケーブルは以下を購入した。
前回記事で調べたところによるとパルスの送信周期は17.5ms、パルス幅は1.5±0.5msということだったので、それぞれns単位にして設定する。
$ echo 17500000 > /sys/class/pwm/pwmchip0/pwm0/period $ echo 1500000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle $ echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable
これで前輪がニュートラル状態で固定された(はず)。
次にサーボを動かしてみる。
$ echo 1000000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle
コマンドを入力した瞬間に前輪がターンした。特に難しいことはしていないが、物理的にものが動くとわくわくする。
つまづいたのは後輪の確認をしている時だった。ラジコンのESCの電源を入れた時点で、まだJetson側のの電源を入れていないのにJetsonのCPUファンが回り始めた。おかしい。そしてJetsonの電源を入れても起動しない。不思議に思って一旦ESCの電源を切った瞬間にJetsonが起動した。
この現象に関連して、実はJetsonの仕様を確認していて気になった項目があった。それは5VのピンはJetsonへの電源供給ができるという記載だった。前回記事でも書いたが、ESCは受信機やステアリングサーボへの電源共有のために5Vのピンに電圧を印加している。おそらくこの点が悪さをしているのではと推測する。
そうだとすれば、ESVの5VをJetsonに接続しなければ良いかと思い、5Vの結線を抜いたりステアリングサーボの電源に直結してみたりしたが、今度はESCがJetsonのPWM信号を認識しない。かなり結線を確認したが、ステアリングサーボは制御できるが駆動モーターは何も反応しない。
そこで、改めてESCとして使用しているTEU-105EUの仕様確認や関連情報を調べてみた。説明書によると受信機への供給電圧は6Vとのこと。またほとんど情報が見つからなかったが、ここによると、電源電圧が6VのときはESCJetsonのPWMが出力する3.3Vの信号は認識しないとのことだった。まあ改めて考えてみるとそれはそうだろうという気もした。
というわけで、Jetson Nano単体ではESCの制御はできなかった。
上記サイトだとロジックレベルコンバーターを使用して動作させているようだが、今回はJetRacerやDonkyCarがやっているようにモータードライバを使用することにする。
続きは次回。
(追記)次回記事 : Jetson Nanoを使ってFPVラジコンを作る(6) - 自由課題