ArduinoとMPU-6050で作るジェスチャー制御ロボット(自作ハンドジェスチャーRCカー)
必要な部品と材料
| Arduino UNO | ×1 |
| Arduino Nano R3 | ×1 |
| HC-05 Bluetoothモジュール | ×2 |
| MPU-6050(3軸ジャイロ/加速度センサ、SparkFunブレークアウト) | ×1 |
| DCモータ 12V | ×2 |
| ゴムタイヤ(車輪) | ×1セット |
| L293D デュアルHブリッジモータドライバ(TI製) | ×1 |
| 9V電池(汎用) | ×2 |
必要な工具
- はんだごて(汎用)
- 鉛フリーはんだ
- フォームテープ
- マルチツール/ドライバー
使用するアプリとオンラインサービス
- Arduino IDE
プロジェクト概要
MPU-6050 3軸ジャイロ/加速度センサを使ったジェスチャー制御カーの作り方です。このセンサの使い方、Arduinoとのインターフェース、Bluetoothモジュール経由でのデータ転送を理解すれば、さらに多くの応用が可能です。ここでは2つのHC-05 Bluetoothモジュール間の通信(マスター/スレーブ)に焦点を当てます。
ロボット本体の組み立てと配線は動画を参照してください。
接続図
ロボット側(カー・ユニット)と送信機側(リモート・ユニット)の接続図:

