À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.?
- ;
- ;
- ;
- , -.
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
( há 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:- Pode ser colocado em diferentes plataformas: um barco, trenó, um pedaço de espuma ...
- Não pega no fundo ou nas algas.
É necessário que o dispositivo possa girar. Existem 3 opções:- Um parafuso + volante para voltas ;
- Um parafuso + seu sistema de torneamento ;
- 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:- 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);
- O estabilizador AMS1117-3.3 de 3.3V para alimentar o módulo de rádio, custa US $ 0,03 por unidade ;
- 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 problemaL293D . , .
Alimento. Vamos precisar de até três tensões de alimentação:- 5 V para todos os componentes eletrônicos, exceto o módulo de rádio;
- 3,3 V para o módulo de rádio;
- 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 :- Gire para a frente;
- Gire para trás;
- Não torça.
Para facilitar a leitura do código, escreva6 funçõesinline 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 globaisint8_t motLeft = 0, motRight = 0;
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 timerISR(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:- Escreva um valor positivo, negativo ou zero em motLeft / motRight (o módulo não é importante);
- Registre a "velocidade de rotação" em OCR2A / OCR2B.
Vamos escrever mais algumas funções para issovoid setMotLeft(int8_t v){
if(abs(v) < 5) v = 0;
motLeft = v;
OCR2A = abs(v) * 2;
}
void setMotRight(int8_t v){
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 timervoid motInit(){
DDRD |= (1 << MOT_LEFT_PLUS) | (1 << MOT_LEFT_MINUS) | (1 << MOT_RIGHT_PLUS) | (1 << MOT_RIGHT_MINUS);
TCCR2B |= (0 << CS22)|(1 << CS21)|(0 << CS20);
TIMSK2 |= (1 << TOIE2)|(1 << OCIE2A)|(1 << OCIE2B);
TCCR2A &= ~(3);
TCCR2B &= ~(1 << 3);
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:- Ao ligar a alimentação, lembre-se da posição inicial do joystick;
- 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 registrostruct 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 enó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 setMotForwardescreva os valores nas variáveis globais motRot e motForwardvoid 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 escritosobre o que são os controladores PID . Eu usei apenas dois componentes para rotação:- Proporcional;
- 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?- Calculamos a diferença entre a velocidade real de rotação do barco (podridão) e a desejada (motRot * rotMaxSpeed);
- Calculamos as velocidades de rotação desejadas dos parafusos motRight e motLeft;
- Se as velocidades de rotação desejadas excederem o máximo possível, reduzimos-as enquanto mantemos a relação entre elas;
- 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:- forwardMult - sensibilidade ao movimento do joystick para frente / trás;
- rotMaxSpeed - a velocidade de rotação desejada ao inclinar o joystick totalmente para a direita / esquerda;
- rotMult - coeficiente do componente proporcional (quanto o desvio da velocidade de rotação atual do desejado afeta a rotação);
- 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:- Laptop;
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:- Microcontrolador GD32F103R8T6;
- SDRAM Winbond W9864G6KH-6 (8 MB);
- Memória flash Winbond W25Q256FVFG (32 MB, 100.000 ciclos de reescrita, o que é muito bom);
- 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:- 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
- Desenvolvimento muito rápido. Um editor visual como o Visual Studio (apenas mais fácil). Joguei componentes e tudo funciona.
- Componentes de alta qualidade. A mesma memória flash para 100k ciclos de reescrita.
- 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. . , , .
- Sensor Resistivo Você pode criar controles bastante pequenos e cutucá-los com a unha ou com qualquer caneta.
Desvantagens:- Preço $ 50 ainda é muito para uma tela de 4,3 ''.
- 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, ...).
- O componente padrão do Gauge pisca quando atualizado.
- Não (pelo menos não encontrei) transparência.
- Requisitos de energia: 4,75-7 V e corrente média 250 mA. Quando a tensão cai, o visor começa a piscar.
- Apenas UART. Poderia se comunicar com ele no SPI e I²C.
- 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:- 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.
- 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):- Indicações:

- 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 projetosE, finalmente, para ter algo pelo que se esforçar, aqui está um vídeo de um dispositivo incrível: