Coche RC Android / Arduino. Parte IV (Arduino)

Empezamos con lo realmente divertido de este proyecto, introducir Arduino y experimentar con nuestro coche. Las posibilidades son innumerables y apasionantes. Arduino tiene sensores prácticamente de todo tipo. Podemos plantearnos implementar código para que el coche conduzca sólo evitando obstáculos, un sistema de encendido automático de las luces cuando entre en zonas de oscuridad, que conduzca sólo hasta un punto en concreto, etc. Desgraciadamente nos vemos en la necesidad de partir de la base de que conocen, al menos básicamente, la plataforma Arduino. Hacer lo contrario impediría desarrollar este post con normalidad. Si tienen conocimientos de programación, en cualquier lenguaje o plataforma, pero no conocen Arduino  les recomiendo que visiten la página oficial donde tendrán acceso a  software, programas ejemplo, etc. Dicho esto, vamos al tajo separando por tareas lo que necesitamos hacer:

  1. Recibir información del RC: Leer e interpretar la información que nos llega desde cada uno de los dos canales de nuestro transmisor. Acelerador, dirección.
  2. Enviar información al ESC y al Servo de manera que sepan interpretarla.
  3. Crear nuestra primera versión del programa: Combinando lo visto en los puntos anteriores crearemos un sencillo programa que nos permitirá avanzar, retroceder y dirigir el coche.

Recibir información de RC

El proceso no es nada complicado, cada una de las señales RC se genera por software y podemos leerla fácilmente utilizando cualquiera de los puertos digitales de nuestra Arduino mediante el comando pulseIn(). Veamos como hacerlo con un fragmento de código:

#define CANAL_DIRECCION 7 //Pin de entrada canal 1

int ch1; //Variable para almacenar los valores que nos lleguen desde el canal1

void setup()
{
	Serial.begin(9600);
	pinMode(CANAL_DIRECCION, INPUT); //pin 7 configurado tipo Entrada
}

void loop()
{
	ch1 = pulseIn(CANAL_DIRECCION, HIGH); //Leemos el valor
	Serial.println(ch1 ); //Lo mostramos en pantalla
	delay(500);
}

Si conectamos la patilla “” del receptor a cualquier entrada GND de nuestra Arduino, la patilla “+”  a la salida de 3.3 V,  la patilla de datos, habitualmente etiquetada como “S”, al pin digital 7, cargamos el programa, lo ejecutamos y abrimos el Monitor Serial sobre la marcha empezarán a ver los valores del canal uno.leyendo RC

Para leer el canal dos tan solo tendremos que repetir el proceso. Al final del post pondremos el código completo. Bien, qué son estos valores? Cómo podemos usarlos? Habrá que hacer algunos cambios.

Enviar información al ESC y al Servo

Hemos conseguido leer los valores “en bruto” que nos llegan desde el receptor, pero necesitamos realizar cambios para poder enviarlos al ESC y al Servo. Ambos dispositivos se pueden controlar utilizando la librería Servo y reaccionan enviándoles valores comprendidos entre 0 y 179. Para el caso del servo de dirección 0 representará el evento giro completo a la izquierda, 179 a la derecha y 90 posición central. En en el caso de los ESC varía en función de su tipo. Los que se utilizan para controlar el motor de un avión, por ejemplo, aumentan la velocidad de giro según se incremente el valor entre 0 y 179. Los que se utilizan en coches radio control se comportan como los servos de dirección, con la diferencia de que aumentarán la velocidad con valores de 0 a 89 en un sentido (retroceder) y de 91 a 180 en el otro (avanzar). Así pues, nos vemos en la necesidad de convertir los valores en bruto que hemos obtenido de nuestro receptor en otros que correspondan con lo que podemos enviar a nuestros componentes, valores comprendidos entre 0 y 179. Esto lo podremos hacer con una sola línea de comando usando la librería Map, tan solo debemos facilitarle el rango en el que queremos movernos y los valores mínimos/máximos que recibirá. En mi caso el receptor envía valores comprendidos entre 850 y 1835:

// Un comentario
    map(ch1, 850, 1835, 0, 179); //transformamos a valores 0 - 179.

Esto es fácilmente mejorable, podemos diseñar un método que realice un número de lecturas a modo muestreo y que fije automáticamente los valores mínimos y máximo, pero requiere la colaboración del usuario. Probablemente en el código final esté implementado de esta forma.

Con lo que tenemos ya podríamos controlar el servo de dirección, pero queda un pequeño detalle pendiente para poder controlar el ESC, necesitamos armarlo. Por motivos de seguridad los controladores de velocidad requieren que sean activados manualmente con una porción de código en concreto tras encender el aparato e iniciar el programa. La explicación es lógica, imaginen que montamos un helicóptero, y lo encendemos con el acelerador a máxima velocidad por error. Si el ESC se armara por defecto… bueno… bye bye helicóptero :) Este proceso suele ser común a todos los ESCs y normalmente es suficiente con enviar un valor 90 y esperar durante dos segundos. Como medida de precaución lanzaremos el proceso de armado sólo si los valores que estamos recibiendo del receptor son los apropiados. No queremos que, una vez armado, nuestro flamante coche se vaya sólo a conocer mundo :-)

Crear nuestra primera versión del programa

En el código, que podrán descargar desde el enlace que hay bajo estas líneas, se detalla todo lo expuesto más las conexiones que debemos realizar. Les facilito también una imagen de cómo va quedando nuestro caharro:primera_conexion

aquí un video para que lo puedan ver en movimiento.

Enlace a la primera versión del códigoRCARduinoAndroid v1

En nuestra siguiente entrada conectaremos el módulo BlueTooth e introduciremos Android para conducir nuestro coche utilizando el StmartPhone. Dios reparta suerte…

Una vez más, gracias a todos/as. Caso que esto lo lea alguien algún día claro está ;-)