Mando Radiocontrol

En el siguiente tutorial de Arduino se mostrará cómo usar un mando de radiocontrol con Arduino. Para llevar a cabo este tutorial, la placa para servomotores será utilizada y se puede adquirir en la Tienda. El uso de estos mandos es una muy buena manera para poder manejar robots, coches, UAV o lo que se diseñe. Normalmente tienen amplios rangos como 1 km.

En este caso se va a usar un mando y su receptor de hobbyking a 2.4Ghz con 6 canales, aunque la mayoría de mandos y receptores tienen el mismo funcionamiento.

El funcionamiento de estos mandos es relativamente simple. Se envía la información de cada canal mediante un ancho de pulso, es lo mismo que los servomotores pero al revés.

En concreto los pulsos son cada 20 ms es decir con una frecuencia de 50Hz y el ancho depende del recorrido de la palanca y del limite que este configurado en el mando. Normalmente entre 500 us y 2 ms.

El receptor dispone de tres pines por canal.

  • GND (Marron)
  • +5V (Rojo)
  • Señal del canal (Naranja)

Se va a usar el cable que viene con el receptor que tiene la misma nomenclatura de colores que los servos. Gracias a la placa para Arduino simplemente se tiene que conectar el cable a uno de los puertos, en este caso en el 10 y 11 aunque cualquiera puede servir.

Se alimenta la placa por el conector externo y se enciende el mando. Se verá como el receptor enciende el led rojo.

Ahora el código de Arduino será iniciado. Para poder leer pulsos existe una función en Arduino que se llama pulseIn(pin, tipo_pulso, timeout) donde se pasan los siguientes parámetros.

  • pin: Es el pin donde se leerá el pulso, en este caso será el 10 y 11.
  • tipo_pulso: Se indica si el pulso es alto o bajo, con HIGH o LOW, en este caso HIGH.
  • timeout: La función pulseIn por defecto se queda esperando hasta que encuentra un pulso, lo que obliga a detener el programa. Con este parámetro se indica el tiempo máximo (en us) de espera desde que se llama la función hasta que empieza a leer un pulso. En este caso se puede poner 4000, que son 4 ms.

Ahora se hará la primera prueba y se leerá solo un pulso, imprimiendo por el terminal Serial el valor medido. Dado que en la placa no están juntas las salidas de los reguladores de 5V y el pin +5V de Arduino, si se quiere solo alimentar por el USB se pueden juntar cogiendo un pin de 5V de uno de los puertos para Servos y el pin +5V de Arduino.

Dado que existe un delay de 15 ms, todas las veces se produce una lectura buena. Hay que recordar que, como hay un timeout, si no estuviese ese delay, a veces la función pulseIn devolvería un 0 ya que habría expirado el timeout.

A continuación se realiza un código que permite leer dos canales o más. Dado que la lectura del pulso interrumpe el ciclo del programa, lo que se hace es leer los canales por turnos. Con la función ReadRC se leen los pulsos por turnos, esos turnos son indicados por la variable CHRead. Además, se asegura que el pulso haya sido leído, ya que en caso de que la función devuelva 0 no se tiene en cuenta para actualizar el valor.

Ahora simplemente esos datos se pueden tratar como se desee, ya que dependiendo de cada aplicación el ancho de pulso puede significar una cosa u otra.