工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

レゴWall-EロボットをArduino Nanoで自作:ステップバイステップガイド

必要な部品と材料

レゴ Wall-E(中古入手) ×1
Arduino Nano R3 ×1
DCモーター(汎用) ×2
L298N デュアルモータードライバー ×1
2色LED(3ピン、赤/緑) ×1
赤外線障害物センサ ×1
ブザー(音程再生可能) ×1
9V電池 ×1
抵抗 330Ω ×3
ジャンパワイヤ(汎用) ×20

必要な工具

使用するアプリ

プロジェクト概要

映画『Wall-E』の黄色いヒーローをレゴで再現し、障害物回避機能を持たせました。これが私の初めての電子工作プロジェクトで、基礎を学ぶ絶好の機会となりました。

ステップ1:コードの作成

ソフトウェア開発者として、まず動作仕様をコードに落とし込みました。

// Wall-Eレゴロボット制御プログラム
// 障害物を検知したら停止、周囲を確認して進路変更
#define INFRA_RED 9
#define GREEN_LED 7
#define RED_LED 8
#define BUZZER 10
#define MR_1 A1
#define MR_2 A2
#define MR_ENABLE 5
#define ML_1 A3
#define ML_2 A4
#define ML_ENABLE 6
const int NORMAL_SPEED = 255;

void setup() {
  delay(2000); // リセット後2秒待機(電圧スパイク対策)
  pinMode(GREEN_LED, OUTPUT); pinMode(RED_LED, OUTPUT);
  digitalWrite(RED_LED, LOW); digitalWrite(GREEN_LED, HIGH);
  pinMode(MR_ENABLE, OUTPUT); pinMode(MR_1, OUTPUT); pinMode(MR_2, OUTPUT);
  pinMode(ML_ENABLE, OUTPUT); pinMode(ML_1, OUTPUT); pinMode(ML_2, OUTPUT);
  pinMode(INFRA_RED, INPUT);
  randomSeed(analogRead(0));
  playHello();
}

void loop() {
  driveForwards(NORMAL_SPEED);
  digitalWrite(RED_LED, LOW); digitalWrite(GREEN_LED, HIGH);
  if (digitalRead(INFRA_RED) == LOW) { // 障害物検知(LOW=検知)
    digitalWrite(GREEN_LED, LOW); digitalWrite(RED_LED, HIGH);
    stopDriving(); playUhOh();
    // 左右確認
    turnLeft(500); bool obstacleLeft = (digitalRead(INFRA_RED) == LOW);
    delay(100); turnRight(500); delay(500);
    turnRight(500); bool obstacleRight = (digitalRead(INFRA_RED) == LOW);
    delay(100); turnLeft(500);
    // 進路決定
    if (obstacleLeft && obstacleRight) {
      driveBackwards(NORMAL_SPEED/3);
      for(int i=0;i<5;i++){ tone(BUZZER,1000,500); delay(1000); }
      randomTurn(800,1600);
    } else if (obstacleLeft) turnRight(1000);
    else if (obstacleRight) turnLeft(1000);
    else randomTurn(1000,1800);
  }
  if (random(100) == 0) randomTurn(200,2000); // ランダム行動
}

// モーター制御、サウンド再生等の関数群が続く...

モーター駆動中に電源を切ると電圧スパイクで部品が破損する恐れがあるため、起動時に2秒待機し、リセットボタンを押してから電池を外せるようにしています。起動時は短いメロディを鳴らし、前進開始。赤外線センサは背面のネジで検知距離を調整可能です(超音波センサは目に収まらなかったため不採用)。

左右確認のロジック:両側塞がり→後退しながらビープ音→ランダム方向に旋回。片側のみ塞がり→反対側へ旋回。両側空き→ランダム選択。ランダムターン機能はまだ改良中です(コメントでアイデア募集中)。

ステップ2:配線と組み立て

レゴWall-EロボットをArduino Nanoで自作:ステップバイステップガイド

赤外線センサを目に内蔵するため、分解してレゴピンを接着し、ブルータックで元のパーツを被せました。

レゴWall-EロボットをArduino Nanoで自作:ステップバイステップガイド

モーターはトルクが重要です。レゴテクニックピンを車軸とし、モーターシャフトに包帯テープを巻いて固定。摩擦で剥がれる問題は、ピンの溝にスーパーグルーを流し込んで解決しました。

レゴWall-EロボットをArduino Nanoで自作:ステップバイステップガイド
レゴWall-EロボットをArduino Nanoで自作:ステップバイステップガイド

モーターシールドはお腹にギリギリ収まりました。配線図は色分けで見やすくしています:

レゴWall-EロボットをArduino Nanoで自作:ステップバイステップガイド

電源ピン不足で苦労しました。モーターシールドの5V出力をArduinoの5Vピンに入力する(通常非推奨)方法を採用しましたが、このシールドはレギュレート済み5Vを出力するため安全でした。Vinピンは降圧されるため3.8VになりArduino動作不可。空いたVinから赤外線センサへ5Vを供給しました。少々強引ですが動作しています。

ステップ3:Wall-Eの動作デモ

動画で実際の動作を確認できます。コーナーに追い込まれた時の挙動もテスト済みです。

今後は配線の最適化、ヘッド旋回用サーボ追加、より小型なシールド/ボード導入で全てお腹に収める予定です。

こうしてWall-Eは永遠に幸せに暮らしました。完。

完全なスケッチ(Wall_e_control)

// 全文は上記ステップ1のコードと同一です。必要に応じてコピーしてください。

回路図(Fritzingファイル)

wall-e2_3P6X71BCnP.fzz

ケーブル色の意味:
赤 = 電圧(プラス)
黒 = グランド(マイナス)
黄 = 赤外線センサ信号
橙/緑 = 赤/緑LED入力
紫 = モーター方向制御
青 = モーター速度制御(フリッツィング部品に対応ピンがないため浮いて見える)

製造プロセス

  1. K30 CO2センサで室内空気質をリアルタイム監視する
  2. 1SheeldとArduinoで盲ろう者のコミュニケーションを支援する
  3. スマート貯金箱を作ろう:Arduino Nanoでコインアクセプターを制御
  4. Arduino Unoで作る自動発射レゴ・スターウォーズ砲台
  5. ArduinoとHC-SR04で作るサーボ駆動障害物回避ロボット
  6. ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
  7. DFRobot静電容量式指紋センサーをArduino/ESP8266で使う – 登録・認証・削除の完全ガイド
  8. Arduino UNOで作る完全自律ライントラッカーロボット ─ 入門に最適な自作キット
  9. Arduino MegaとNextion HMIで作る高機能ウェザーステーション
  10. Arduinoベースのヌンチャク操作6自由度ロボットアームキット
  11. Arduino & MPU6050:SG90 & MG996Rサーボの精密制御