飛控遙控器原型


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

 

好了,后續再迭代。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM