Controlador remoto de modelo de 6 canais de código aberto, ultra simples e não mais que 100 linhas de código

Prefácio

Há algum tempo, segui o tutorial do LOLI Great God para tornar o LOLI três gerações de controle, e o efeito foi muito bom. No entanto, como o receptor da terceira geração do LOLI possui uma função de retorno de dados, ou seja, o módulo sem fio do receptor também assume a função de transmitir dados, portanto, o receptor também deve usar o módulo NRF24L01 com um chip de amplificação de potência para obter uma comunicação de longa distância. Isso não apenas aumenta o custo, mas também aumenta o volume. Assim, o autor pretende criar um controle remoto de modelo de 6 canais mais simples e, por acaso, possui um Tiandifei-06X sem receptor, e decide transformá-lo.Depois de consultar os dados, ele realizou as funções básicas da placa de desenvolvimento Arduino Pro Mini. , O efeito não é ruim.

1. Lista de materiais

Módulo USB para TTL * 1

Placa de desenvolvimento Arduino Pro Mini * 2

Módulo de comunicação sem fio NRF24L01 * 2

1 ams1117-3.3 chip de conversão de tensão

 

Capacitor eletrolítico de 100uF * 2

104 capacitância * 2

Interruptor de tripé * 4

10k resistência * 1, 20k resistência * 1

Fios e pinos

2. Hardware

Solde o circuito de acordo com o diagrama esquemático e desfrute da buzina do fio voador.Se você tiver as condições, poderá projetar a PCB para ter uma aparência melhor.

a) Controle remoto

O controle remoto é responsável pelo envio de dados; portanto, use o módulo de comunicação sem fio NRF24L01 que pode transmitir sem fio 2000m;

A linha voadora do autor não aguenta olhar diretamente, o módulo NRF24L01 de 100m não é suficiente e a mudança decisiva foi de 2000m.

 

b) receptor

O receptor é responsável pelo recebimento de dados, basta usar o módulo de comunicação sem fio NRF24L01 de 100 m.

3. Parte do software

a) Controle remoto

Conecte o módulo USB ao TTL ao computador, a fiação dos pinos é a seguinte:

TX0 - RXD
RX1 - TXD
VCC - 3V3
GND - GND

Abra o IDE do Arduino, selecione o programa de controle remoto para abrir, aqui para baixar a biblioteca de pacotes RF24, o método de download é o seguinte:

Projeto "Carregar biblioteca" Gerenciar biblioteca, abra o gerenciador de bibliotecas

Digite RF24 para pesquisar, selecione a biblioteca na figura para instalar e clique em fechar após a instalação; 

Antes de programar o programa, você deve primeiro selecionar seu próprio modelo de placa de desenvolvimento, conforme mostrado na figura abaixo, o processador seleciona seu próprio tipo de placa de desenvolvimento e a porta seleciona o número da porta em que USB para TTL está localizado 

Clique em Upload para programar

Depois de aguardar a conclusão do upload, abra o monitor serial para visualizar os valores dos 4 ADCs;

O endereço de comunicação pode ser alterado para o seu endereço favorito, cada dígito é hexadecimal (0 ~ 9, A ~ F);

Mova o joystick em todas as direções para visualizar o valor de saída através do monitor da porta serial, preencha os valores mínimo, mediano e máximo de cada canal no programa e, finalmente, faça o upload do código novamente.

 O código completo do Arduino é o seguinte:

