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

Bluetooth操作・障害物回避ロボット:スマートなリモート車両の製作

必要な部品と材料

部品数量備考
Arduino Nano R31メインマイコン
L298N デュアルHブリッジモータードライバー1モーター制御用
超音波センサー HC-SR041障害物検知用
HC-05 Bluetoothモジュール1スマホとの通信用
RGB LED(共通アノード)1ステータス表示用
ロジックレベルコンバーター(双方向)1HC-05とArduino間の電圧変換用
抵抗 330Ω1LED電流制限用
ブレッドボード1配線用
ブレッドボード用電源モジュール 5V/3.3V1電源供給用
DCモーター 12V2駆動用
ジャンパーワイヤー(オス/メス)1セット配線用

使用アプリ・オンラインサービス

プロジェクト概要

スマートフォンとBluetooth通信でロボットを制御するプロジェクトです。12年以上のブランクを経て、COVID-19のロックダウン中にロボット製作を再開しました。電子工作とロボティクスは私の好きな趣味の一つです。

Bluetooth操作・障害物回避ロボット:スマートなリモート車両の製作

ロボットはスマートフォンから送信されるBluetooth信号をHC-05モジュールで受信し、Arduino BlueControlアプリで操作します。

Bluetooth操作・障害物回避ロボット:スマートなリモート車両の製作
Bluetooth操作・障害物回避ロボット:スマートなリモート車両の製作
Bluetooth操作・障害物回避ロボット:スマートなリモート車両の製作

システム構成

Arduino Nanoがロボットの頭脳です。HC-05からシリアル通信でコマンドを受信し、L298Nモータードライバー経由で2つのギアードモーターを制御して前進、後退、左右旋回を行います。

Bluetooth操作・障害物回避ロボット:スマートなリモート車両の製作

HC-05のTX/RXピンとArduino Nanoの接続にはロジックレベルコンバーターを使用し、電圧レベルを変換しています。

障害物回避機能

HC-SR04超音波センサーで前方の障害物を検知します。前進中に障害物を検知(距離 < 20cm)すると自動的に停止します。RGB LEDでロボットの状態を表示します。

Bluetooth操作・障害物回避ロボット:スマートなリモート車両の製作

ハードウェア構成

2輪駆動のシャーシにギアードモーター2個を搭載。回路はブレッドボード上に組み、電源モジュールで3.3Vと5Vを供給しています。Arduino Nanoはモーターを直接駆動できないため、L298Nでモーターを駆動します。ArduinoからのPWM信号でENA/ENBピンを制御し、モーター速度を調整します。

Bluetooth操作・障害物回避ロボット:スマートなリモート車両の製作
Bluetooth操作・障害物回避ロボット:スマートなリモート車両の製作

動作デモ

短い動作動画を用意しています。家庭内の自動化、工場内の障害物回避車両などへの応用も可能です。

ソースコード

/* Bluetooth Controlled Obstacle Avoidance Robot
   Prepared by: Alok Talukdar
   Date: 09.05.2020 */
#include <SoftwareSerial.h>

// L298Nモーター制御ピン定義
#define IN1 5   // 右モーター
#define IN2 4   // 右モーター
#define IN3 3   // 左モーター
#define IN4 2   // 左モーター
#define ENA 9   // 右モーターPWM制御
#define ENB 10  // 左モーターPWM制御

// RGB LED制御ピン
#define redLED 8
#define greenLED A0
#define blueLED 11

// HC-SR04超音波センサー
const int trigPin = 6;
const int echoPin = 7;
int i, j, k = 0;
float duration, distance;

// HC-05 Bluetooth
SoftwareSerial mySerial(12, 13); // 12=RX, 13=TX
String data;
int btVal;

void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  mySerial.begin(9600);
  
  pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);
  pinMode(ENA, OUTPUT); pinMode(ENB, OUTPUT);
  pinMode(redLED, OUTPUT); pinMode(blueLED, OUTPUT); pinMode(greenLED, OUTPUT);
  
  digitalWrite(IN1, LOW); digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);
  analogWrite(redLED, 255);  // 共通アノードなのでHIGH=消灯
  digitalWrite(blueLED, HIGH);
  digitalWrite(greenLED, HIGH);
}

void loop() {
  while (mySerial.available()) {
    data = mySerial.readStringUntil('\n');
  }
  btVal = data.toInt();
  
  switch (btVal) {
    case 1:  // 前進
      forward();
      digitalWrite(greenLED, LOW);
      analogWrite(redLED, 255);
      digitalWrite(blueLED, HIGH);
      dist();
      break;
    case 2:  // 後退
      reverse();
      digitalWrite(greenLED, HIGH);
      analogWrite(redLED, 255);
      digitalWrite(blueLED, LOW);
      break;
    case 3:  // 左旋回
      left();
      break;
    case 4:  // 右旋回
      right();
      break;
    case 5:  // 停止
      stoprobot();
      digitalWrite(greenLED, HIGH);
      analogWrite(redLED, 0);
      digitalWrite(blueLED, HIGH);
      break;
    default:
      digitalWrite(greenLED, HIGH);
      analogWrite(redLED, 255);
      digitalWrite(blueLED, HIGH);
      break;
  }
}

// モーター制御関数
void forward() {
  for (i = 0; i <= 100; i++) {
    analogWrite(ENA, i); analogWrite(ENB, i);
    digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
  }
}

void reverse() {
  for (j = 0; j <= 100; j++) {
    analogWrite(ENA, j); analogWrite(ENB, j);
    digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
    digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
  }
}

void left() {
  analogWrite(ENA, 127); analogWrite(ENB, 0);
  digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH); digitalWrite(IN4, HIGH);
}

void right() {
  analogWrite(ENA, 0); analogWrite(ENB, 127);
  digitalWrite(IN1, HIGH); digitalWrite(IN2, HIGH);
  digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
}

void stoprobot() {
  analogWrite(ENA, 0); analogWrite(ENB, 0);
  digitalWrite(IN1, LOW); digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);
}

void dist() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration * 0.0343) / 2;  // 音速340m/s = 0.0343cm/μs
  
  if (distance < 20) {  // 20cm未満で停止
    stoprobot();
    digitalWrite(greenLED, HIGH);
    analogWrite(redLED, 0);
    digitalWrite(blueLED, HIGH);
  }
  delay(1000);
}

回路図

Bluetooth操作・障害物回避ロボット:スマートなリモート車両の製作

製造プロセス

  1. Raspberry Pi で実現する画像認識ベースの障害物回避モバイルロボット
  2. Bluetooth 制御 Raspberry Pi ロボットに音声フィードバックを追加して構築
  3. Arduino & Raspberry Pi でインターネット制御ビデオストリーミングロボットを構築
  4. Raspberry Pi でジェスチャー制御ロボットを構築 – 加速度センサーと RF 通信でハンドフリー操作
  5. Raspberry Pi & Android スマホで Wi-Fi 制御ロボットを構築
  6. Windows 10 IoT Coreで音声制御ロボットを構築 - Raspberry Pi 2編
  7. Pythonで作るWi-Fi制御Raspberry Piロボット - ステップバイステップガイド
  8. ROObockey:精密照準アシスト付きリモコンストリートホッケーロボット
  9. Arduinoと超音波センサーで作るAI障害物回避ロボット 〜Q学習による強化学習実装〜
  10. Arduino Nanoで音声制御ロボットを自作
  11. Ethernet制御ロボットアーム - WIZ750SRとAndroidアプリでリモート操作