へっぽこ元ロボコニスト

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

2019/6/27(raspberry piのROS上でpigpioを使ってLチカしてみる)

早く社会人になって,自分の金でデバイスを買いたい

学部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

tool-lab.com

  • 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
またリファレンスはここです
abyz.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を制御することが出来ました