AR Drone 2.0 + 1Sheeld: PCへリアルタイムでフライトデータをストリーミング
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino Mega 2560 | 2 | ドローン搭載側とPC側で1台ずつ使用 |
| 1Sheeld | 1 | スマートフォンのセンサーをArduinoで利用するためのシールド |
| AR Drone 2.0 | 1 | Parrot社製のクアッドコプター |
| XBee モジュール | 2 | ドローン側とPC側の無線通信用(シリーズ1またはシリーズ2) |
プロジェクト概要
このプロジェクトでは、スマートフォンに搭載された各種センサー(加速度計、GPS、ジャイロスコープ、方位センサー、照度センサー、マイクなど)で取得したフライトデータを、AR Drone 2.0に搭載したスマートフォン経由でリアルタイムにPCへストリーミングします。
システム構成は以下の通りです:
- ドローン側(スレーブ):Arduino Mega + 1Sheeld + XBee + スマートフォン
- PC側(マスター):Arduino Mega + XBee + PC(シリアルモニタでデータ表示)
- 2台のXBeeモジュールで無線通信を確立
スマートフォンの豊富なセンサー機能をドローン制御・監視に活用できる、楽しく実用的なプロジェクトです。また、スマートフォンのカメラで空撮も楽しめます。
回路図
ArduinoとXBeeの接続は、ドローン側・PC側ともに共通です。XBeeのVCCを3.3V、GNDをGND、TXをArduinoのRX、RXをArduinoのTXに接続します(レベル変換が必要な場合があります)。

ソースコード
マスターコード(PC側Arduino)
PCに接続されたArduinoに書き込みます。シリアルモニタからコマンドを送信し、ドローン側のセンサーデータを要求します。
事前に AltSoftSerialライブラリ のインストールが必要です。
#include <AltSoftSerial.h>
int verifica = 0;
AltSoftSerial xBee;
char c;
char h;
char stop = 's';
void setup() {
Serial.begin(115200);
Serial.println("Master OK");
Serial.println();
Serial.println("Commands:");
Serial.println("'o' - Orientation sensor");
Serial.println("'a' - Acceleration sensor");
Serial.println("'b' - Brightness sensor");
Serial.println("'g' - GPS position");
Serial.println("'m' - Microphone noise");
Serial.println("'p' - Take a picture");
xBee.begin(9600);
}
void loop() {
Serial.flush();
if (Serial.available() > 0) {
c = Serial.read();
if (c == 'o' || c == 'a' || c == 'm' || c == 'g' || c == 'b' || c == 'p') {
// 各センサーごとに同様の処理を実行(簡略化のため省略)
// 実際のコードでは各センサータイプごとに個別のループ処理を行います
// 's'キーで停止可能
}
}
}
注意: 元のコードは各センサータイプごとにほぼ同一のロジックが繰り返されています。実際の実装では関数化や配列を用いて簡潔に記述することを推奨します。
スレーブコード(ドローン側Arduino)
ドローンに搭載するArduinoに書き込みます。1Sheeld経由でスマートフォンのセンサーデータを取得し、XBeeでマスター側へ送信します。
事前に以下のライブラリが必要です:
#include <OneSheeld.h>
#include <AltSoftSerial.h>
char variabile;
AltSoftSerial xBee;
char master;
int voce = 0;
void setup() {
Serial.begin(115200);
Serial.println("Slave ok");
OneSheeld.begin();
xBee.begin(9600);
}
void loop() {
receiveEvent();
requestEvent();
}
void receiveEvent() {
while (xBee.available() > 0) {
master = xBee.read();
variabile = master;
}
}
void requestEvent() {
if (variabile == 'o') {
xBee.print("X: "); xBee.print(OrientationSensor.getX());
xBee.print(" Y: "); xBee.print(OrientationSensor.getY());
xBee.print(" Z: "); xBee.println(OrientationSensor.getZ());
variabile = 0;
}
if (variabile == 'a') {
xBee.print("X: "); xBee.print(AccelerometerSensor.getX());
xBee.print(" Y: "); xBee.print(AccelerometerSensor.getY());
xBee.print(" Z: "); xBee.println(AccelerometerSensor.getZ());
variabile = 0;
}
if (variabile == 'g') {
xBee.print("Lon: "); xBee.print(GPS.getLongitude());
xBee.print(" Lat: "); xBee.println(GPS.getLatitude());
variabile = 0;
}
if (variabile == 'm') {
xBee.print("dB: "); xBee.println(Mic.getValue());
variabile = 0;
}
if (variabile == 'b') {
xBee.print("Lux: "); xBee.println(LightSensor.getValue());
variabile = 0;
}
if (variabile == 'p') {
Camera.setFlash(ON);
Camera.rearCapture();
xBee.println("Picture taken");
variabile = 0;
}
// 音声フィードバック用コマンド(1〜6, 0)
if (variabile >= '1' && variabile <= '6') {
const char* messages[] = {
"analysis orientation", "analysis acceleration", "analysis brightness",
"analysis GPS position", "analysis decibel noise", "Taking a picture"
};
TextToSpeech.say(messages[variabile - '1']);
variabile = 0;
}
if (variabile == '0') {
TextToSpeech.say("analysis stopped");
variabile = 0;
}
}
改善のポイント
- マスターコードの重複ロジックを関数化し、保守性を向上
- 加速度センサーのY軸・Z軸取得バグ(元コードでは全軸でgetX()を使用)を修正
- XBee通信の信頼性向上のため、パケット構造の導入を推奨
- 電源管理:ドローン側はバッテリー駆動のため、スリープモード活用を検討
製造プロセス
- Drone Pi:スマートフォンとリモコンのデュアル操作対応 Multiwii & Raspberry Pi クアッドコプター
- AIが低解像度衛星画像から世界の非正規居住地を自動検出・マッピング
- メンテナンスドキュメンテーションの極意:資産を守る信頼のアプローチ
- ポンプにコーティングすべきか?メリットとデメリットを天秤にかける
- ウォータージェット切断機の精度と性能を向上させるメンテナンスと設定のポイント
- クラウド革命:IT、セキュリティ、キャリアをどう変えるか
- スマートフォンがコネクテッドカーの未来をどう形作るか
- 2019年、AIとIoTがビジネス運営を変革する6つの方法
- IoT World 2019から見るエッジコンピューティングとIoT戦略のインサイト
- エルビット・システムズ:イスラエルと米国をリードする複合材ソリューション
- 世界染料産業の進化:エコシフト、規制強化、技術革新