飛控遙控器原型

最近打算折騰飛控,找了找資料和淘寶,發現一個飛控遙控器都要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

相關文章
相關標籤/搜索