AR 드론 2.0 + 1Sheeld: PC로 실시간 비행 데이터 스트리밍
부품 및 소모품
| 아두이노 메가 2560 |
×2 |
| 1Sheeld |
×1 |
| AR 드론 2.0 |
×1 |
| XBee 모듈 |
×2 |
프로젝트 개요
이 프로젝트는 스마트폰에 기록된 다양한 비행 데이터를 실시간으로 PC에 전송하여 제어합니다. 가속도계 센서, GPS 위치, 드론 소음, 방향, 자이로스코프 등 스마트폰의 모든 센서 데이터를 활용할 수 있습니다.
데이터 제어를 위해 두 개의 아두이노를 사용합니다. 하나는 드론에 장착하고, 다른 하나는 컴퓨터에 연결합니다. 두 개의 XBee 모듈이 1Sheeld의 원격 데이터를 PC로 전송하는 통신 역할을 합니다.
스마트폰의 모든 기능과 센서를 활용하는 재미있고 쉬운 방법이며, 멋진 사진 촬영도 가능합니다.
코드
마스터 코드 (PC 연결용 아두이노)
드론에 장착된 아두이노를 제어하기 위해 PC에 연결된 아두이노에 업로드되는 코드입니다. 먼저 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("명령 입력:");
Serial.println("'o' 방향 센서 값");
Serial.println("'a' 가속도 센서 값");
Serial.println("'b' 조도 센서 값");
Serial.println("'g' GPS 위치");
Serial.println("'m' 마이크 소음");
Serial.println("'p' 사진 촬영");
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("방향 센서");
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("분석 중지됨");
c='0';
Serial.println();
Serial.println("명령 입력:");
Serial.println("'o' 방향 센서 값");
Serial.println("'a' 가속도 센서 값");
Serial.println("'b' 조도 센서 값");
Serial.println("'g' GPS 위치");
Serial.println("'m' 마이크 소음");
Serial.println("'p' 사진 촬영");
xBee.print(c);
i=11;
}
}
}
// 가속도 센서 데이터 요청
if(c=='a'){
Serial.println("가속도 센서");
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("분석 중지됨");
c='0';
Serial.println();
Serial.println("명령 입력:");
Serial.println("'o' 방향 센서 값");
Serial.println("'a' 가속도 센서 값");
Serial.println("'b' 조도 센서 값");
Serial.println("'g' GPS 위치");
Serial.println("'m' 마이크 소음");
Serial.println("'p' 사진 촬영");
xBee.print(c);
i=11;
}
}
}
// 조도 센서 데이터 요청
if(c=='b'){
Serial.println("조도 센서");
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("분석 중지됨");
c='0';
Serial.println();
Serial.println("명령 입력:");
Serial.println("'o' 방향 센서 값");
Serial.println("'a' 가속도 센서 값");
Serial.println("'b' 조도 센서 값");
Serial.println("'g' GPS 위치");
Serial.println("'m' 마이크 소음");
Serial.println("'p' 사진 촬영");
xBee.print(c);
i=11;
}
}
}
// GPS 데이터 요청
if(c=='g'){
Serial.println("GPS 위치");
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("분석 중지됨");
c='0';
Serial.println();
Serial.println("명령 입력:");
Serial.println("'o' 방향 센서 값");
Serial.println("'a' 가속도 센서 값");
Serial.println("'b' 조도 센서 값");
Serial.println("'g' GPS 위치");
Serial.println("'m' 마이크 소음");
Serial.println("'p' 사진 촬영");
xBee.print(c);
i=11;
}
}
}
// 마이크 소음 데이터 요청
if(c=='m'){
Serial.println("마이크");
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("분석 중지됨");
c='0';
Serial.println();
Serial.println("명령 입력:");
Serial.println("'o' 방향 센서 값");
Serial.println("'a' 가속도 센서 값");
Serial.println("'b' 조도 센서 값");
Serial.println("'g' GPS 위치");
Serial.println("'m' 마이크 소음");
Serial.println("'p' 사진 촬영");
xBee.print(c);
i=11;
}
}
}
// 사진 촬영 요청
if(c=='p'){
Serial.println("사진 촬영");
c='6';
xBee.print(c);
delay(20);
c='p';
Serial.println();
Serial.println("명령 입력:");
Serial.println("'o' 방향 센서 값");
Serial.println("'a' 가속도 센서 값");
Serial.println("'b' 조도 센서 값");
Serial.println("'g' GPS 위치");
Serial.println("'m' 마이크 소음");
Serial.println("'p' 사진 촬영");
xBee.print(c);
}
}
}
}
슬레이브 코드 (드론 장착용 아두이노)
드론에 장착되어 지상국으로 데이터를 전송하는 아두이노용 코드입니다. 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.getY());
xBee.print(" Z축: ");
xBee.println(AccelerometerSensor.getZ());
variabile=0;
}
if(variabile=='g'){
xBee.print("경도: ");
xBee.print(GPS.getLongitude());
xBee.print(" 위도: ");
xBee.println(GPS.getLatitude());
variabile=0;
}
if(variabile=='m'){
xBee.print("데시벨: ");
xBee.println(Mic.getValue());
variabile=0;
}
if(variabile=='b'){
xBee.print("루멘: ");
xBee.println(LightSensor.getValue());
variabile=0;
}
if(variabile=='p'){
Camera.setFlash(ON);
Camera.rearCapture();
xBee.println("사진 촬영 완료");
variabile=0;
}
if(variabile=='1'){
TextToSpeech.say("방향 분석 중");
variabile=0;
}
if(variabile=='2'){
TextToSpeech.say("가속도 분석 중");
variabile=0;
}
if(variabile=='3'){
TextToSpeech.say("밝기 분석 중");
variabile=0;
}
if(variabile=='4'){
TextToSpeech.say("GPS 위치 분석 중");
variabile=0;
}
if(variabile=='5'){
TextToSpeech.say("소음 분석 중");
variabile=0;
}
if(variabile=='6'){
TextToSpeech.say("사진 촬영 중");
variabile=0;
}
if(variabile=='0'){
TextToSpeech.say("분석 중지됨");
variabile=0;
}
}
회로도
아두이노와 XBee 간의 연결입니다. 컴퓨터에 연결된 아두이노와 드론에 장착된 아두이노 모두 동일한 방식으로 연결됩니다.
