search
LoginSignup
4

More than 3 years have passed since last update.

posted at

updated at

ROSとpigpioによるモータ制御

ROS2関係トップページへ

Raspberry Pi 3B+でモータの回転方向・回転速度を制御するプログラムの作成する.
ここではモータドライバとしてTA7291Pを使用する.本当はPWMを使うには向いていなさそう...またPWMによるモータの回転速度を制御する方法は,TA7291PのIN1, IN2にPWMを使用する方法(メジャー)とVrefにPWMを使用する方法がある.

  • INにPWMを使う場合
    • メリット
      • Vrefに加える電圧(実質モータにかける電圧)を自由に選べる
    • デメリット
      • CW(時計回り)ではIN1にPWM信号を,CCW(反時計回り)ではIN2にPWM信号を与えなければならない.よって一つのモータに対して二つのPWM信号生成器が必要
  • VrefにPWMを使う場合
    • メリットとデメリットが逆

準備

ROS2でpigpioの利用 -準備・情報-

回路の準備

とりあえず適当に.OUT1, OUT2をモータに接続し,Vref, IN1, IN2をraspberry piのgpio 18, 23, 24に接続する.

motor_control.png

ROS2プログラミング

作成物:github

ワークスペース名

  • pi_motor_control

ワークスペース以下のパッケージ名

  • pi_motor_control_msgs
    • このプロジェクトで使用するメッセージ用パッケージ
  • pi_motor_control_nodes
    • モータを制御するserviceを提供するnode用パッケージ
  • pi_motor_control_tests
    • nodeを実行するためのターゲット用パッケージ

概要

PiMotorControlNode::handleService_がモータ制御する部分.
gpioWriteでIN1とIN2を操作し,CW, CCWの制御を行っている.
注意点としては,回転方向を変える場合,一旦モータをSTOPにして100μ秒待ってから動かすこととある(TA7291Pのデータシートp.10より)

IN1 IN2 OUT1 OUT2 備考
0 0 切断 切断 STOP
1 0 1 0 CW
0 1 0 1 CCW
1 1 1 1 brake

細々とした説明

Serviceメッセージ

モータ番号とそのモータへの指令を渡すと成功か否かを返す.
一度に複数のモータに指令を送れるように配列になっている.
モータへの指令は-1.0(CCW)~1.0(CW)とする.

モータへの指令からPWM信号への変換

モータへの信号は-1.0~1.0としている.
一方でPWMの信号はpigpioのgpioHardwarePWMを使用しているので0~1000000(1M)である.

回転方向はモータへの指令値から判定し,IN1とIN2の値を設定している.

回転速度はモータへの指令値の絶対値をPWM信号へ変換している.
Raspberry Piのgpio pinの出力は3.3Vである.一方,今回使用しているモータはタミヤの130タイプモータで適正電圧は1.5V~3.0Vっぽい.よってモータへの最大出力3.0Vを表すPWM信号のduty比は以下のようになる.

1000000 * 3.0 / 3.3 ≒ 909090

この辺りの処理をPiMotorControlNode::convMotorCommand関数に任せている.

ビルド・実行

ビルド

Raspberry Pi上でビルド.クロスコンパイルが面倒なので.

ワークスペースのディレクトリに移動
$ colcon build --symlink-install

実行

Raspberry Pi上のターミナル二つで以下を実行.

モータ制御用node実行用
$ sudo -i
ワークスペースに移動
# . install/setup.bash
# ros2 run pi_motor_control_nodes pi_motor_control_node __params:=pi_motor_control_nodes/yaml/pi_motor_control_node.yaml

pigpioはハードウェアを制御するためにsudo権限が必要となるのでsudo -iを行っている.
もしROS_DOMAIN_IDを使っているなら,sudoの後に設定し直すか/root/.bashrcにて設定する必要がある.

nodeへの指令
$ . install/setup.bash
$ ros2 service call /pi_motor_control_node pi_motor_control_msgs/srv/MotorCommands "{target_motors: [0], motor_commands: [0.2]}"
$ ros2 service call /pi_motor_control_node pi_motor_control_msgs/srv/MotorCommands "{target_motors: [0], motor_commands: [-0.2]}"
$ ros2 service call /pi_motor_control_node pi_motor_control_msgs/srv/MotorCommands "{target_motors: [0], motor_commands: [0.0]}"

nodeへの指令は,とりあえずの方法としてコマンドで渡す.最初にCWの方向に20%(0.2),CCWの方向に20%(-0.2),最後に停止(0.0)としている.

実行結果

開けなかったらごめんなさい

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4