Raspberry Pi 4+ROSを使ってPS4コントローラーでGPIOを制御する
前回はラズパイにROSをインストールして、PS4コントローラーを使うための環境をセットアップした。今回はラズパイのGPIOピンにLEDを接続して、PS4コントローラーからGPIOを制御することでLチカをやってみる。
実行環境
Raspberry Pi 4 Model B / 4GB
Ubuntu Server 20.04.5 LTS(64-bit)
ROS Noetic Ninjemys
ワイヤレスコントローラーDUALSHOCK 4(Playstation4コントローラー)
pigpioをインストール
GPIO制御にはpigpioを使う。pigpioについては以前以下でも書いたので説明は省略する。
ただし、上の記事ではRaspberrry Pi OSをインストールして使っていたのでpigpioはデフォルトでインストールされていたが、今回はUbuntu ServerをOSとして使っているため、pigpioを自分でインストールする必要がある。
インストールするにはpigpioの公式サイトの説明にある通り、以下の手順を順番にラズパイのターミナルで実行していけばOK。
wget https://github.com/joan2937/pigpio/archive/master.zip unzip master.zip cd pigpio-master make sudo make install
これで準備は完了。
PS4コントローラーの入力を受け取りGPIOを制御するSubscriberを実装
今回はjoyノードからmessageを受けとるsubscriberノードを実装することで、Lチカを実現する(joyは前回の日記でインストール済み)。まずはROSのノードを以下のお決まりのステップで作成。今回はgpio_joyという名前でパッケージをつくり、gpio_joy_test.pyという名前でPythonでコードを実装する。(あとから見るとcatkin_create_pkgは余分なものが入っている気がするが…まぁいいか)
cd ~/catkin_ws/src mkdir gpio_joy cd gpio_joy catkin_create_pkg gpio_joy roscpp rospy std_msgs sensor_msgs cd gpio_joy/src code gpio_joy_test.py
今回はGPIO19にLEDを接続してLチカさせることにした。以下がコードの内容。msg.buttons[0]はPS4コントローラーの□ボタンを押したときに1になり、離したときに0になるので、この入力をpigpioでGPIO19ピンに反映させることで、□ボタンが押されているときにLEDを光らせている。
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import rospy import pigpio from sensor_msgs.msg import Joy GPIO_PIN = 19 pi = pigpio.pi() pi.set_mode(GPIO_PIN, pigpio.OUTPUT) def callback(msg): p_out = msg.buttons[0] pi.write(GPIO_PIN, p_out) def listener(): rospy.init_node('listener', anonymous=True) rospy.Subscriber('/joy', Joy, callback) rospy.spin() if __name__ == '__main__': listener()
コーディングが出来たら、以下で権限をつけておく。
chmod +x gpio_joy_test.py
これでパッケージの準備は完了。
Raspberry PiとLEDを接続してLチカをやってみる
Raspberry PiとLEDはブレッドボードを使って接続する。今回はLEDと抵抗をラズベリーパイの35pin(GPIO 19)と39pin(GND)に接続した。抵抗値は適当に330Ωにしておいた。
あとは以下の順番で実行するだけ。まずはds4drvを実行して、前回と同様PS4コントローラーPSボタン + ShareButtonを長押しして接続する。
sudo ds4drv
次に、pigpiodを起動させておく。
sudo pigpiod
あとはROSのノードを実行していくだけ。もちろんlaunchファイルにまとめてもOK。
roscore
rosrun joy joy_node
rosrun gpio_joy gpio_joy_test.py
以下が実行してみた動画。□ボタンを押したらLEDが点灯していることがわかる。(ちなみにブレッドボードの上の方の回路は過去の残骸なので関係なし笑)
次回はもう少しロボットっぽく(?)、DCモーターをPWM制御して動かしていきたいと思う。
ROS勉強記まとめ
この勉強記は以下のページでまとめてます。