Arduino Uno互換機を使ってメカナムホイールのラジコンカーを作った

 40,741 total views,  9 views today

以前、レゴテクニックのパーツを利用したメカナムホイール車を作った。

3Dプリンターでレゴ(LEGO)用メカナムホイールを作った
オムニホイールのWi-Fiラジコンカーを3Dプリンターで自作した(ESP32)
スマホで操作できるメカナムホイールのWi-Fiラジコンカーを作った(ESP-WROOM-02)



せっかくメカナムホイールを使っているのだから、キッチリ真横や斜めに移動してほしいところだが、このときは横移動や斜め移動の具合がイマイチだった。


なので、もっとキッチリ真横や斜めに移動できるメカナムホイールのラジコンを作ることにした。


そうして完成したのがこちら↓


動作

リモコン越しに動いている様子



横移動多め


使用パーツ一覧

パーツ 使用品
Arduino Arduino Uno互換機
車体 透明 ユニバーサルプレートL
タイヤ PLAフィラメント
TPUフィラメント
ローテーションサーボ S35 STD
サーボマウント PLAフィラメント
赤外線 受信モジュール
リモコン
バッテリー Anker PowerCore 5000
電池ケース 単3×4 スイッチ・カバー付
ブレッドボード 4.5×3.5 cm 白
ジャンパワイヤ オス-オス

Arduino Uno互換機

以前購入したラズベリーパイ用のパーツセットの中に、赤外線受信モジュールとリモコンがあったので、それとArduino Uno互換機を利用する。


(赤外線受信モジュールとリモコン)



(Arduino Uno互換機)

ローテーションサーボ

ローテーションサーボは通常のサーボモータと異なり、あらかじめ決められた角度までしか回らない、ということはなく、DCモータのようにずっと回り続けるタイプのモータである。


LEGO用メカナムホイールのとき真横に移動できなかったのは、モータの出力差によってモータごとの回転数に差が生じたためではないかと考え、今回は、タイヤの回転数に差が生じなさそうで、かつ、割りと安価に手に入りそうなローテーションサーボを使用することにした。


なお、タイヤ1つにつきモータ1つ、計4つのモータ必要となるが、サーボモータを使用する場合、必要となるGPIOピンの数がDCモータの場合よりも少なくて済む。


GWSの「S35 STD」というモータが安かったので、それを使うことにした。


(ローテーションサーボ)

メカナムホイール

ホイールについては、例によってThingiverseで良さそうなのを探し、3Dプリンターで出力して使う。


色々と探してみた結果、評判が良さそうな44mm Mecanum Wheel (Small, Solid and Low Cost)を試して見ることにした。


(メカナムホイール:ローラー面)






車体

車体には、タミヤの「透明 ユニバーサルプレートL」を使用した。


(透明なユニバーサルプレートL)

サーボモータマウントパーツ

そのままでは、サーボモータをユニバーサルプレートに上手く取り付けることができないので、簡単なL字型のマウントパーツを自作した。


自作マウントパーツのデータについては、以前作った自作のスマホケース同様、Thingiversにアップした。

スポンサーリンク


(マウントパーツ:3モデル)



(マウントパーツ:実物)






(サーボモータに固定)






(サーボモータを車体にマウント)

配線

前述の通り、配線はごく単純である。


(配線)






スケッチ(プログラム)

#include <Servo.h>
#include <IRremote.h>

const int RECV_PIN = 2;

Servo F_R;
Servo F_L;
Servo B_R;
Servo B_L;

IRrecv irrecv(RECV_PIN);
decode_results results;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver

  F_R.attach(3);
  F_L.attach(5);
  B_R.attach(6);
  B_L.attach(9);
}

void loop(){
  if (irrecv.decode(&results)) {
    Serial.println(results.value);
    receive();
    irrecv.resume();
  }
}

