へっぽこ元ロボコニスト

ロボコンに燃え尽きた自分が日々の出来事を書くだけのブログです twitter:@mozyanari_tech

MENU

2019/7/25(raspberry piのROS上でpigpioを使ってGPIOからサーボを動かしてみる)


スポンサーリンク

最近のお気に入りのyoutuberは夕闇に誘いし漆黒の天使達
www.youtube.com


前回の記事です
mozyanari.hatenablog.com

Lチカしてから1か月,NorthStarで遊び過ぎてこっちを忘れてました
NorthStarでやったことは,可能ならRosCon JPのLTで発表したいと思っているのでここでは書きませんが面白いものが出来たと思っています
(でもRosConのLT,企業の人がガチでやってるから学生が出来るか心配)

前回はROSにpigpioを導入してLチカをしました
次はPWMを出してサーボを動かしたいと思います

Lチカが出来てpigpioが正常に動いている前提で進めます

ですがサーボはたった一行で終わります

set_servo_pulsewidth

これを使うだけです

また,pigpioを使ったプログラムはgitにすべて挙げていますので好きなようにクローンして使ってください
github.com

プログラム


servo.cpp


(前回書いた記事とは,プログラム作法が全く違いますが,前回のようにクラスまで使うまでもないと感じたのでこのように書いています)

解説

#include <pigpiod_if2.h>
pi = pigpio_start(NULL,NULL);

前回もありましたがこの二行は必須です
ヘッダーと初期化を行っています

set_servo_pulsewidth(pi,26,1500);

abyz.me.uk
今回新しく出てきたのはここだけ
マイコンでサーボのPWMよりも簡単

第一引数

初期化の返り値piを使っているので初期化を失敗すると動きません
見ているとどの関数にもこれが必須な気がします

第二引数

ピン番号を選びます
26なのでGPIO26(ラズパイのピン番号では37)を制御します
(pigpioのいいところとしてGPIOピンのどのピンからでもPWMを出せます
これは本当に便利だし,小さいロボットならマイコンがいらない)

第三引数

パルスの幅を選択します
最小500~最大2500を入れてください
0を入れるとPWMがストップします
リファレンスによると1500程度がサーボ中心の角度らしいです

あとはROSを理解していれば分かると思います
(分からなかったらコメントで質問ください)

CMakeLists.txtの編集

add_executable(servo src/drvo.cpp)
target_link_libraries(servo ${catkin_LIBRARIES})

これはいつも通り必要な部分で

target_link_libraries(servo pigpiod_if2)

これを絶対に忘れないように!!

ROSの実行

ラズパイのGPIO26にサーボをつないで,デーモンをコマンドプロンプト上で実行します

sudo pigpiod

そしてrosrunで上のプログラムを実行するとサーボが1秒間隔でシャキシャキ動くと思います
arduinoよりも安定しているのか,感覚ですがサーボ特有の「ジー」っていう音が小さいように感じました

検証

え?
ラズパイが本当に安定したPWM出せてるの?
本当に50Hzの周波数?
だってラズパイってマイコンみたいにリアルタイム制御向いてないんじゃない?

自分もそう思ったのでロジアナで簡単ですが確認しました

第三引数を1500にしたとき
set_servo_pulsewidth(pi,26,1500);
f:id:masanari7430:20190725113550p:plain
第三引数を1000にしたとき
set_servo_pulsewidth(pi,26,1000);
f:id:masanari7430:20190725113650p:plain


安定していました
他の制御が入るとどうなるかわかりませんが,単体で使用する分には十分な波形だと思います

使っていて思うこと

pigpioとROSが連携しているので今までロボットを動かすのに必要だと考えていたマイコンを減らせるのではと考えています
今まで考えていたのは
ROSが入ったPC➔マイコン➔センサ・モータドライバ
だったのが
ROSが入ったラズパイ➔センサ・モータドライバ
とダイレクトに出来るのではと思います

しかもpigpioはラズパイのすべてのピンがPWM化できるのでそこらのマイコンよりは数が多いです
ただ,どれだけ同時にPWMをちゃんと出力できるか,割り込みもちゃんと使用できるか,ROSの他のノードが重い処理をするとどのような影響がピンに出てくるか,等いろいろ検討することがまだあると思います