/* ArduinoProMini-6通道发射器 
 *     by Bilibili 蔡子CaiZi
 *     
 * A0~5 -> 模拟输入,2~5 -> 通道正反开关
 * A6 -> 电压检测
 * 6 -> 蜂鸣器
 * 
 * NRF24L01 | Arduino
 * CE    -> 7
 * CSN   -> 8
 * MOSI  -> 11
 * MISO  -> 12
 * SCK   -> 13
 * IRQ   -> 无连接
 * VCC   -> 小于3.6V
 * GND   -> GND
 */
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
const uint64_t pipeOut = 0xBBBBBBBBB;   //为何这么多B币?与接收器中相同的地址进行通信
RF24 radio(7, 8); // SPI通信,引脚对应关系:CE ->7,CSN ->8
struct Signal {
  byte roll;
  byte pitch;
  byte throttle;
  byte yaw;
  byte gyr;
  byte pit;
};
Signal data;
void ResetData() 
{
  data.roll = 127; // 横滚通道AIL(中心点127)
  data.pitch = 127; // 俯仰通道ELE
  data.throttle = 0; // 信号丢失时,关闭油门THR
  data.yaw = 127; // 航向通道RUD
  data.gyr = 0; //第五通道
  data.pit = 0; //第六通道
}
void setup()
{
  radio.begin();
  radio.openWritingPipe(pipeOut);//pipeOut通信地址
  radio.stopListening(); //发射模式
  ResetData();//初始化6个通道值
  Serial.begin(115200);
  pinMode(2,INPUT);//正反通道开关为数字输入
  pinMode(3,INPUT);
  pinMode(4,INPUT);
  pinMode(5,INPUT);
  pinMode(6,OUTPUT);//蜂鸣器推挽输出
  if (analogRead(A6)*3.28*3/1023<5){//调整3校准电压检测,5为报警电压
    for(int i=0;i<3;i++){
      digitalWrite(6,HIGH);//蜂鸣器响
      delay(100);
      digitalWrite(6,LOW);
      delay(100);
    }
  }
  else{
    digitalWrite(6,HIGH);//蜂鸣器响
    delay(100);
    digitalWrite(6,LOW);
  }
}

// 将ADC获取的0~1023转换到0~255
int chValue(int val, int lower, int middle, int upper, bool reverse)
{
  val = constrain(val, lower, upper);//将val限制在lower~upper范围内
  if ( val < middle )
    val = map(val, lower, middle, 0, 128);
  else
    val = map(val, middle, upper, 128, 255);
  return ( reverse ? 255 - val : val );
}

void loop()
{
  Serial.print("\t");Serial.print(analogRead(A0));//将数据通过串口输出
  Serial.print("\t");Serial.print(analogRead(A1));
  Serial.print("\t");Serial.print(analogRead(A2));
  Serial.print("\t");Serial.println(analogRead(A3));
  // 需要对摇杆的最值、中值进行设置
  data.roll     = chValue( analogRead(A0), 59,  517, 882, digitalRead(2));
  data.pitch    = chValue( analogRead(A1), 115, 525, 896, digitalRead(3));
  data.throttle = chValue( analogRead(A2), 145, 522, 920, digitalRead(4));
  data.yaw      = chValue( analogRead(A3), 70,  530, 925, digitalRead(5));
  data.gyr      = chValue( analogRead(A4), 0,   510, 1020, false ); 
  data.pit      = chValue( analogRead(A5), 0,   510, 1020, false );  
  radio.write(&data, sizeof(Signal));//将数据发送出去
//  Serial.print("\t");Serial.print(data.roll);
//  Serial.print("\t");Serial.print(data.pitch);
//  Serial.print("\t");Serial.print(data.throttle);
//  Serial.print("\t");Serial.print(data.yaw);
//  Serial.print("\t");Serial.print(data.gyr);
//  Serial.print("\t");Serial.println(data.pit);
}

b) receptor

A operação de download no lado do receptor é basicamente a mesma que a operação no controle remoto, que não é repetida aqui.O código completo é o seguinte:

