Hacer un simple aerobote RC

A veces en Internet veo preguntas de principiantes que quieren construir un quadrocopter desde cero y escribir firmware para él. Yo mismo lo soy y para practicar la creación de modelos RC decidí comenzar con algo más simple.



En el artículo en detalle para los más pequeños, describió el algoritmo de la embarcación, el panel de control y la elección de los componentes.

¿Por qué barco aéreo?


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

Volar vehículos es genial, pero difícil. En el aire, no puedes simplemente apagar los tornillos si algo sale mal. Sí, y se necesita un empuje específico muy decente, incluso para aviones, sin mencionar el multicopter.

Plataformas como esta



( hay una descripción más detallada aquí).

solo pueden moverse, en la mayoría de los casos, por una superficie lisa artificial, y su control es muy diferente.

Pero en el agua podemos navegar a cualquier parte, lo que en el futuro nos puede dar la oportunidad de hacer un piloto automático con GPS. El diseño clásico con una hélice es complicado para mí por la unidad de salida del eje de la carcasa; no puedo imaginar cómo sellarlo.

Más ventajas de un sistema de propulsión de aire:
  1. Se puede colocar en diferentes plataformas: un bote, trineo, un pedazo de espuma ...
  2. No se atrapa en el fondo ni en las algas.

Es necesario que el dispositivo pueda girar. Hay 3 opciones:
  1. Un tornillo + volante para giros ;
  2. Un tornillo + su sistema de giro ;
  3. Dos tornillos fijos. Girar cambiando sus antojos es la forma más fácil. El lo usó.


Control remoto


Principio de operación


1 joystick + múltiples interruptores. La tarea del control remoto es enviar datos sobre la posición del mango del joystick y los interruptores varias veces por segundo.

Que hacer


Primero, necesitas un transmisor de radio. La opción más barata es NRF24L01 +, cuesta $ 0.85 .

En segundo lugar, necesitas un joystick. Otro $ 1 .

Varios interruptores - $ 0.12 .

Bueno, todo esto está arreglado en una pieza de PCB por $ 0.13 .

Ya contaba $ 2.1, pero aún necesita MK y comida. Aquí no todo está tan claro.

Mirando hacia el futuro, diré que ATmega8 o STM8S103F3P6 es suficiente, pero desde que comencé este proyecto durante mucho tiempo y había poca experiencia, lo estrellé en el panel de control Arduino Pro Mini y en el barco Arduino Nano (ATmega32P en todas partes).

En el control remoto aún se necesita:
  1. Convertidor de potencia 0.9 - 5 V -> 5 V para alimentar Arduino por $ 0.35 (el conector USB, junto con un pedazo de la placa, se puede cortar para ser compacto);
  2. El estabilizador 3.3V AMS1117-3.3 para alimentar el módulo de radio, cuestan $ 0.03 por unidad ;
  3. Compartimento de la batería para la batería de un dedo por $ 0.15 ;

Total más $ 0.53. Además del controlador, un par de condensadores y cables, el costo de los componentes de la consola es de $ 2.63.

Llenado modelo RC


Componentes


Todo viene de los motores. Los motores que compre, los componentes electrónicos deberán instalarse con esa potencia, y la base (embarcación, trineo) será necesaria para la capacidad de carga correspondiente. E ideológicamente, todo lo demás es necesario solo para girar los tornillos a la velocidad correcta.

Compré estos motores con hélices


por $ 2.88 por par .

Tomé el L293D como conductor del motor: otros $ 0.35 .
Y luego hay un problema
L293D . , .

Comida. Necesitaremos hasta tres voltajes de suministro:
  1. 5 V para todos los componentes electrónicos excepto el módulo de radio;
  2. 3,3 V para el módulo de radio;
  3. para motores tanto como lo necesiten (mina 4.2 V).

1 y 2 obtenemos lo mismo que en el panel de control, y para motores ponemos MT3608 por $ 0.86 .

Ahora para la parte divertida: el giroscopio. El módulo MPU-6050 cuesta $ 1.53 . Hubo un deseo de usar también el acelerómetro, de modo que cuando el joystick se mueve hacia un lado, la nave se despliega en su lugar. Pero al final, abandonó esta idea: una ligera pendiente, y el sistema comienza a pensar que se está acelerando hacia adelante o hacia atrás. Resultó ser más fácil girar el barco en su lugar simplemente compensando el movimiento hacia adelante / hacia atrás con el joystick.

Agregue a esto $ 0.4 por el compartimento de la batería para 2 celdas AA y obtenga $ 6.4 componentes sin un controlador y cables.

El programa


Y de nuevo, vámonos de los motores. Cada uno de los dos motores accionados por el L293D puede o no excavar :
  1. Girar hacia adelante;
  2. Girar hacia atrás;
  3. No lo tuerzas.

Para que el código sea más fácil de leer, escriba
6 funciones
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;
}


Ahora queremos controlar la velocidad de rotación de los tornillos. Por supuesto, haremos esto usando PWM. No sé si tal PWM se puede hacer en hardware ... Lo interrumpí programáticamente. Declarar un par de variables globales.
int8_t motLeft = 0, motRight = 0; // -127..+127

Deje que los valores de estas variables <0 significan que necesita girar hacia atrás, valores> 0 - hacia adelante, y si son iguales a 0, entonces no necesita girar.
Escribiremos manejadores de interrupciones de temporizador
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();
}


Ahora, para cambiar la velocidad de rotación de la hélice, necesitamos hacer 2 acciones:
  1. Escriba un valor positivo, negativo o cero en motLeft / motRight (el módulo no es importante);
  2. Registre la "velocidad de rotación" en OCR2A / OCR2B.

Escribamos un par de funciones más para esto
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 ( ).

Ahora queda por configurar los pines MK y el temporizador
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();
}


Y puede controlar los motores simplemente llamando a las funciones setMotLeft (int8_t v) y setMotRight (int8_t v).

¡Pero queremos controlar mal el barco! ¡Queremos dar comandos como "adelante / atrás" y "derecha / izquierda"! Y deja que descubra qué hélices tiene que girar para esto. Además, quiero que el bote mismo compense el efecto de giro del viento, las corrientes y ... ¡las hélices torcidas!

Vayamos ahora del otro lado. Desde el control remoto. En el caso más simple, el algoritmo de su operación es el siguiente:
  1. Cuando encienda la alimentación, recuerde la posición inicial del joystick;
  2. En el ciclo, lea la posición del joystick, reste la posición cero y envíe datos a la embarcación.

Nuestro módulo de radio admite paquetes de hasta 32 bytes. Para no recordar los desplazamientos, utilizaremos el registro
struct ControlStatus{
  int16_t x,y;
}  controlStatus;

Como sigue
    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()){;};


En el lado del receptor, declararemos exactamente el mismo registro y
lo llenaremos
  while (Mirf.dataReady()) { 
    uint8_t data[MAX_BUFF];
    Mirf.getData(data);
    memcpy(&controlStatus, data, sizeof(controlStatus));
    setMotRot(-controlStatus.x);
    setMotForward(controlStatus.y); 
  }


En las funciones setMotRot y setMotForward
escribir los valores en las variables globales motRot y 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;
}


Y pasemos a lo más interesante. Para saber cómo convertir "¡gire a la izquierda a una velocidad de 5 grados por segundo y avance un poco!" a "motor izquierdo 10% hacia atrás, derecho 20% hacia adelante".

Se ha escrito mucho sobre qué son los controladores PID . Usé solo dos componentes para la rotación:
  1. Proporcional;
  2. Integral

Y para avanzar y retroceder, el regulador no lo usó.

Tomemos un ejemplo:
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);
}

El código se ha simplificado para centrarse en partes importantes; el archivo tendrá la versión completa.

Que estamos haciendo aqui
  1. Calculamos la diferencia entre la velocidad de rotación real de la embarcación (podredumbre) y la deseada (motRot * rotMaxSpeed);
  2. Calculamos las velocidades de rotación deseadas de los tornillos motRight y motLeft;
  3. Si las velocidades de rotación deseadas exceden el máximo posible, las reducimos mientras mantenemos la relación entre ellas;
  4. Llamamos a setMotRight / setMotLeft que ya nos es familiar.

Eso es todo!

¡Este es todo el algoritmo de control del barco!

¿Es dificil? Creo que no Pero, sin embargo, durante las pruebas y los ajustes surgieron muchos problemas que provocarían numerosos accidentes si se tratara de un avión.

Hay 4 coeficientes en la función descrita:
  1. forwardMult: sensibilidad al movimiento del joystick hacia adelante / hacia atrás;
  2. rotMaxSpeed: la velocidad de rotación deseada al inclinar el joystick completamente hacia la derecha / izquierda;
  3. rotMult: coeficiente del componente proporcional (cuánto afecta la desviación de la velocidad de rotación actual a la deseada);
  4. iDeltaRotMult - coeficiente del componente integral (cuánto afecta la desviación del ángulo de giro actual del deseado a la rotación).

Estos coeficientes se ajustan experimentalmente, y la reacción del bote al joystick y las influencias de despliegue externo dependerán de ellos.

Indicación de estado


Al depurar / afinar, habrá una confusión de la serie "¿por qué el barco reacciona al joystick no de la manera que yo quiero?". Algunos puntos se pueden depurar mostrando información de depuración en una PC, pero sería más conveniente entender lo que está sucediendo en el acto. Al principio, consideré 2 opciones:
  1. Computadora portátil;
  2. LCD Nokia 5110


Las desventajas de ambos son comprensibles: la computadora portátil es grande e incómoda de transportar, y la pantalla del Nokia 5110 no le permitirá mostrar simultáneamente una gran cantidad de parámetros de estado del barco.

