Ayuda con Mando RC 5 canales

Buenas, después de estar viendo durante un par de semanas post y foros en los que mucha gente se ha retirado antes de empezar, me he decidido hacer mi propio mando de radio control con arduino, uno económico, basado en los integrados Tx-2B (transmisor) y Rx-2B (receptor), creo que podría hacerlo solo, pero claro que aún no he empezado y las comeduras de cabeza se harán notar. El transmisor es para un avión radio control que usa dos servos y un motor principal.

Tengo poca experiencia con arduino, pero me propongo esto como una meta personal, no quiero que nadie escriba aquí que me compre una emisora y ya esta, o que me será imposible, para desmotivar a la gente no escribáis por favor...

He estado leyendo como funcionan las emisoras, y he comprendido que hacen un delay de 20 milisegundos y luego envían un pulso de entre 1 y 2 milisegundos, el receptor analiza la duración y convierte el dato en PWM para el motor o el servo. Por lo cual suponiendo que se envíe una señal durante 1500 microsegundos, el receptor lo procesará y sacara una señal PWM de 124 por ejemplo (aproximadamente).

Tengo en mente comprar un joystick (este http://www.ebay.com/itm/JoyStick-Breakout-Module-Shield-For-PS2-Joystick-Game-Controller-For-Arduino-/181811928150?hash=item2a54d5dc56:g:puwAAOSwLVZVsaJw), Su funcionamiento es sencillo, dos potenciometros que definen X e Y, los dos ejes, uno para cada servo. Cuando está en reposo (en medio), se envía una señal media a los pines analógicos de arduino, 516 (la mitad de 1023), o lo que equivale a 2.5v en arduino.

Para el motor solo necesito un potenciómetro, me he decidido por uno deslizante (mas lógico para este caso) http://www.ebay.com/itm/Electronic-Block-10K-Sliding-Slider-Potentiometer-Module-for-Arduino-New-UF-/401045294514?hash=item5d60298db2:g:hNUAAOSwSdZWeXmi.

Bien, mi idea es pasar los datos analógicos a tiempo, literalmente, equivaliendo 0 a 1 milisegundo, y 1023 a 2 milisegundos, y enviarlo al otro arduino con el receptor, el cual analizaría el tiempo desde que llega el "impulso" hasta que termina, y sacando los datos conseguidos (supongo que restando 1000 microsegundos se me quedaría el dato de origen) los pasaría a PWM (fácil, seria hacer esto: 0,1000,0,255) y de ahí al servo.

La idea es sencilla, pero me preocupa que una pequeña tardanza en el cálculo modifique los grados de un servo, aunque eso sería ajustarlo a mano, modificando los numeros hasta conseguir que vaya bien. El proceso se repetiría 3 veces por cada "ciclo" uno para cada servo (2) y otro para el motor.

Llegados a este punto me pregunto dos cosas:

  • Es capaz arduino de conseguir una buena precisión? Estamos hablando de contar microsegundos (y se que arduino puede, pero tal vez el empezar un calculo le lleve 10 microsegundos, calcularlo 40 microsegundos, y "escribirlo" otros 10, ahí irían 60 microsegundos, que no es mucho pero impidiría que un servo girase 180º del todo)

  • La otra pregunta es más técnica, como empiezo una cuenta al recibir el código, y la termino cuando pare? He pensado en usar un condicional "for" y que durante eso ponga a 0 una variable y que empiece a sumar microsegundos a esta, cuando se pare el "impulso" el bucle for se detendría dejando en la variable un valor que yo luego procesaría para sacarlos a PWM, pero no se como empezar la cuenta, y son 3 cuentas, no una, una por cada motor/servo.

Muchas Gracias. Pablo.

Hola, GALAXIANO. Un milisegundo es una pequeña eternidad para un arduino, así que no deberías tener problemas en obtener una salida razonablemente precisa... dependiendo de qué más debas hacer. Entiendo que tu esquema más o menos es el siguiente:

  • - Inicio de pulso en todos los canales y contador de tiempo.
  • - Cuando el tiempo alcance los microsegundos establecidos para cada canal, detener el pulso correspondiente.
  • - una vez detenidos todos los pulsos, leemos los mandos y hacemos los cálculos de duración de los siguientes impulsos, esperamos a que el contador alcance los 20 milisegundos y volvemos al paso 1.

Si "sólo" debes hacer eso, no deberías tener problema para realizarlo con micros() por ejemplo. Incluso, en los, digamos, 17 milisegundos restantes por ciclo podrías hacer alguna cosilla más sin entrar en grandes dispendios (manejar algunos leds indicadores, o incluso un lcd).

Me autocorrijo: Cuando dije "razonablemente precisa" me refería a unos pocos microsegundos. Concretamente, como figura en la referencia de micros(), la precisión de este contador es de cuatro microsegundos para los arduinos a 16 MHz. Esto nos da 250 (no 256) posibles niveles en un milisegundo. Creo que deberían ser suficientes, pero es algo que debes conocer. Saludos.

Gracias noter, me has quitado mi gran preocupación.

La verdad es que no se de lo que es capaz arduino, pero si es capaz de realizar este proyecto bien probaría con un delay inferior, de unos 5 milisegundos en vez de 20, y me gastaría una pasta en unos módulos de 1 vatio, pues valen un pastón las emisoras "mediocres"

También he de decir que es mi 2º proyecto con arduino al que le doy importancia, tengo 17 años recién cumplidos y la PAU me tiene un poco pillado jeje.

Creo que podré realizar el proyecto, y si, aunque no lo he comentado, pondré un LCD indicando los grados de los servos y tal.

También decir que cuando lo consiga publicaré en este post todos los diagramas de conexiones así como los componentes y el código.

Tengo una pregunta, como inicio una variable 0 que pueda ser sumada por los microsegundos, espero que entendáis mi pésima explicación, pero eso es lo único a lo que encuentro problema.

Muchas gracias.