/* ArduinoProMini-6通道接收机 
 *     by Bilibili 蔡子CaiZi
 *     
 * PWM输出 -> 引脚2~6、9
 * 
 * NRF24L01 | Arduino
 * CE    -> 7
 * CSN   -> 8
 * MOSI  -> 11
 * MISO  -> 12
 * SCK   -> 13
 * IRQ   -> 无连接
 * VCC   -> 小于3.6V
 * GND   -> GND
 */
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>
int ch_width_1 = 0, ch_width_2 = 0, ch_width_3 = 0, ch_width_4 = 0, ch_width_5 = 0, ch_width_6 = 0;
Servo ch1; Servo ch2; Servo ch3; Servo ch4; Servo ch5; Servo ch6;
struct Signal {    
  byte roll;
  byte pitch;
  byte throttle;  
  byte yaw;
  byte gyr;
  byte pit;
};
Signal data;
const uint64_t pipeIn = 0xBBBBBBBBB;//与发射端地址相同
RF24 radio(7, 8); 
void ResetData()
{
  data.roll = 127; // 横滚通道中心点(254/2 = 127)
  data.pitch = 127; // 俯仰通道
  data.throttle = 0; // 信号丢失时,关闭油门
  data.yaw = 127; // 航向通道
  data.gyr = 0; //第五通道
  data.pit = 0; //第六通道
}
void setup()
{
  //设置PWM信号输出引脚
  ch1.attach(2);
  ch2.attach(3);
  ch3.attach(4);
  ch4.attach(5);
  ch5.attach(6);
  ch6.attach(9);
  //配置NRF24L01模块
  ResetData();
  radio.begin();
  radio.openReadingPipe(1,pipeIn);//与发射端地址相同
  radio.startListening(); //接收模式
  pinMode(LED_BUILTIN,OUTPUT);//LED推挽输出
  digitalWrite(LED_BUILTIN,HIGH);
  Serial.begin(115200);
}
unsigned long lastRecvTime = 0;
void recvData()
{
  while ( radio.available() ) {
    radio.read(&data, sizeof(Signal));//接收数据
    lastRecvTime = millis();   //当前时间ms
  }
}
void loop()
{
  recvData();
  unsigned long now = millis();
  if ( now - lastRecvTime > 1000 ) {
    ResetData(); //两次接收超过1s表示失去信号,输出reset值
//    Serial.print("无信号");
    digitalWrite(LED_BUILTIN,HIGH);
  }
  else{
    digitalWrite(LED_BUILTIN,LOW);
    }
  ch_width_1 = map(data.roll,     0, 255, 1000, 2000);// 将0~255映射到1000~2000,即1ms~2ms/20ms的PWM输出
  ch_width_2 = map(data.pitch,    0, 255, 1000, 2000);
  ch_width_3 = map(data.throttle, 0, 255, 1000, 2000);
  ch_width_4 = map(data.yaw,      0, 255, 1000, 2000);
  ch_width_5 = map(data.gyr,      0, 255, 1000, 2000);
  ch_width_6 = map(data.pit,      0, 255, 1000, 2000);
  Serial.print("\t");Serial.print(ch_width_1);
  Serial.print("\t");Serial.print(ch_width_2);
  Serial.print("\t");Serial.print(ch_width_3);
  Serial.print("\t");Serial.print(ch_width_4);
  Serial.print("\t");Serial.print(ch_width_5);
  Serial.print("\t");Serial.println(ch_width_6);
  // 将PWM信号输出至引脚
  ch1.writeMicroseconds(ch_width_1);//写入us值
  ch2.writeMicroseconds(ch_width_2);
  ch3.writeMicroseconds(ch_width_3);
  ch4.writeMicroseconds(ch_width_4);
  ch5.writeMicroseconds(ch_width_5);
  ch6.writeMicroseconds(ch_width_6);
}

4. Consiga o efeito

O vídeo foi enviado para a estação B : https://www.bilibili.com/video/BV1Wk4y1R7N3/

No teste de distância real, não há pressão para a transmissão sem fio de 1000m. No momento, apenas a função básica de controle remoto de 6 canais foi realizada e, posteriormente, continuará otimizando e melhorando, e planejando melhorar a direção:

  1. No lado do controle remoto, o display OLED + a detecção de teclas são adicionados para facilitar a interação homem-computador;
  2. No receptor, adicione saída SBUS e saída PPM.

Link de referência

http://www.rcpano.net/2020/04/09/how-to-make-6-channel-radio-control-for-models-diy-proportional-rc/

Publicado 18 artigos originais · elogiou 34 · 40.000+ visualizações

Acho que você gosta

Origin blog.csdn.net/weixin_42268054/article/details/105536264
Recomendado
Clasificación