Help us understand the problem. What is going on with this article?

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)としている.

実行結果

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

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした