Fazendo um simples barco aero RC

Às vezes, na Internet, vejo perguntas de iniciantes que desejam construir um quadrocopter do zero e escrevemos firmware para ele. Eu mesmo sou assim e, para praticar a criação de modelos de RC, decidi começar com algo mais simples.



No artigo em detalhes, ele descreveu o algoritmo do barco, o painel de controle e a escolha dos componentes.

?


  1. ;
  2. ;
  3. ;
  4. , -.

Veículos voadores é ótimo, mas difícil. Você não pode simplesmente desligar os parafusos no ar se algo der errado. Sim, é necessário um impulso específico muito decente, mesmo para aeronaves, para não mencionar o multicopter.

Plataformas como esta



( uma descrição mais detalhada aqui).

eles só podem se mover, na maioria dos casos, uma superfície lisa artificial e seu controle é muito diferente.

Mas na água podemos navegar para qualquer lugar, o que no futuro pode nos dar a oportunidade de fazer o piloto automático usando GPS. O design clássico com uma hélice é complicado para mim pela unidade de saída do eixo da carcaça - não consigo imaginar como vedá-la.

Mais vantagens de um sistema de propulsão a ar:
  1. Pode ser colocado em diferentes plataformas: um barco, trenó, um pedaço de espuma ...
  2. Não pega no fundo ou nas algas.

É necessário que o dispositivo possa girar. Existem 3 opções:
  1. Um parafuso + volante para voltas ;
  2. Um parafuso + seu sistema de torneamento ;
  3. Dois parafusos fixos. Transformar mudando seus desejos é a maneira mais fácil. Ele usou isso.


Controle remoto


Princípio de operação


1 joystick + vários interruptores. A tarefa do controle remoto é enviar dados sobre a posição da alavanca do joystick e alternar várias vezes por segundo.

O que fazer


Primeiro, você precisa de um transmissor de rádio. A opção mais barata é NRF24L01 +, custa US $ 0,85 .

Em segundo lugar, você precisa de um joystick. Mais $ 1 .

Vários switches - $ 0,12 .

Bem, tudo isso é fixado em um pedaço de PCB por US $ 0,13 .

Já contava US $ 2,1, mas ainda precisava de MK e comida. Tudo não está tão claro aqui.

Olhando para o futuro, direi que ATmega8 ou STM8S103F3P6 é suficiente, mas desde que iniciei este projeto por um longo tempo e havia pouca experiência, coloquei-o no painel de controle do Arduino Pro Mini e no barco Arduino Nano (ATmega32P em todos os lugares).

No controle remoto ainda necessário:
  1. Conversor de energia 0,9 - 5 V -> 5 V para alimentar o Arduino por US $ 0,35 (o conector USB, juntamente com um pedaço da placa, pode ser quebrado por compacidade);
  2. O estabilizador AMS1117-3.3 de 3.3V para alimentar o módulo de rádio, custa US $ 0,03 por unidade ;
  3. Compartimento da bateria para a bateria de um dedo por US $ 0,15 ;

Total mais US $ 0,53. Além do controlador, um par de capacitores e fios, o custo dos componentes do console é de US $ 2,63.

Enchimento do modelo RC


Componentes


Tudo vem dos motores. Quais motores você compra, os eletrônicos precisam ser instalados com essa potência e a base (embarcação, trenó) será necessária para a capacidade de carga correspondente. E ideologicamente, tudo o mais é necessário apenas para girar os parafusos na velocidade certa.

Comprei esses motores com hélices


por US $ 2,88 por par .

Levei o L293D como motorista - outros US $ 0,35 .
E então há um problema
L293D . , .

Alimento. Vamos precisar de até três tensões de alimentação:
  1. 5 V para todos os componentes eletrônicos, exceto o módulo de rádio;
  2. 3,3 V para o módulo de rádio;
  3. para motores tanto quanto eles precisam (mina 4,2 V).

1 e 2, temos o mesmo que no painel de controle e, nos motores, colocamos o MT3608 por US $ 0,86 .

Agora a parte divertida: o giroscópio. O módulo MPU-6050 custa US $ 1,53 . Havia o desejo de também usar o acelerômetro, para que, quando o manche do joystick se mova para o lado, o navio se desdobre no lugar. Mas, no final, ele abandonou a ideia: uma ligeira inclinação, e o sistema começa a pensar que está acelerando para frente ou para trás. Acabou sendo mais fácil colocar o navio no lugar apenas compensando o movimento de avanço / retrocesso com o joystick.

Adicione a isso US $ 0,4 para o compartimento da bateria para 2 células AA e obtenha componentes de US $ 6,4 sem um controlador e fios.

O programa


E, novamente, vamos partir dos motores. Cada um dos dois motores acionados pelo L293D pode ou não escavar :
  1. Gire para a frente;
  2. Gire para trás;
  3. Não torça.

Para facilitar a leitura do código, escreva
6 funções
inline void motLeftStop(){
  PORTD &= ~(1 << MOT_LEFT_PLUS);
  PORTD &= ~(1 << MOT_LEFT_MINUS);
}

inline void motLeftForward(){    
  PORTD |= 1 << MOT_LEFT_PLUS;
  PORTD &= ~(1 << MOT_LEFT_MINUS);
}

inline void motLeftBackward(){
  PORTD &= ~(1 << MOT_LEFT_PLUS);
  PORTD |= 1 << MOT_LEFT_MINUS;
}

inline void motRightStop(){
  PORTD &= ~(1 << MOT_RIGHT_PLUS);
  PORTD &= ~(1 << MOT_RIGHT_MINUS);
}

inline void motRightForward(){
  PORTD |= 1 << MOT_RIGHT_PLUS;
  PORTD &= ~(1 << MOT_RIGHT_MINUS);
}

inline void motRightBackward(){
  PORTD &= ~(1 << MOT_RIGHT_PLUS);
  PORTD |= 1 << MOT_RIGHT_MINUS;
}


Agora queremos controlar a velocidade de rotação dos parafusos. Obviamente, faremos isso usando o PWM. Não sei se esse PWM pode ser feito em hardware ... fiz-o programaticamente em interrupções. Declarar um par de variáveis ​​globais
int8_t motLeft = 0, motRight = 0; // -127..+127

Permita que os valores dessas variáveis ​​<0 signifiquem que você precisa recuar, os valores> 0 - avançar e, se forem 0, não precisará torcer.
Vamos escrever manipuladores de interrupção de timer
ISR(TIMER2_OVF_vect)
{
  if(motLeft > 0)
    motLeftForward();
  else if(motLeft < 0)
    motLeftBackward();
  if(motRight > 0)
    motRightForward();
  else if(motRight < 0)
    motRightBackward();
}

ISR(TIMER2_COMPA_vect)
{
  motLeftStop();
}

ISR(TIMER2_COMPB_vect)
{
  motRightStop();
}


Agora, para alterar a velocidade de rotação da hélice, precisamos executar 2 ações:
  1. Escreva um valor positivo, negativo ou zero em motLeft / motRight (o módulo não é importante);
  2. Registre a "velocidade de rotação" em OCR2A / OCR2B.

Vamos escrever mais algumas funções para isso
void setMotLeft(int8_t v){ // -127..+127
  if(abs(v) < 5) v = 0;
  motLeft = v;  
  OCR2A = abs(v) * 2;
}

void setMotRight(int8_t v){ // -127..+127
  if(abs(v) < 5) v = 0;
  motRight = v;
  OCR2B = abs(v) * 2;
}


if(abs(v) < 5) v = 0;

OCR2x 5 ( ).

Agora resta configurar os pinos MK e o timer
void motInit(){
  DDRD |= (1 << MOT_LEFT_PLUS) | (1 << MOT_LEFT_MINUS) | (1 << MOT_RIGHT_PLUS) | (1 << MOT_RIGHT_MINUS);
  //TCCR2B |= (1 << CS22)|(1 << CS21)|(1 << CS20); // set up timer with prescaler = 1024.   16 
  //TCCR2B |= (1 << CS22)|(0 << CS21)|(0 << CS20); // set up timer with prescaler = 64.   1 
  TCCR2B |= (0 << CS22)|(1 << CS21)|(0 << CS20); // set up timer with prescaler = 8.  128 
  //TCCR2B |= (0 << CS22)|(0 << CS21)|(1 << CS20); // set up timer with prescaler = 1.  16 
  TIMSK2 |= (1 << TOIE2)|(1 << OCIE2A)|(1 << OCIE2B); // enable overflow interrupt
  TCCR2A &= ~(3); // set WGM20 = 0, WGM21 = 0
  TCCR2B &= ~(1 << 3); // set WGM22 = 0
  setMotLeft(0);
  setMotRight(0);
  sei();
}


E você pode controlar os motores simplesmente chamando as funções setMotLeft (int8_t v) e setMotRight (int8_t v).

Mas queremos controlar o barco errado! Queremos dar comandos como "frente / trás" e "direita / esquerda"! E deixe-a descobrir que hélices ela precisa torcer para isso. Além disso, quero que o próprio barco compense o efeito de giro do vento, correntes e ... hélices tortas!

Vamos agora do outro lado. Do controle remoto. No caso mais simples, o algoritmo de sua operação é o seguinte:
  1. Ao ligar a alimentação, lembre-se da posição inicial do joystick;
  2. No ciclo, leia a posição do joystick, subtraia a posição zero e envie dados para o barco.

Nosso módulo de rádio suporta pacotes de até 32 bytes. Para não lembrar dos deslocamentos, usaremos o registro
struct ControlStatus{
  int16_t x,y;
}  controlStatus;

Como segue
    uint8_t packet[MAX_BUFF]; 
    memset(packet, 0, MAX_BUFF);    
    controlStatus.x = (int16_t)analogRead(1) - x0;
    controlStatus.y = (int16_t)analogRead(0) - y0;
    memcpy(packet, &controlStatus, sizeof(controlStatus));
    Mirf.send(packet);
    while(Mirf.isSending()){;};


No lado do receptor, declararemos exatamente o mesmo registro e
nós vamos preenchê-lo
  while (Mirf.dataReady()) { 
    uint8_t data[MAX_BUFF];
    Mirf.getData(data);
    memcpy(&controlStatus, data, sizeof(controlStatus));
    setMotRot(-controlStatus.x);
    setMotForward(controlStatus.y); 
  }


Nas funções setMotRot e setMotForward
escreva os valores nas variáveis ​​globais motRot e motForward
void setMotRot(int16_t v){
  if(abs(v)<10) v = 0;
  motRot = (int32_t)v;
}
void setMotForward(int16_t v){
  if(abs(v)<10) v = 0;
  motForward = (int32_t)v;
}


E vamos para o mais interessante. Para como converter "vire à esquerda a uma velocidade de 5 graus por segundo e avance um pouco!" para "motor esquerdo 10% para trás, direito 20% para frente!". Muito foi escrito

sobre o que são os controladores PID . Eu usei apenas dois componentes para rotação:
  1. Proporcional;
  2. Integral.

E para avançar e recuar, o regulador não o usou.

Vamos dar um exemplo:
int32_t iDeltaRot = 0;
void motTick(){
  int32_t rot = getRotAvg(); //     
  int32_t deltaRot = rot - motRot * rotMaxSpeed / 512;
  iDeltaRot += deltaRot;
  int32_t motRight = (int32_t)motForward * forwardMult - deltaRot * rotMult - iDeltaRot * iDeltaRotMult, 
          motLeft  = (int32_t)motForward * forwardMult + deltaRot * rotMult + iDeltaRot * iDeltaRotMult;  

  int32_t motMax = max(abs(motRight), abs(motLeft));
  if(motMax > 127){
    motRight = (int32_t)motRight * 127 / motMax;
    motLeft  = (int32_t)motLeft  * 127 / motMax;
  }
  
  setMotRight(motRight);
  setMotLeft(motLeft);
}

O código foi simplificado para se concentrar em partes importantes; o arquivo terá a versão completa.

O que estamos fazendo aqui?
  1. Calculamos a diferença entre a velocidade real de rotação do barco (podridão) e a desejada (motRot * rotMaxSpeed);
  2. Calculamos as velocidades de rotação desejadas dos parafusos motRight e motLeft;
  3. Se as velocidades de rotação desejadas excederem o máximo possível, reduzimos-as enquanto mantemos a relação entre elas;
  4. Chamamos setMotRight / setMotLeft já familiares para nós.

Isso é tudo!

Este é o algoritmo de controle completo do barco!

Isso é difícil? Eu acho que não. Mas, no entanto, no decorrer dos testes e ajustes, surgiram muitos problemas que levariam a vários acidentes se fosse uma aeronave.

Existem 4 coeficientes na função descrita:
  1. forwardMult - sensibilidade ao movimento do joystick para frente / trás;
  2. rotMaxSpeed ​​- a velocidade de rotação desejada ao inclinar o joystick totalmente para a direita / esquerda;
  3. rotMult - coeficiente do componente proporcional (quanto o desvio da velocidade de rotação atual do desejado afeta a rotação);
  4. iDeltaRotMult - coeficiente do componente integral (quanto o desvio do ângulo de rotação atual do desejado afeta a rotação).

Esses coeficientes são ajustados experimentalmente, e a reação do barco ao joystick e às influências externas que se desdobram dependerá deles.

Indicação de status


Ao depurar / ajustar, haverá confusões da série "por que o barco reage ao joystick do jeito que eu quero?". Alguns pontos podem ser depurados exibindo informações de depuração em um PC, mas seria mais conveniente entender o que está acontecendo no local. No começo, considerei duas opções:
  1. Laptop;
  2. LCD Nokia 5110


As desvantagens de ambos são compreensíveis: o laptop é grande e desconfortável para carregar com você, e o monitor Nokia 5110 não permitirá que você exiba simultaneamente um grande número de parâmetros de status do barco.

Fiz um cruzamento entre eles: Nextion Enhanced NX4827K043 - Genérico 4.3 '' HMI Touch Display . Graças à tela de toque, você pode ajustar rápida e convenientemente os parâmetros do barco em movimento. Este é um tipo de computador que consiste em:
  1. Microcontrolador GD32F103R8T6;
  2. SDRAM Winbond W9864G6KH-6 (8 MB);
  3. Memória flash Winbond W25Q256FVFG (32 MB, 100.000 ciclos de reescrita, o que é muito bom);
  4. FPGA Altera MAX II EPM570T144C5N.

Tudo na montagem é assim (clicável): Este computador / monitor é uma caixa preta e é voltado para interagir com uma pessoa. Até o GPIO existente é aprimorado para conectar botões e indicadores. O Conselho de Expansão confirma isso. Portanto, o uso do controlador interno como controle remoto de um barco (leitura do joystick, troca de dados com o módulo de rádio NRF24L01 +) falhará. Para interagir com o microcontrolador, existe o UART e ... é tudo. Sobre como e o que pode ser feito usando essa tela, está escrito um monte de + existem vídeos no Youtube. Veja, por exemplo, este