Tomé un cruce entre ellos: Nextion Enhanced NX4827K043 - Pantalla táctil HMI genérica de 4.3 '' . Gracias a la pantalla táctil, puede ajustar rápida y convenientemente los parámetros del barco sobre la marcha. Este es un tipo de computadora que consiste en:
  1. Microcontrolador GD32F103R8T6;
  2. SDRAM Winbond W9864G6KH-6 (8 MB);
  3. Memoria flash Winbond W25Q256FVFG (32 MB, 100,000 ciclos de reescritura, lo cual es muy bueno);
  4. FPGA Altera MAX II EPM570T144C5N.

Todo en el ensamblaje se ve así (se puede hacer clic): esta computadora / pantalla es una caja negra y está orientada a interactuar con una persona. Incluso el GPIO existente está afilado para conectar botones e indicadores. Su tablero de expansión confirma esto. Por lo tanto, usar el controlador incorporado como control remoto de un barco (leer el joystick, intercambiar datos con el módulo de radio NRF24L01 +) fallará. Para interactuar con el microcontrolador, hay UART y ... eso es todo. Sobre cómo y qué se puede hacer usando esta pantalla se puede hacer, está escrito un montón de + hay videos en Youtube. Ver, por ejemplo, esto





- Todo se muestra claramente allí. Pero dado que esta pantalla es más costosa que todos los demás componentes del barco y la consola combinados, describiré con más detalle mis impresiones de trabajar con ella. Tal vez esto ayude a alguien a comprender si esta opción es adecuada para él o si la laptop / pantalla Nokia 5110 será preferible. Ventajas de Nextion Enhanced NX4827K043:
  1. Muy facil de usar. Hay documentación simple, ejemplos, videos en Youtube, ... En un par de horas puedes resolverlo desde cero. Casi todo lo que necesita saber sobre él está en dos páginas: página wiki y conjunto de instrucciones
  2. Muy rápido desarrollo. Un editor visual como Visual Studio (solo que más fácil). Tiré componentes y todo funciona.
  3. Componentes de alta calidad. La misma memoria flash para 100k ciclos de reescritura.
  4. Un depurador que puede simular una pantalla usando una PC y comunicarse con su MK a través de un puerto COM. Le permite desarrollar completamente el dispositivo, depurar y comprar una pantalla, solo si todo funciona.
    Aunque hay un problema con él
    . . , , .
  5. Sensor resistivo Puede crear controles bastante pequeños y pincharlos con la uña o cualquier lápiz.

Desventajas
  1. Precio $ 50 sigue siendo mucho para una pantalla de 4.3 ''.
  2. Hay pocos componentes existentes, pocas configuraciones de componentes, no está claro cómo crear los suyos propios. Esto está parcialmente compensado por las funciones de dibujar primitivas (líneas, rectángulos, círculos, ...).
  3. El componente Gauge estándar parpadea cuando se actualiza.
  4. No (al menos no encontré) transparencia.
  5. Requisitos de energía: 4.75-7 V y corriente promedio de 250 mA. Cuando cae el voltaje, la pantalla comienza a parpadear.
  6. UART solamente. Podría comunicarse con él por SPI y I²C.
  7. Salida GPIO solo para el cable (sin peine 2,54 mm), sin ADC.


En general, la pantalla da la impresión de un producto de muy alta calidad, con el que es fácil y agradable trabajar.

La pantalla puede realizar dos tareas a la vez:
  1. Indicación de estado. Estoy principalmente interesado en:
    • "Velocidades de rotación" de los tornillos;
    • El valor de la variable iDeltaRot es cuánto difiere el ángulo de giro deseado del deseado;
    • Velocidad de rotación del barco;
    • Ángulo de rotación del bote;
    • Frecuencia de recepción de paquetes desde el control remoto;
    • La frecuencia de las llamadas a la función motTick.

  2. Parámetros de configuración, a saber, los descritos anteriormente forwardMult, rotMaxSpeed, rotMult, iDeltaRotMult.


Hecho 2 páginas (clicable para evaluación de calidad):
  1. Indicaciones:


  2. Configuración de parámetros: primeras 4 columnas de izquierda a derecha: forwardMult, rotMult, iDeltaRotMult, rotMaxSpeed.






Barco de prueba de video en el piso:



La reacción del barco a un efecto de despliegue externo en varios iDeltaRotMult (coeficientes integrales):



Demostración de la influencia de los parámetros en el agua:



El video en aguas abiertas no se pudo capturar. Puedes confiar en que su manejo es bueno y que la velocidad máxima no es muy alta.

Caracteristicas


  • Varilla 9 g;
  • Peso 115 g, de los cuales las baterías pesan 52 g;
  • La aceleración máxima es 0.77 m / s ^ 2. Para humanos a 5 km / h, si no hubiera resistencia al agua, el bote aceleraría en 1.8 s;
  • El costo de los componentes es de aproximadamente $ 15 si usa el Arduino Nano tanto en el control remoto como en el bote (sin pantalla y baterías).


Conclusión


Para aquellos que desean recolectar algo controlado por radio, les recomiendo comenzar con una embarcación con dos hélices fijas. En mi opinión, esto es lo más simple que se puede hacer en esta área.

Archive con proyectos

Y finalmente, para que haya algo por lo que luchar, aquí hay un video de un dispositivo increíble:

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


All Articles