AR Drone 2.0 + 1Sheeld:实时飞行数据流式传输至 PC
组件与物料
| 组件 | 数量 | 备注 |
|---|---|---|
| Arduino Mega 2560 | 2 | 一块安装在无人机上,一块连接电脑 |
| 1Sheeld | 1 | 利用智能手机传感器 |
| AR Drone 2.0 | 1 | 目标无人机平台 |
| XBee 模块 | 2 | 用于地面站与无人机之间的无线通信 |
项目简介
本项目实现通过智能手机记录无人机的各项飞行数据,并经由 1Sheeld 实时传输至电脑端。可获取的数据包括:加速度计、GPS 位置、环境噪音、姿态角、陀螺仪等。
系统采用双 Arduino 架构:一块搭载于无人机,另一块连接地面电脑;两块 XBee 模块负责将 1Sheeld 采集的远程数据传回地面站。这是一种趣味性强且易于上手的方案,能充分发挥智能手机内置传感器的功能,同时还能拍摄精美照片。
代码
主控代码(地面站 Arduino)
该代码烧录在连接电脑的 Arduino 上,用于控制无人机上的从机 Arduino。使用前需安装 AltSoftSerial 库。
#include <AltSoftSerial.h>
int verifica = 0;
AltSoftSerial xBee;
char c, h, stop = 's';
void setup() {
Serial.begin(115200);
Serial.println("Master OK");
Serial.println();
Serial.println("Digit for:");
Serial.println("'o' orientation sensor value");
Serial.println("'a' acceleration sensor value");
Serial.println("'b' brightness sensor value");
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') {
// 方向传感器
if (c == 'o') {
Serial.println("Orientation");
c = '1'; xBee.print(c);
for (int i = 0; i < 10; i++) {
delay(20); c = 'o'; xBee.print(c);
do { h = 0; h = xBee.read(); Serial.print(h); } while (xBee.available() > 0);
delay(100); i = i - 1;
if (Serial.available() > 0) if (stop == Serial.read()) {
Serial.println("Analysis Stopped"); c = '0';
Serial.println(); Serial.println("Digit for:");
Serial.println("'o' orientation sensor value");
Serial.println("'a' acceleration sensor value");
Serial.println("'b' brightness sensor value");
Serial.println("'g' GPS position");
Serial.println("'m' microphone noise");
Serial.println("'p' take a picture");
xBee.print(c); i = 11;
}
}
}
// 加速度传感器
if (c == 'a') {
Serial.println("Acceleration");
c = '2'; xBee.print(c);
for (int i = 0; i < 10; i++) {
delay(20); c = 'a'; xBee.print(c);
do { h = 0; h = xBee.read(); Serial.print(h); } while (xBee.available() > 0);
delay(100); i = i - 1;
if (Serial.available() > 0) if (stop == Serial.read()) {
Serial.println("Analysis Stopped"); c = '0';
Serial.println(); Serial.println("Digit for:");
Serial.println("'o' orientation sensor value");
Serial.println("'a' acceleration sensor value");
Serial.println("'b' brightness sensor value");
Serial.println("'g' GPS position");
Serial.println("'m' microphone noise");
Serial.println("'p' take a picture");
xBee.print(c); i = 11;
}
}
}
// 光照传感器
if (c == 'b') {
Serial.println("Brightness");
c = '3'; xBee.print(c);
for (int i = 0; i < 10; i++) {
delay(20); c = 'b'; xBee.print(c);
do { h = 0; h = xBee.read(); Serial.print(h); } while (xBee.available() > 0);
delay(50); i = i - 1;
if (Serial.available() > 0) if (stop == Serial.read()) {
Serial.println("Analysis Stopped"); c = '0';
Serial.println(); Serial.println("Digit for:");
Serial.println("'o' orientation sensor value");
Serial.println("'a' acceleration sensor value");
Serial.println("'b' brightness sensor value");
Serial.println("'g' GPS position");
Serial.println("'m' microphone noise");
Serial.println("'p' take a picture");
xBee.print(c); i = 11;
}
}
}
// GPS
if (c == 'g') {
Serial.println("GPS Position");
c = '4'; xBee.print(c);
for (int i = 0; i < 10; i++) {
delay(20); c = 'g'; xBee.print(c);
do { h = 0; h = xBee.read(); Serial.print(h); } while (xBee.available() > 0);
delay(500); i = i - 1;
if (Serial.available() > 0) if (stop == Serial.read()) {
Serial.println("Analysis Stopped"); c = '0';
Serial.println(); Serial.println("Digit for:");
Serial.println("'o' orientation sensor value");
Serial.println("'a' acceleration sensor value");
Serial.println("'b' brightness sensor value");
Serial.println("'g' GPS position");
Serial.println("'m' microphone noise");
Serial.println("'p' take a picture");
xBee.print(c); i = 11;
}
}
}
// 麦克风
if (c == 'm') {
Serial.println("Microphone");
c = '5'; xBee.print(c);
for (int i = 0; i < 10; i++) {
delay(20); c = 'm'; xBee.print(c);
do { h = 0; h = xBee.read(); Serial.print(h); } while (xBee.available() > 0);
delay(100); i = i - 1;
if (Serial.available() > 0) if (stop == Serial.read()) {
Serial.println("Analysis Stopped"); c = '0';
Serial.println(); Serial.println("Digit for:");
Serial.println("'o' orientation sensor value");
Serial.println("'a' acceleration sensor value");
Serial.println("'b' brightness sensor value");
Serial.println("'g' GPS position");
Serial.println("'m' microphone noise");
Serial.println("'p' take a picture");
xBee.print(c); i = 11;
}
}
}
// 拍照
if (c == 'p') {
Serial.println("Take a picture");
c = '6'; xBee.print(c); delay(20); c = 'p';
Serial.println(); Serial.println("Digit for:");
Serial.println("'o' orientation sensor value");
Serial.println("'a' acceleration sensor value");
Serial.println("'b' brightness sensor value");
Serial.println("'g' GPS position");
Serial.println("'m' microphone noise");
Serial.println("'p' take a picture");
xBee.print(c);
}
}
}
}
从机代码(无人机端 Arduino)
该代码烧录在安装于无人机的 Arduino 上,负责向地面站发送传感器数据。同样需要 AltSoftSerial 库 以及 1Sheeld 库。
#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.getX());
xBee.print(" Z: "); xBee.println(AccelerometerSensor.getX());
variabile = 0;
}
if (variabile == 'g') {
xBee.print("Longitude: "); xBee.print(GPS.getLongitude());
xBee.print(" Latitude: "); 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;
}
// 语音提示
if (variabile == '1') { TextToSpeech.say("analysis orientation"); variabile = 0; }
if (variabile == '2') { TextToSpeech.say("analysis acceleration"); variabile = 0; }
if (variabile == '3') { TextToSpeech.say("analysis brightness intensity"); variabile = 0; }
if (variabile == '4') { TextToSpeech.say("analysis GPS position"); variabile = 0; }
if (variabile == '5') { TextToSpeech.say("analysis decibel noise"); variabile = 0; }
if (variabile == '6') { TextToSpeech.say("Taking a picture"); variabile = 0; }
if (variabile == '0') { TextToSpeech.say("analysis stopped"); variabile = 0; }
}
原理图
Arduino 与 XBee 的连接方式,地面站端与无人机端相同:
制造工艺