RaspberryPi4+ROS2で電子部品駆動(1):人感センサ+Servo2個

.com


     https://qiita.com/nasu_onigiri/items/dc10c3b0bfcd4754357f
     https://github.com/namiky73/ros2-sample/tree/master/rpi_robot_py  (上記Soft:GITHIB)

     https://qiita.com/myasu/items/5b122c782c5a616d8b60         RaspberryPi4+Ubuntu20.04
     https://qiita.com/myasu/items/a4e036a86976e3081a19         RaspberryPi Raspbian設定
     https://qiita.com/myasu/items/7c61750000c2e8b06fe1          RaspberryPi Ubuntu18.04設定


     https://qiita.com/ttyokoyama/items/935b51128d2d5bb26f15       ServoDriver
     https://sites.google.com/site/memorandumjavaandalgorithm/raspberry-pi-jiang-zuo9-pwmkontorora-pca9685   ServoDriver

ここからの資料元:https://qiita.com/nasu_onigiri/items/dc10c3b0bfcd4754357f
この上記資料はソフト中心に記述されているので、このページでは両方の内容を記述していきます。

【 ハード面 】

 1.人感センサ    HC-SR501  1個    17番PIN(INPUT)
 1.サーボモーター  MG90S   2個    SERVO1_ID=0  SERVO2_ID=3
 1.サーボドライバー PCA9685  1枚    I2C(SERVO_ID=0 ~ SERVO_ID=15)

 GPIOの参考資料:https://tool-lab.com/raspberrypi-startup-24/

  ArduinoUNOの場合の接続例(SDA=A4、SCL=A5)
RaspberryPi4でのI2Cピン配置(I2C1を使います。)

RaspberryPi4全体PIN配置図


RaspberryPi4 の5V出力からは、5.52V程度(ACアダプタ出力)が出てくるので、サーボドライブ基板定格5Vをオーバーするので、抵抗分割で
5V以下に落とします。
人感センサは12VまでOKですが、出力はオープンコレクターでRaspberryPi4の入力耐圧3.3V以下にする必要があります。
従ってOUTPUT端子には、3.3Vからプルアップ抵抗で釣り上げる必要があります。
これらの回路は追加基板上で結線します。


今回はこの各ステップをノード化して、3つのプログラムを作成します。

 1.input: センサ値を読み取って、publishしつづける(だけ)
 1.controller: ↑をsubscribeし、サーボ動作を決定してpublishする
 1.output: ↑をsubscribeし、サーボを動かす(だけ)


【 ROS2 で 自作Pythonパッケージ作成 】
 パッケージ名は rpi_robot_py として、以下進めていきます。

  $ mkdir -p ~/ros2_ws/src
  $ cd ~/ros2_ws/src/

  $ ros2 pkg create --build-type ament_python rpi_robot_py
  $ cd rpi_robot_py


 --build-type ament_python をつけると、Python用パッケージの雛形が作成されます。
 ディレクトリ構造は以下の通りです。<treeコマンドは、デフォルトでは無いので、sudo apt install tree でインストールしておきましょう>

 rpi_robot_py/ の中に、自作Pythonプログラムを作っていきます。


【 input(センサ)ノードの作成 】
0.5秒間隔で人感センサ(HC-SR501)の値をpublishしつづけるだけのノードを作ります。
ノードの再利用性を高めるため、複雑な処理等はこのノードでは行いません。
ただセンサ値を流しつづけることに専念します。



【 output(サーボ)ノードの作成 】
PCA9685と2つのサーボを使って、サーボを動かすノードを作成します。
ここでも複雑な処理はせず、指示をsubscribeしてサーボを動かすことだけに専念します。

また、ROS1では target(実行単位)= node でしたが、ROS2では単一ターゲット内で複数ノードを動かせるとのことなので、せっかくなのでこれも試して
みようと思います。

サーボ用のノード(クラス)を作成し、それを2つインスタンス化して、2つのサーボに割り当てます。


Int8型のメッセージで角度を指定し、/output/servo/left か /output/servo/right でpublishすると、サーボが動くプログラムが完成しました。


【 Controller ノードの作成 】
センサ値を流し続けてくれるノードと、角度を受け取ってサーボを動かすノードが用意できました。
最後に、そのセンサ値を受け取ってサーボの動かし方を決定する、いわゆる知的処理をするノードを作成しましょう。
今回は人感センサの値が False->True に変化したときに左側のサーボを、True->False に変化したときに右側のサーボを適当に動かす
ノードを作成します



【 実行の準備:1
パッケージ作成時に自動生成された setup.py に、今回作成した3つのプログラムの情報を追記。



【 実行の準備:21
launch/ に *.launch.py ファイルを読み込めるようにします。
3つのプログラムを一つ一つ起動するのは面倒なので、まとめて起動するlaunchファイルを用意します。

$ cd ~/ros2_ws/src/rpi_robot_py
$ mkdir launch
$ cd launch
$ touch rpi_robot.launch.py



ここでツリー状態を確認した所、場所を間違えています。
rpi_robot_py が、2つあるので「src」直下の場所ではなく、「rpi_robot_py」の中にある「rpi_robot_py」内に作成する必要があります。
上記で作成したパイソンソフトをすべて移動します。

/ros2_ws/src/rpi_robot_py 内のファイル移動
移動後のファイル構造


ビルドします。
 $ cd ~/ros2_ws
 $ colcon build
 $ . install/setup.bash

最後にpigpioを使うための準備をして、完了です。
 $ sudo pigpiod

ここでエラー(pigpio が見つからない)


【 実行 】
エラーが出たが、GUI画面上でGPIOは有効としているので実行してみます。
 $ ros2 launch rpi_robot_py rpi_robot.launch.py



やはり「pigpio」でエラーが出る。

pigpio 参考UL:https://l-w-i.net/t/raspbian/pigpio_001.txt
RasPi+PCA9685 参考URL:https://nyabot.hatenablog.com/entry/2019/04/24/223040

ここで思い当たるのが、pigpio の未実装と PCA9685 のライブラリーの未実装です。

先ずは、pigpio を実装してみます。
Raspberry Pi の GPIO を制御するには RPi.GPIO ライブラリがよく使われるが、リモートからの制御も可能になる pigpio というライブラリもあるので、
今回は pigpio ライブラリを利用します。

 $ wget abyz.co.uk/rpi/pigpio/pigpio.zip
 $ unzip pigpio.zip
 $ cd PIGPIO
 $ make
 $ sudo make install
上記ではNG
上記のアドレスが間違っています。
 http://abyz.me.uk/rpi/pigpio/download.htmlを参照

 $ wget https://github.com/joan2937/pigpio/archive/master.zip
 $ unzip master.zip
 $ cd pigpio-master
 $ make
 $ sudo make install

これでOKです。
前回、エラーを起こしたコマンドが今回は通った。

 $ sudo pigpiod