Try   HackMD
tags: Arduino RF24 ArduDrone

RF24 remote control drone

Send

#include <SPI.h> #include "RF24.h" #include <Streaming.h> RF24 rf24(9,10); // CE腳, CSN腳 const byte addr[] = "00001"; short msg[]={0,0,0,0,0,0,0,0,0,0}; void setup() { Serial.begin(9600); rf24.begin(); rf24.setChannel(83); rf24.setPALevel(RF24_PA_MIN); rf24.setDataRate(RF24_2MBPS); rf24.openWritingPipe(addr); rf24.stopListening(); Serial.println("sending"); pinMode(A0,INPUT); pinMode(A1,INPUT); pinMode(A2,INPUT); pinMode(A3,INPUT); pinMode(2,INPUT_PULLUP); pinMode(3,INPUT_PULLUP); pinMode(4,INPUT_PULLUP); pinMode(5,INPUT_PULLUP); pinMode(6,INPUT_PULLUP); pinMode(7,INPUT_PULLUP); } void printData(){ for(int i=0;i<10;i++){ Serial << msg[i] << ' '; }Serial << endl; } void loop() { msg[0]=analogRead(A0), msg[1]=analogRead(A1), msg[2]=analogRead(A2), msg[3]=analogRead(A3); msg[4] = !digitalRead(2), msg[5] = !digitalRead(3), msg[6] = !digitalRead(5), msg[7] = !digitalRead(4); msg[8] = digitalRead(6), msg[9] = digitalRead(7); printData(); rf24.write(&msg, sizeof(msg)); delay(50); }

Receive

#include <Streaming.h> #include <SPI.h> #include "RF24.h" RF24 rf24(8, 7); // CE腳, CSN腳 #include <Servo.h> Servo FL, FR, BL, BR; // 10 9 6 5 #include <Wire.h> #include <MPU6050.h> MPU6050 mpu; const byte addr[] = "00001"; const byte pipe = 1; // 指定通道編號 short msg[] = {0,0,0,0,0,0,0,0,0,0}; short Speed[4] = {0,0,0,0}; short ad[4] = {0,0,0,0}; // -- int volume = 0; //初始速度 void setup() { Serial.begin(9600); rf24.begin(); rf24.setChannel(83); // 設定頻道編號 rf24.setPALevel(RF24_PA_HIGH); rf24.setDataRate(RF24_2MBPS); rf24.openReadingPipe(pipe, addr); // 開啟通道和位址 rf24.startListening(); // 開始監聽無線廣播 Serial.println("nRF24L01 ready!"); FL.attach(10), FR.attach(9), BL.attach(6), BR.attach(5); FL.write(0), FR.write(0), BR.write(0), BL.write(0); //motor initailize & reset delay(100); mpu.begin(0x68, 6); } void printData(){ Serial << "Data: "; for(int i=0;i<10;i++){ Serial << msg[i] << ' '; }Serial << endl; } void printSpeed(){ Serial << "Speed: "; for(int i=0;i<4;i++){ Serial << Speed[i] << ' '; }Serial << endl; } void updown(short i){ for(int j=0;j<4;j++) Speed[j] = i; } void backforth(short i){ short tmp = map(abs(i-498), 0, 512, 0, 10); //move volume if((i-498)>5){ //move forth Speed[2] += tmp; Speed[3] += tmp; Serial << "forward" << endl; }else if((i-498)<-5){ //move back Speed[0] += tmp; Speed[1] += tmp; Serial << "back" << endl; } } void turnLR(short i){ short tmp = map(abs(i-521), 0, 512, 0, 10); //move volume if((i-521)<-5){ //turn left Speed[1] += tmp; Speed[2] += tmp; Serial << "left" << endl; }else if((i-521)>5){ //move right Speed[0] += tmp; Speed[3] += tmp; Serial << "right" << endl; } } void tiltLR(char i){ if(i == 'L'){ Speed[1] += 10; Speed[3] += 10; Serial << "tilt left" <<endl; }else if(i == 'R'){ Speed[0] += 10; Speed[2] += 10; Serial << "tilt right" << endl; } } void balance(int x, int y){ int n=2; if(x>5){ x-=5; Speed[0]-=n*x; Speed[2]-=n*x; Speed[1]+=n*x; Speed[3]+=n*x; } if(x<-5){ x+=5; Speed[0]-=n*x; Speed[2]-=n*x; Speed[1]+=n*x; Speed[3]+=n*x; } if(y>5){ y-=5; Speed[0]-=n*y; Speed[1]-=n*y; Speed[2]+=n*y; Speed[3]+=n*y; } if(y<-5){ y+=5; Speed[0]-=n*y; Speed[1]-=n*y; Speed[2]+=n*y; Speed[3]+=n*y; } } void loop() { mpu.read(); int sx=0, sy=0, sz=0; for(int i=0;i<25;i++){ sx+=mpu.Xaxis(); sy+=mpu.Yaxis(); sz+=mpu.Zaxis(); delay(2); } sx/=25; sy/=25; sz/=25; bool fg = 0; if (rf24.available(&pipe)) { rf24.read(&msg, sizeof(msg)); volume = map(msg[0], 0, 1023, 0, 180); //油門大小 updown(volume); if(abs(msg[2]-498)>=10){ backforth(msg[2]); fg = 1; } //前後 if(abs(msg[3]-521)>=10){ turnLR(msg[3]); fg = 1; } //左右轉 if(msg[4]){ tiltLR('R'); }else if(msg[5]){ tiltLR('L'); fg = 1; } if(fg == 0){ if(abs(sx)>5||abs(sy)>5) balance(sx, sy); } //printSpeed(); //printData(); //Serial << mpu.Xaxis() << ' ' << mpu.Yaxis() << ' ' << mpu.Zaxis() << endl; Serial<<sx<<' '<<sy<<' '<<sz<<endl; FL.write(Speed[0]-ad[0]), FR.write(Speed[1]-ad[1]), BL.write(Speed[2]-ad[2]), BR.write(Speed[3]-ad[3]); //speed write //delay(10); } }

Reference

  1. RF24.h Libraries
  2. Streaming.h Libraries
  3. nRF24L01