早く社会人になって,自分の金でデバイスを買いたい
学部4年の頃から研究でROSを使っていて常に困っていることがありました
それはROSからLEDやモータなどを動かせないということです
金を積んでDynamixelを買えば高性能なサーボを使えますし,実験ではturtlebotを代機として使えばいいとは思います
また,rosserial_arduinoを使えばPCからarduinoをノードとして操作できます
www.besttechnology.co.jp
www.turtlebot.com
ただ,学生ロボコンをしていた自分としては中華サーボのトルクが小さい物を動かして遊んでみたいですし,エンコーダの生値を読んでモータにPID制御をかけて発振させて遊んでみたいのです
また,arduinoしか動かせないのはスペック的につらいです
そこで目標としては,ROSが乗ったデバイスからLEDやモータを動かします
(ただROS2が出てきて組み込みマイコンにそもそもROS2が乗るのですぐオワコンになりそう)
今回はその最初としてRaspberry Pi上のROSからIOピンを使ってLチカをします
そのためには様々な方法が現在あります
- WiringPi
- RPi.GPIO
qiita.com
ですが,自分は出来るだけPWMもあって,SPIやI2Cなどの操作もしたい
さらに,ROSから動かしたいというのがあったのでpigpioを使いました
pigpioのインストール
インストールは以下のページを参考にしました
karaage.hatenadiary.jp
sudo apt-get update
sudo apt-get install pigpio
ROS上でcppプログラムを書く
書き方は以下のページを参考にしました
botalab.tech
またリファレンスはここです
https://abyz.me.uk/rpi/pigpio/pdif2.htmlabyz.me.ukabyz.me.uk
まずは適当にパッケージを作って,cppファイルを書きます
gpioという名前にしました
#include <ros/ros.h> #include <pigpiod_if2.h> #include <std_msgs/Bool.h> class gpio{ //construct public: gpio(); private: int pi; void cb_LED(const std_msgs::Bool::ConstPtr &data); ros::NodeHandle nh; ros::Subscriber sub_led; }; gpio::gpio(){ pi = pigpio_start(NULL,NULL); sub_led = nh.subscribe("/led", 5, &gpio::cb_LED, this); } void gpio::cb_LED(const std_msgs::Bool::ConstPtr &data){ if(data->data == 1){ gpio_write(pi,26,1); }else{ gpio_write(pi,26,0); } } int main(int argc, char** argv){ ros::init(argc, argv, "gpio"); gpio gpio; ros::spin(); return 0; }
解説
#include <pigpiod_if2.h>
ヘッダーファイルがこれです
ネットで検索しているとpythonで書かれている物ではpigpio.hをインクルードしていたりしていてるのですが何が違うかいまいち分かりません
pi = pigpio_start(NULL,NULL);
ここで初期化します
初期化に成功すると0以上の整数値が返ってきます
ローカルで動かすのでNULLを引数として入れていますが,リファレンスを見るとIPアドレスとポートを指定できるのでもしかしたら別のPCにこのノードを立てて動かせるかも?
gpio_write(pi,26,1);
第一引数
piを入れている場所に負の値が入ると動きません
ここに初期化の時に帰ってきた値を使うことで初期化失敗しているときには動きません
第二引数
ここでピン番号を選びます
今回は26なのでGPIO26(ラズパイのピン番号では37)を制御します
第三引数
ここではGPIOのHighかLowかを選びます
1だとHighで電圧をかけます
あとはROSを理解していれば分かると思います
(分からなかったらコメントで質問ください)
CMakeLists.txtの編集
大体,ノードを作るとCMakeに
add_executable(gpio src/gpio.cpp) target_link_libraries(gpio ${catkin_LIBRARIES})
を書くと思います
ただ今回は
target_link_libraries(gpio pigpiod_if2)
をさらに追加する必要があります
(これが一番大事)
これを書いておかないとコンパイルが通りません
ROSの実行
ラズパイのGPIO26にLEDと抵抗をつないで,デーモンをコマンドプロンプト上で実行します
sudo pigpiod
そして,gpioノードを実行して,/ledにtrueを送るとLEDが光ります
これでROS上でラズパイのGPIOを制御することが出来ました
追記2019/8/25
この内容に関して瀬戸内ROS勉強会で「ROS搭載ラズパイでLチカしてみる」で発表しました
ros.xrea.jp