ROS MelodicをインストールしたRaspberry PiのGPIOを使ってLチカをやってみました。
pigpioのインストール
GPIOを制御するライブラリとしてpigpioを使用します。このRaspberry Piはubuntu 18.04 LTSで動いているので、ソースからbuildを行います。
公式サイトの情報に従ってダウンロードとインストールを行います。
wget https://github.com/joan2937/pigpio/archive/master.zip unzip master.zip cd pigpio-master make sudo make install
インストールが終わったら、公式サイトの手順にあるようにテストプログラムを実行して正常にインストールされたかを確認します。
pigpioの動作確認
GPIO17(ピン11)をHighにしてみます。
これはからあげさんの記事を参考にしています。
掲載されているサンプルプログラムを動かしてピン11がHighになることを確認しました。
ROSのPublisher/Subscriberの実装
ROS MelodicのPublisher/Subscriberの仕組みを使ってLチカを実装してみます。ここはツクレルさんの記事を参考にしています。
SubscriberではGPIOを制御します。トピックに含まれる情報に従ってGPIOをHigh/Lowに設定します。
#!/usr/bin/env python # -*- coding: utf-8 -*- # gpio_test sub.py import rospy import pigpio from std_msgs.msg import String GPIO_PIN = 17 pi = pigpio.pi() pi.set_mode(GPIO_PIN, pigpio.OUTPUT) def callback(data): rospy.loginfo(rospy.get_caller_id() + 'I heard %s', data.data) p_out = int(data.data) pi.write(GPIO_PIN, p_out) def listener(): rospy.init_node('listener', anonymous=True) rospy.Subscriber('chatter', String, callback) rospy.spin() if __name__ == '__main__': listener()
Publisherは1Hzの周期で”0″と”1″の情報をトピックで送っています。
#!/usr/bin/env python # -*- coding: utf-8 -*- import rospy from std_msgs.msg import String def talker(): pub = rospy.Publisher('chatter', String, queue_size=10) rospy.init_node('talker', anonymous=True) rate = rospy.Rate(1) # 1hz i = 0 while not rospy.is_shutdown(): msg = str(i) rospy.loginfo(msg) pub.publish(msg) rate.sleep() if i == 0: i = 1 else: i = 0 if __name__ == '__main__': try: talker() except rospy.ROSInterruptException: pass
このPublisher/SubscriberによりGPIOが1Hzの周期でHigh/Lowが設定されます。
ROSパッケージの作成
今回のパッケージはgpio_testという名前にして以下の手順で作成しました。Publisherはpub.py、Subscriberはsub.pyとしました。
cd ~/catkin_ws/src mkdir gpio_test cd gpio_test catkin_create_pkg gpio_test roscpp rospy std_msgs cd gpio_test/src vi pub.py vi sub.py chmod +x pub.py sub.py source ~/.bashrc
Lチカの動作確認
このサンプルを動作させてみます。
新たにターミナルを開き以下を実行します。
roscore
別のターミナルを開き以下を実行します。
rosrun gpio_test sub.py
別のターミナルを開き以下を実行します。
rosrun gpio_test pub.py
無事Lチカができました。