50,514 total views, 1 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互換機を利用する。
ローテーションサーボ
ローテーションサーボは通常のサーボモータと異なり、あらかじめ決められた角度までしか回らない、ということはなく、DCモータのようにずっと回り続けるタイプのモータである。
LEGO用メカナムホイールのとき真横に移動できなかったのは、モータの出力差によってモータごとの回転数に差が生じたためではないかと考え、今回は、タイヤの回転数に差が生じなさそうで、かつ、割りと安価に手に入りそうなローテーションサーボを使用することにした。
なお、タイヤ1つにつきモータ1つ、計4つのモータ必要となるが、サーボモータを使用する場合、必要となるGPIOピンの数がDCモータの場合よりも少なくて済む。
GWSの「S35 STD」というモータが安かったので、それを使うことにした。
メカナムホイール
ホイールについては、例によってThingiverseで良さそうなのを探し、3Dプリンターで出力して使う。
色々と探してみた結果、評判が良さそうな44mm Mecanum Wheel (Small, Solid and Low Cost)を試して見ることにした。
車体
車体には、タミヤの「透明 ユニバーサルプレートL」を使用した。
サーボモータマウントパーツ
そのままでは、サーボモータをユニバーサルプレートに上手く取り付けることができないので、簡単なL字型のマウントパーツを自作した。
自作マウントパーツのデータについては、以前作った自作のスマホケース同様、Thingiversにアップした。
配線
前述の通り、配線はごく単純である。
スケッチ(プログラム)
#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互換機を使ってメカナムホイールのラジコンカーを作った
- サーボモータ用のマウントパーツを自作した
- 真横や斜めの移動ができて満足した