void receive() {
  switch (results.value) { 
    case 16724175: //リモコンボタン:1
      DG_UL();
      break;
    case 16718055: //リモコンボタン:2
      FW();
      break;
    case 16743045: //リモコンボタン:3
      DG_UR();
      break;
    case 16716015: //リモコンボタン:4
      SW_L();
      break;
    case 16726215: //リモコンボタン:5
      ST();
      break;
    case 16734885: //リモコンボタン:6
      SW_R();
      break;
    case 16728765: //リモコンボタン:7
      DG_DL();
      break;
    case 16730805: //リモコンボタン:8
      BK();
      break;
    case 16732845: //リモコンボタン:9
      DG_DR();
      break;
    case 16738455: //リモコンボタン:0
      TR();
      break;
    case 16756815: //リモコンボタン:200+
      TL();
      break;
  }
}

void FW() { //前進
  Serial.println("forward");
  F_R.writeMicroseconds(0);
  F_L.writeMicroseconds(3000);
  B_R.writeMicroseconds(0);
  B_L.writeMicroseconds(3000);
}

void TR() { //右旋回
  Serial.println("turn right");
  F_R.writeMicroseconds(3000);
  F_L.writeMicroseconds(3000);
  B_R.writeMicroseconds(3000);
  B_L.writeMicroseconds(3000);
  
}

void TL() { //左旋回
  Serial.println("turn left");
  F_R.writeMicroseconds(0);
  F_L.writeMicroseconds(0);
  B_R.writeMicroseconds(0);
  B_L.writeMicroseconds(0);
}

void BK() { //後退
  Serial.println("back");
  F_R.writeMicroseconds(3000);
  F_L.writeMicroseconds(0);
  B_R.writeMicroseconds(3000);
  B_L.writeMicroseconds(0);
}

void SW_R() { //右移動
  Serial.println("side way right");
  F_R.writeMicroseconds(3000);
  F_L.writeMicroseconds(3000);
  B_R.writeMicroseconds(0);
  B_L.writeMicroseconds(0);
}

void SW_L() { //左移動
  Serial.println("side way left");
  F_R.writeMicroseconds(0);
  F_L.writeMicroseconds(0);
  B_R.writeMicroseconds(3000);
  B_L.writeMicroseconds(3000);
}

void DG_UR() { //右斜め前方移動
  Serial.println("diagonal up right");
  F_R.writeMicroseconds(1500);
  F_L.writeMicroseconds(3000);
  B_R.writeMicroseconds(0);
  B_L.writeMicroseconds(1500);
}

void DG_UL() { //左斜め前方移動
  Serial.println("diagonal up left");
  F_R.writeMicroseconds(0);
  F_L.writeMicroseconds(1500);
  B_R.writeMicroseconds(1500);
  B_L.writeMicroseconds(3000);
}

void DG_DR() { //右斜め後方移動
  Serial.println("diagonal down right");
  F_R.writeMicroseconds(3000);
  F_L.writeMicroseconds(1500);
  B_R.writeMicroseconds(1500);
  B_L.writeMicroseconds(0);
}

void DG_DL() { //左斜め後方移動
  Serial.println("diagonal down left");
  F_R.writeMicroseconds(1500);
  F_L.writeMicroseconds(0);
  B_R.writeMicroseconds(3000);
  B_L.writeMicroseconds(1500);
}

void ST() { //停止
  Serial.println("stop");
  F_R.writeMicroseconds(1500);
  F_L.writeMicroseconds(1500);
  B_R.writeMicroseconds(1500);
  B_L.writeMicroseconds(1500);
}

感想

自作マウントパーツの調整(ネジ穴の位置、大きさ等)に時間がかかったが、その他は割とスムーズにできた。


念願だった真横の移動や斜めの移動ができたので満足した。


次は、Wi-Fi接続でスマホから操作できるようにしたい。

まとめ

  • Arduino Uno互換機を使ってメカナムホイールのラジコンカーを作った
  • サーボモータ用のマウントパーツを自作した
  • 真横や斜めの移動ができて満足した