使用したROSパッケージは pwm_pca9685。デバイスファイルを経由してI2Cの制御を行うので、ラズパイ等でも使用できるはず。
わざわざROSノードにしなくてもいいような気もするけど、コマンドラインから制御できたり、複数ノードからアクセスできるので結構いい感じ。
動作確認環境
JetSon Nanoを使って、ソフトはJetBotのSDカードイメージにROS Melodicをインストールした状態。
項目 | 内容 |
---|---|
CPUボード | Jetson Nano A02 |
PCA9685 | VKLSVAN PCA9685 16チャンネル 12ビット PWM ドライバー |
OS | Ubuntu 18.04 |
JetPack | 4.4.1 |
JetBot | 0.4.2 |
ROS | Melodic |
ノードの挙動
デフォルトのアクセス先デバイスファイルは/dev/i2c-1。
デフォルトのI2Cアドレスは0x40。
各チャンネルはデフォルトでは5秒以内に異なる値をセットしないとタイムアウトする。
異なる値という点が厳しい。
timeout パラメータの値を書き換えれば、タイムアウト時間を変更できる。値が0の場合はタイムアウトしない。
タイムアウトした場合は timeout_value パラメータで設定されている内容が書き込まれる。
/command トピックに値を送ることで、各チャンネルのPWMを操作できる.
PWMを操作する場合は0〜65535の値をセットする。
duty比0%の場合は0。
duty比100%の場合は65535。
16bitなので注意。実際にPCA9685に送られる値は12bitに丸めた値。
12bitに丸めた結果が0xfffや0以外なら、なぜか1が足される。
-1をセットした場合は、そのチャンネルは操作しない。
セットアップ
$ mkdir -p ~/catkin_ws/src $ cd ~/catkin_ws/src $ git clone https://github.com/dheera/ros-pwm-pca9685 $ cd ~/catkin_ws $ catkin_make $ source devel/setup.bash
ノード起動
$ rosparam set /pca9685_node/timeout "[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]" $ rosrun pwm_pca9685 pca9685_node
動作確認
ノード起動とは別ウィンドウで実行
$ i2cdump -y 1 0x40 No size specified (using byte-data access) 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef 00: 21 04 e2 e4 e8 e0 00 00 00 00 00 00 00 00 00 00 !?????.......... 10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 40: 00 00 00 00 00 00 XX XX XX XX XX XX XX XX XX XX ......XXXXXXXXXX 省略
ノード起動時のduty比は0%なので、この内容でOK。
コマンドラインから全チャンネルのduty比を約3%に変更
$ rostopic pub /command std_msgs/Int32MultiArray -1 '{data:[1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888]}' publishing and latching message for 3.0 seconds
もう一度確認
$ i2cdump -y 1 0x40 No size specified (using byte-data access) 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef 00: 21 04 e2 e4 e8 e0 00 00 77 00 00 00 77 00 00 00 !?????..w...w... 10: 77 00 00 00 77 00 00 00 77 00 00 00 77 00 00 00 w...w...w...w... 20: 77 00 00 00 77 00 00 00 77 00 00 00 77 00 00 00 w...w...w...w... 30: 77 00 00 00 77 00 00 00 77 00 00 00 77 00 00 00 w...w...w...w... 40: 77 00 00 00 77 00 XX XX XX XX XX XX XX XX XX XX w...w.XXXXXXXXXX 省略
1888 >> 4 + 1 = 0x77 なので、想定通りの結果。
補足
I2Cの接続状況を確認
I2Cの接続状況を確認。コマンドを実行してスムーズに表示されない場合は、配線ミス。
$ i2cdetect -r -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: 70 -- -- -- -- -- -- --
launchファイルでノード起動する場合のサンプル
<launch> <node name="pca9685_node" pkg="pwm_pca9685" type="pca9685_node" output="screen"> <rosparam param="timeout">[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]</rosparam> </node> </launch>