Beaver's Hive Logo

Beaver's Hive Blog

Official Web
Post image

メカナムホイールでラジコンをつくったのでジョイスティックで制御できるようにした時の話

明けましておめでとうございます。

Beaver’s Hive正月アドベントカレンダー企画第三弾です。

今回はAmazonで購入したメカナムホイールをDUALSHOCK 4のジョイスティックで制御した時の話です。

リンク先のキットのメカナム4輪とエンコーダ付きのモータとブラケット4個、ベースボードがついてくるシンプルな方を選びました。

マイコンやモータドライバは各々好きなようにしていただければと思います。

参考までに私が使用した構成です

マイコン:ESP32(38Pin-Type-C)

モータドライバ:DRV8833

この記事では以下の内容について説明しようと思います。

  • メカナムホイールの制御方法

下記の内容は特に触れる気がないので興味がある方がいればコメントとかで連絡くれれば何かしらでお伝えできればと思います。(気が向いたらまた記事書こうかな)

  • 組み立て方法
  • 基板の設計方法
  • プログラム関係

こちらが今回作ったメカナムロボットです。

PS4のコントローラ(DUALSHOCK 4)で動かせるようにしました。

メカナムホイールを制御するにあたってぶち当たった壁は2つです。

  1. どうやって取り付けたらいいか?
  2. ジョイスティックに連動した動きにするにはどうしたらいいのか?

どうやって取り付けるか?

メカナムホイールのややこしポイントとして、2種類の異なる形状のタイヤの組み合わせになります。

なので一般的なタイヤやオムニホイールと違って、4輪のどこにどのタイヤがつくのかを考えて組み立てる必要があります。

結論から言うとベースボード上部から見てタイヤがXの向きになっていればOKです!

細かい説明は割愛です。この辺はメカナムホイールの構造とか説明してくれているところを見た方がわかりやすいです。

ジョイスティックに連動した動きにするにはどうしたらいいのか?

メカナムホイールの欠点としてあるのが、非常に直感的にわかりづらい制御方法だと思います。

なので各方向の制御方法についてまとめました。

前後左右斜めの8方向は下記図のように制御すればOKです。

さて、これをジョイスティックの入力と連動させたいと思います。

ジョイスティックからのフィートバック値はY軸とX軸の2値があって、それぞれの入力値は-127~128とします。

各方向に移動したい場合はジョイスティック入力は下記図になります。(数値はわかりやすさのための代表値、カッコ内はジョイスティックから入力されたアナログ値)

ジョイスティックの値から各タイヤの入力値について考えたいと思います。

これまでの情報を表にまとめました。

カッコ内がジョイスティックの代表値で、前進が正の値、後進が負の値、停止が0となるようにしています。

前後はジョイスティックの値をそのまま使えばよさそうな感じがしますね。 

左右についても正負の変換さえしてしまえばそのまま使えそうな感じです。

推進方向
X, Y0, 10, -11, 0-1, 0
右前Y (1)Y (1)-X (-1)X (1)
左前Y (1)Y (1)X (1)-X (-1)
右後Y (1)Y (1)-X (-1)X (1)
左後Y (1)Y (1)X (1)-X (-1)

斜め方向がややこしそうに感じますが、よく見てみるとYの値とXの値を足すか引くかすればつじつまが合いそうな感じがします。(細かいことを言うと128と-127を足しても0にならないじゃねえか、とか-1~1の範囲に収まんないじゃねえかみたいな話はありますが大目に見てください…ここはコード面で補正できるので…)

推進方向右斜め上右斜め下左斜め上左斜め下
X, Y1, 11, -1-1, 1-1, -1
右前Y-X (0)Y-X (-1)Y-X (1)Y-X (0)
左前Y+X (1)Y+X (0)Y+X (0)Y+X (-1)
右後Y-X (1)Y-X (0)Y-X (0)Y-X (-1)
左後Y+X (0)Y+X (-1)Y+X (1)Y+X (0)

前後左右の情報をまとめます。

上下方向についても0入力も考慮すれば、各タイヤについてどの方向に動かそうとも同じ考え方ができることがわかります。

推進方向右斜め上右斜め下左斜め上左斜め下
X, Y0, 10, -11, 0-1, 01, 11, -1-1, 1-1, -1
右前Y+(-X)Y+(-X)(Y)-X(Y)-XY-XY-XY-XY-X
左前Y+(-X)Y+(-X)(Y)+X(Y)+XY+XY+XY+XY+X
右後Y+(-X)Y+(-X)(Y)-X(Y)-XY-XY-XY-XY-X
左後Y+(-X)Y+(-X)(Y)+X(Y)+XY+XY+XY+XY+X

ということでジョイスティックの値と連動した制御ができるようになりました!

あとは実装をするだけですね!(きちんと動くことは確認しました)

本当はサンプルコードなんかを記載できれば親切なんですが回路図用意したりするのが面倒なのでまた別の機会に・・・