Bluetooth操作・障害物回避ロボット:スマートなリモート車両の製作
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino Nano R3 | 1 | メインマイコン |
| L298N デュアルHブリッジモータードライバー | 1 | モーター制御用 |
| 超音波センサー HC-SR04 | 1 | 障害物検知用 |
| HC-05 Bluetoothモジュール | 1 | スマホとの通信用 |
| RGB LED(共通アノード) | 1 | ステータス表示用 |
| ロジックレベルコンバーター(双方向) | 1 | HC-05とArduino間の電圧変換用 |
| 抵抗 330Ω | 1 | LED電流制限用 |
| ブレッドボード | 1 | 配線用 |
| ブレッドボード用電源モジュール 5V/3.3V | 1 | 電源供給用 |
| DCモーター 12V | 2 | 駆動用 |
| ジャンパーワイヤー(オス/メス) | 1セット | 配線用 |
使用アプリ・オンラインサービス
- Arduino IDE
- Arduino BlueControl(Google Play Storeで入手可能)
プロジェクト概要
スマートフォンとBluetooth通信でロボットを制御するプロジェクトです。12年以上のブランクを経て、COVID-19のロックダウン中にロボット製作を再開しました。電子工作とロボティクスは私の好きな趣味の一つです。

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



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

HC-05のTX/RXピンとArduino Nanoの接続にはロジックレベルコンバーターを使用し、電圧レベルを変換しています。
障害物回避機能
HC-SR04超音波センサーで前方の障害物を検知します。前進中に障害物を検知(距離 < 20cm)すると自動的に停止します。RGB LEDでロボットの状態を表示します。

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


動作デモ
短い動作動画を用意しています。家庭内の自動化、工場内の障害物回避車両などへの応用も可能です。
ソースコード
/* 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);
}
回路図

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