タイトルが長い
前回はGroovy-PIDのLEDをROSのpigpio経由で動かしました
mozyanari.hatenablog.com
mozyanari.hatenablog.com
次にRaspberry PiのROSからpigpioを使ってGroovy-PIDを動かしてモータを動かします
前回と同様の環境を使っているので,もしやっていないなら動作確認も含めてRaspberry PiのROSからpigpioを使ってGroovy-PIDを動かしてLチカしてみてください
環境
Raspberry Pi 3 B
OS:Ubuntu Mate
ROS:Kinetic
プログラム
今回のプログラムも前回と同様にgitで配布しているので,git cloneで取ってください
github.com
解説
#include <pigpiod_if2.h> pi = pigpio_start(NULL,NULL);
説明するまでもなく初期化です
詳しい説明は以前の記事にあります
mozyanari.hatenablog.com
char m = 0x6d;
char s = 0x73;
char space = 0x20;
char zero = 0x30;
char one = 0x31;
char two = 0x32;
char three = 0x33;
char five = 0x35;
char enter = 0x0D;
モータを動かすコマンドは以下のページにあります
www.omiya-giken.com
今回使用するのは
「m」 「 」(space) 「0」「」(改行)
:オープンループモード
「s」 「 」(space) 「0」「 」(space) 「0」「」(改行)
:モータを止める
「s」 「 」(space) 「0」「 」(space) 「5」「0」「0」「」(改行)
:500の力でモータを回す
この3つが主です
ただ,これをasciiコードで送るのでそれに対応した値を変数として保持しています
int serial_flag = serial_open(pi,"/dev/ttyACM0",57600,0);
ここでUSB接続したシリアルポートを開いています
第一引数
pigpioを初期化した時に返ってきた値を使用しています
第二引数
/dev/ttyACM0を指定していますが,他に接続している物があったり,OSのバージョンによっては違うものが出てくるかもしれませんがその時はここを適宜変更してください
第三引数
Groovy-PIDを動かすのに必要なボーレートは57600なのでここはこの値で固定です
serial_write(pi,serial_flag,&m,1); serial_write(pi,serial_flag,&space,1); serial_write(pi,serial_flag,&zero,1); serial_write(pi,serial_flag,&enter,1);
この部分でシリアル通信でオープンループ設定をしています
第一引数
pigpioを初期化した時に返ってきた値を使用しています
第二引数
シリアル通信を初期化した時の値を使用しています
第一,第二と初期化の時に返ってきた値を使うことで,もしどちらかの初期化が失敗したら動かないようになっています
第三引数
送信したいデータのアドレスを渡しています
//if no [time_sleep], this node don't work time_sleep(0.1);
オープンループ設定をした後にtime_sleep(0.1)がありますが,これを入れないと自分は動きませんでした
このGroovy PIDは送ったコマンドを適宜コールバックして返してくれています
また,エンター入力した後はTeratermで表示を綺麗にするための改行などの3コマンドを送っています
なので,オープンループ設定をした後にすぐに速度指令を送ると,PICはシングルスレッドなので改行コマンドを送信している時に速度指令を受け取ることになり動かないのではと考えています
serial_write(pi,serial_flag,&s,1); serial_write(pi,serial_flag,&space,1); serial_write(pi,serial_flag,&zero,1); serial_write(pi,serial_flag,&space,1); serial_write(pi,serial_flag,&five,1); serial_write(pi,serial_flag,&zero,1); serial_write(pi,serial_flag,&zero,1); serial_write(pi,serial_flag,&enter,1);
この部分で速度指令をしています
この例では
「s」 「 」(space) 「0」「 」(space) 「5」「0」「0」「」(改行)
:500の力でモータを回す
を実行しています
実行
①
sudo pigpiod
まずは絶対にこれを実行します
②
roscore
ROSではこれが必ず必要です
③
Groovy-PIDのリセットスイッチを押す
④
rosrun groovypid Groovy_moter_test
これでモータを動かすことができます
そういえばこの記事でいきなりシリアル通信してるからそれに関して少し書きたいな