最近打算折騰飛控,找了找資料和淘寶,發現一個飛控遙控器都要500起步,實在莫名奇妙,研究了下,沒啥新奇,就自己做吧
看看效果,只是原型,還要做PCB,目前尺寸還是很占空間的。
遙控器:1個arduino UNO+2個旋轉電位器開關+1個2.4G信號發射器+1塊面包板
接收端: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)。
用到的庫函數文件下載地址:Arduino驅動程序-庫函數.rar
好了,后續再迭代。