- tudo é mostrado claramente lá. Mas como essa tela é mais cara do que todos os outros componentes do barco e do console combinados, descreverei mais detalhadamente minhas impressões sobre como trabalhar com ela. Talvez isso ajude alguém a entender se essa opção é adequada para ele ou se o laptop / monitor Nokia 5110 será preferível. Vantagens do Nextion Enhanced NX4827K043:
  1. Muito fácil de usar. Há documentação simples, exemplos, vídeos no Youtube, ... Em algumas horas você pode descobrir do zero. Quase tudo o que você precisa saber sobre ele está em duas páginas: página wiki e conjunto de instruções
  2. Desenvolvimento muito rápido. Um editor visual como o Visual Studio (apenas mais fácil). Joguei componentes e tudo funciona.
  3. Componentes de alta qualidade. A mesma memória flash para 100k ciclos de reescrita.
  4. Um depurador que pode simular uma exibição usando um PC e se comunicar com o seu MK através de uma porta COM. Permite que você desenvolva totalmente o dispositivo, depure e compre um monitor, apenas se tudo der certo.
    Embora haja um problema com ele
    . . , , .
  5. Sensor Resistivo Você pode criar controles bastante pequenos e cutucá-los com a unha ou com qualquer caneta.

Desvantagens:
  1. Preço $ 50 ainda é muito para uma tela de 4,3 ''.
  2. Existem poucos componentes existentes, poucas configurações de componentes, como criar o seu próprio não é claro. Isso é parcialmente compensado pelas funções de desenhar primitivas (linhas, retângulos, círculos, ...).
  3. O componente padrão do Gauge pisca quando atualizado.
  4. Não (pelo menos não encontrei) transparência.
  5. Requisitos de energia: 4,75-7 V e corrente média 250 mA. Quando a tensão cai, o visor começa a piscar.
  6. Apenas UART. Poderia se comunicar com ele no SPI e I²C.
  7. Saída GPIO apenas para um loop (sem pente de 2,54 mm), sem ADC.


Em geral, a tela dá a impressão de um produto de alta qualidade, fácil e agradável de trabalhar.

A tela pode executar duas tarefas ao mesmo tempo:
  1. Indicação de status. Estou interessado principalmente em:
    • "Velocidades de rotação" dos parafusos;
    • O valor da variável iDeltaRot é o quanto o ângulo de viragem desejado difere do desejado;
    • Velocidade de rotação do barco;
    • Ângulo de rotação do barco;
    • Frequência de recebimento de pacotes do controle remoto;
    • A frequência das chamadas para a função motTick.

  2. Parâmetros de configuração, especificamente os descritos acima, forwardMult, rotMaxSpeed, rotMult, iDeltaRotMult.


Foram feitas 2 páginas (clicáveis ​​para avaliação da qualidade):
  1. Indicações:


  2. Configurações dos parâmetros: primeiras 4 colunas da esquerda para a direita: forwardMult, rotMult, iDeltaRotMult, rotMaxSpeed.






Barco de teste de vídeo no chão:



A reação do barco a um efeito de desdobramento externo em vários iDeltaRotMult (coeficientes integrais):



Demonstração da influência dos parâmetros na água:



Não foi possível capturar o vídeo em águas abertas. Você pode acreditar que seu manuseio é bom e a velocidade máxima não é muito.

Características


  • Haste 9 g;
  • Peso 115 g, das quais baterias pesam 52 g;
  • A aceleração máxima é de 0,77 m / s ^ 2. Para humanos 5 km / h, se não houvesse resistência à água, o barco aceleraria em 1,8 s;
  • O custo dos componentes é de cerca de US $ 15 se você usar o Arduino Nano no controle remoto e no barco (sem tela e baterias).


Conclusão


Para aqueles que desejam coletar algo controlado por rádio, recomendo começar com uma embarcação com duas hélices fixas. Na minha opinião, isso é a coisa mais simples que pode ser feita nessa área.

Arquivar com projetos

E, finalmente, para ter algo pelo que se esforçar, aqui está um vídeo de um dispositivo incrível:

Source: https://habr.com/ru/post/pt390429/


All Articles