最近打算折騰飛控,找了找資料和淘寶,發現一個飛控遙控器都要500起步,實在莫名奇妙,研究了下,沒啥新奇,就本身作吧html
看看效果,只是原型,還要作PCB,目前尺寸仍是很佔空間的。react
遙控器:1個arduino UNO+2個旋轉電位器開關+1個2.4G信號發射器+1塊麪包板git
接收端:1個LED燈+1個舵機+1個arduino UNO+1個2.4G信號接收器+1塊麪包板數組
元器件都是能買到的,單算遙控器端的話,成本在30-40之間。函數
遙控器代碼:
#include <SPI.h> #include <Mirf.h> #include <nRF24L01.h> #include <MirfHardwareSpiDriver.h> void setup() { // put your setup code here, to run once: Serial.begin(9600); Mirf.cePin = 9; //設置CE引腳爲D9 Mirf.csnPin = 10; //設置CE引腳爲D10 Mirf.spi = &MirfHardwareSpi; //加載24L01 SPI Mirf.init(); //初始化nRF24L01 Mirf.setRADDR((byte *)"contr"); Mirf.payload = 2 * sizeof(int); //發送通道,能夠填0~128,收發必須一致。 Mirf.channel = 3; Mirf.config(); //這裏標識寫入了Sender.ino Serial.println("I'm controller..."); } void loop() { int targetValue1=analogRead(A0); int targetValue2=analogRead(A1); int adaptedValue1=map(targetValue1, 0, 1024, 0, 500); int adaptedValue2=map(targetValue2, 0, 1024, 0, 181); send_data((byte *)"react", adaptedValue1, adaptedValue2); delay(20); } void send_data(byte * targetName, int dt1, int dt2) { byte data[Mirf.payload]; data[0] = dt1; data[1] = dt2; Mirf.setTADDR(targetName); Mirf.send(data); //Mirf.send((byte *)&dt); //while死循環等待發送完畢,才能進行下一步操做。 //Serial.println("-->"); while (Mirf.isSending()) { //Serial.print("."); delay(1); } Serial.print(data[0]); Serial.print(" "); Serial.print(data[1]); Serial.println(""); //Serial.println("OK"); }
接收端:
#include <SPI.h> #include <Mirf.h> #include <nRF24L01.h> #include <MirfHardwareSpiDriver.h> #include <Servo.h> Servo myservo; void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(5, OUTPUT); myservo.attach(9); Mirf.cePin = 4; //設置CE引腳爲D4 Mirf.csnPin = 10; //設置CE引腳爲D10 Mirf.spi = &MirfHardwareSpi; //加載24L01 SPI Mirf.init(); //初始化nRF24L01 Mirf.setRADDR((byte *)"react"); Mirf.payload = 2 * sizeof(int); //發送通道,能夠填0~128,收發必須一致。 Mirf.channel = 3; Mirf.config(); //這裏標識寫入了Sender.ino Serial.println("I'm reactor..."); } int dt1=0; int dt2=0; void loop() { // put your main code here, to run repeatedly: byte data[Mirf.payload]; if (Mirf.dataReady()) //等待接收數據準備好 { Mirf.getData(data); //接收數據到data數組 dt1 = (int)data[0]; dt2 = (int)data[1]; Serial.print(dt1); Serial.print(" "); Serial.print(dt2); Serial.println(""); } output_pwm(5, dt1); myservo.write(dt2); } void output_pwm(int pin, int pwm) { int highTime=map(pwm, 0, 500, 0, 1000); int lowTime=1000-highTime; digitalWrite(pin, HIGH); delayMicroseconds(highTime); digitalWrite(pin, LOW); delayMicroseconds(lowTime); }
2.4信號發射器接法(接入arduino UNO)型號是nRF24L01,淘寶上賣7塊錢1個,要完成本實驗的話,須要至少2個,1個發,1個收,型號如出一轍就能夠。
arduino UNO,淘寶賣大約是20一塊
旋轉電位器,淘寶賣5塊一個,在arduino中讀取模擬值
綜上所述,其實就是把2個模擬值(分別來源於2個旋轉電位器)放入byte[] 數組中,用2.4G發送出去(相似PPM)。oop
用到的庫函數文件下載地址:Arduino驅動程序-庫函數.rar
ui
好了,後續再迭代。spa