PCBWayで基板発注も可能:PCBWayプロジェクトページ
Bluetoothモジュールの設定(マスター/スレーブ化)
HC-05は出荷時スレーブ設定です。スマホからデータを送るだけならペアリング(デフォルトPIN: 1234/0000)するだけでOK。ですが、モジュールから別のモジュールやスマホへデータを送るには設定変更が必要です。
このプロジェクトでは、MPU-6050で取得したデータをBluetoothモジュールからもう一方のBluetoothモジュールへ送信します。
スレーブ側(カー・ユニット搭載)の設定
- Arduinoと接続(配線図参照)
- 以下のスケッチを書き込み、ATコマンドモードで設定
#include
SoftwareSerial BTSerial(10, 11); // RX | TX
void setup() {
Serial.begin(9600);
Serial.println("Enter AT commands:");
BTSerial.begin(38400); // HC-05のATコマンドモード時のデフォルト速度
}
void loop() {
if (BTSerial.available()) Serial.write(BTSerial.read());
if (Serial.available()) BTSerial.write(Serial.read());
}
- モジュールのボタンを押しながら電源投入(LEDが2秒ごとにゆっくり点滅=ATコマンドモード)
- シリアルモニタを開く(ボーレート9600、改行コード「Both NL & CR」)
ATと送信→OKが返ればOK- 以下のコマンドを順次送信:
AT+ORGL(工場出荷状態にリセット)AT+RMAAD(既存ペアリング解除)AT+UART?(現在のボーレート確認)AT+UART=38400,0,0(ボーレート38400に設定)AT+ROLE?(役割確認:0=スレーブ、1=マスター)AT+ROLE=0(スレーブに設定)AT+ADDR?(モジュールのアドレス確認)→ このアドレスをメモ
マスター側(リモート・ユニット搭載)の設定
- 同様にArduino接続し、ATコマンドモードに入る
- 以下のコマンドを順次送信:
AT+ORGLAT+RMAADAT+UART?AT+UART=38400,0,0AT+ROLE?AT+ROLE=1(マスターに設定)AT+CMODE=0(単一デバイスのみ接続、デフォルトは0)AT+BIND="スレーブ側のアドレス"(スレーブとバインド)
ライブラリとソースコード
MPU-6050用の
ダウンロード:MediaFire(事前にインストール済みならスキップ)
カー・ユニットへの書き込み
USBでPC接続、正しいCOMポートとボードタイプを選択し、Gesture_controled_Robot__car_unit_を書き込み。書き込み中は電池とBluetoothモジュールを外してください。
// カー・ユニット側スケッチ(Shubham Shinganapure作)
int lm1=8, lm2=9, rm1=10, rm2=11;
char d=0;
void setup() {
pinMode(lm1,OUTPUT); pinMode(lm2,OUTPUT);
pinMode(rm1,OUTPUT); pinMode(rm2,OUTPUT);
Serial.begin(38400);
sTOP();
}
void loop() {
if(Serial.available()>0) {
d=Serial.read();
if(d=='F') ForWard();
if(d=='B') BackWard();
if(d=='L') Left();
if(d=='R') Right();
if(d=='S') sTOP();
}
}
void ForWard() { digitalWrite(lm1,HIGH); digitalWrite(lm2,LOW); digitalWrite(rm1,HIGH); digitalWrite(rm2,LOW); }
void BackWard() { digitalWrite(lm1,LOW); digitalWrite(lm2,HIGH); digitalWrite(rm1,LOW); digitalWrite(rm2,HIGH); }
void Left() { digitalWrite(lm1,LOW); digitalWrite(lm2,HIGH); digitalWrite(rm1,HIGH); digitalWrite(rm2,LOW); }
void Right() { digitalWrite(lm1,HIGH); digitalWrite(lm2,LOW); digitalWrite(rm1,LOW); digitalWrite(rm2,HIGH); }
void sTOP() { digitalWrite(lm1,LOW); digitalWrite(lm2,LOW); digitalWrite(rm1,LOW); digitalWrite(rm2,LOW); }
リモート・ユニットへの書き込み
remoteスケッチを開き、リモート・ユニット(Arduino Nano + MPU-6050 + マスターHC-05)に書き込み。
// リモート・ユニット側スケッチ(MPU-6050 DMP使用、ジェスチャー→Bluetooth送信)
#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"
#include
#include
SoftwareSerial BTSerial(10, 11); // RX | TX
MPU6050 mpu;
#define OUTPUT_READABLE_YAWPITCHROLL
bool dmpReady = false;
uint8_t mpuIntStatus, devStatus;
uint16_t packetSize, fifoCount;
uint8_t fifoBuffer[64];
VectorFloat gravity;
Quaternion q;
float ypr[3];
volatile bool mpuInterrupt = false;
void dmpDataReady() { mpuInterrupt = true; }
int bt=8; int x=1;
void setup() {
Wire.begin(); TWBR=24;
Serial.begin(115200); BTSerial.begin(38400);
mpu.initialize();
devStatus = mpu.dmpInitialize();
mpu.setXGyroOffset(220); mpu.setYGyroOffset(76);
mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788);
if(devStatus==0) {
mpu.setDMPEnabled(true);
attachInterrupt(0, dmpDataReady, RISING);
mpuIntStatus = mpu.getIntStatus();
dmpReady = true;
packetSize = mpu.dmpGetFIFOPacketSize();
}
pinMode(bt,INPUT);
}
void loop() {
if(digitalRead(bt)==HIGH) { x++; delay(150); }
if((x%2)==0) {
if(!dmpReady) return;
while(!mpuInterrupt && fifoCount= 25) BTSerial.write('B'); // 後傾 → 後退
else if(ypr[2]*180/M_PI <= -25) BTSerial.write('L'); // 左傾 → 左旋回
else if(ypr[2]*180/M_PI >= 20) BTSerial.write('R'); // 右傾 → 右旋回
else BTSerial.write('S'); // 水平 → 停止
}
} else {
BTSerial.write('S');
}
}
完成と動作確認
スレーブBluetoothをカー・ユニットに、マスターBluetoothをリモート・ユニットに装着。電源を入れれば遊べます!

役に立ったらいいね・シェア・コメントを。YouTubeチャンネル登録もお願いします。Thank you!
回路図

製造プロセス
- Raspberry Pi と Arduino を連携させてロボットを自作:ステップバイステップガイド
- 自宅で作るDIY宿題自動筆記マシン:AxiDraw風ペンプロッターの自作ガイド
- ArduinoとHC-SR04で作るサーボ駆動障害物回避ロボット
- Arduino UNOで作る完全自律ライントラッカーロボット ─ 入門に最適な自作キット
- Arduinoで作るパンチングキーボードボタン:ストレス解消カスタムキー
- 自律型ホームアシスタントロボット「O'nine」の構築 – ROS、Alexa、ロボットアーム完全ガイド
- Arduinoで楽器演奏:音階生成のステップバイステップガイド
- Arduinoと超音波センサーで自動ドアを制御:LCD・ブザー付き完全ガイド
- Arduinoロボットアーム「LittleArm」をAndroidアプリでBluetooth制御
- Bluetooth制御Arduinoカー完全自作ガイド – 3Dプリント&Arduino Nanoで作る2輪ロボット
- Arduino向けスマート屋内ナビゲーションロボットキット