へっぽこ元ロボコニスト

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

MENU

2019/8/15(Raspberry PiのROSからpigpioを使ってGroovy-PIDを動かしてモータを動かす)


スポンサーリンク

タイトルが長い

前回は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ではこれが必ず必要です


f:id:masanari7430:20190727165240j:plain
Groovy-PIDのリセットスイッチを押す

rosrun groovypid Groovy_moter_test

これでモータを動かすことができます

そういえばこの記事でいきなりシリアル通信してるからそれに関して少し書きたいな