domingo, 20 de abril de 2014

Robot panorámico XS (la electrónica)

Por si alguién quiere montarse uno, os dejo un poco de información referente al conexionado de los diferentes elementos. En alguna otra ocasión ya sugerí que es recomendable tener ciertos conocimientos básicos de electrónica y programación del Arduino, más que nada que en google se puede encontrar información pero cuando surgen problemas especificos es cuando uno tiene que auto-espavilarse como pueda. Yo siempre he intentado ayudar, pero no dispongo de todo el tiempo del mundo  para hacerlo.

En mi caso utilizo una pantalla LCD de 4 lineas x 20 caracteres y un joystick sacado de un nunchuck de la wii , como que estos dos componentes son un poco usuales , os voy a describir a continuación como hacer funcionar el robot con una shield de pantalla LCD de 2x16 caracteres con pulsadores como la de la siguinete captura:

Usando una shield como esta reduciremos cableado y posibles errores de conexionado. Como pega, no es lo mismo tener una pantalla de 32 (2x16) caracteres que una de 80 (4x20) y eso se ve reflejado a la hora de darle un aspecto más bonito a la aplicación o un muestreo extra de información que siempre es mejor.

Y obviamente si vamos a utilizar esta pantalla habrá que usar un programa en concreto, mientras que en la de 4x20 caracteres hay que "reformarlo" en gran parte, debido entre otras cosas que se comunica sólo mediante 4 cables mediante el bus I2C (positivo, negativo, SDA y SCL) y que al no tener pulsadores incorporados hay que cablearlo aparte definiendo nuevas entradas.


Una de las ventajas del LCD shield es que incorpora de serie varios botones (UP, DOWN, LEFT, RIGHT y SELECT) , todos ellos van dirigidos hacia la entrada análogica 0 de nuestro Arduino. Por cierto alguien se preguntará porque un MEGA y no un UNO. El problema es que el UNO tiene una capacidad de memoria de 32 kB y el programa que vamos a utilizar ronda los 31 kB. Otro de los problemas es que al utilizar la shield LCD y "montarla" justo encima hay que empezar a hacer "guarrerias" para conectar los cables que van hacia los drivers de potencia etc...

A lo que iva...todo y vivir en un mundo digital lleno de ceros y unos, es muy bonito usar las entradas analógicas que nos brinda el Arduino. Mediante un voltage de referencia de +5v que podemos aplicar a dichas entradas podemos tratarlas luego internamente de varias maneras generando una entrada multiplexada y ahorrandonos entradas.

Si le aplicamos a una entrada análogica 0 v obtendremos un valor de gestión de valor 0, mientras que si aplicamos 5v en la entrada obtendremos un valor de gestión de 1023. Es decir tenemos una resolución de 1024 con el que podemos jugar...Ahora bién, y electricamente como podemos aplicar un valor variable mediante pulsadores? Muy fácil ! con el uso de resistencias tal y como se muestra en el siguiente esquema:


Estas resistencias ya están montadas en nuestra shield, por lo que no deberemos preocuparnos. Por ejemplo si pulsaramos sobre el pulsador RIGHT provovariamos que en la entrada AD0 un voltaje de 0v, mientras que si pulsaramos sobre UP deberiamos calcular el divisor de tensión generado por las resistencias R2 y R3. A efectos practicos no nos interesa en concreto el valor recibido a la entrada AD0, pues nosotros vamos a tratar con el valor de gestión que reciba nuestro Arduino. Y que valor es este? Os propongo que utiliceis el siguiente sketch para ver como se comportan los pulsadores en vuestro caso:

/*
Test LCD shield
by XavierGP
*/

#include <LiquidCrystal.h>           // incluimos la LiquidCrystal LCD library
int valor;                           // variable recibida en el keypad
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // define los pins del LCD

void setup() { 
lcd.begin(16, 2);
lcd.print(" Hola XavierGP !");
delay(2500);
}

void loop(){
valor=analogRead(0);
if(valor<1020){
lcd.clear();
lcd.print(valor);
delay(350);       
}
}

Una vez cargado este sketch y con la shield LCD montada encima el Arduino observaremos como cambian los valores dependiendo del pulsador que estamos apretando. Estos valores nos serán necesarios a la hora de realizar ajustes en nuestro programa. No todas las shields proporcionan el mismo valor por lo que quizás sea necesario corregirlos. Os enseño unas muestras entre dos shields en principio iguales pero a la realidad los valores cambian:


Finalmente os adjunto el circuito eléctrico básico para que funcione el robot:



Empezando por la parte inferior izquierda encontramos una batería típica de 12v / 7Ah. de la cual salen dos pares de cables, unos de ellos se van directamente hacia la alimentación del Arduino (hay que comprar el jack adecuado! En el centro de este soldaremos el positivo mientras que el negativo va en el lado exterior del mismo). El propio arduino dispone de un regulador/estabilizador incorporado pero no estaria de más ponerle algun tipo de proteción intermedia...

El otro par de cables van hacia un step-down (regulador de voltage) en el que obtengo una tensión de salida constante de 5v y hasta 10Amperios de intensidad entre el cable amarillo y cualquiera de los negros. Estos 5v los utilizaremos para alimentar los motores(al menos con los motores que yo utilizo!, si montais otros motores quizas haya que cambiar el step down por un regulador de voltage) que seran gestionados por los drivers L298N. El driver se comportará como un amplificador de potencia ya que la intensidad que nos ofrece el arduino en sus salidas es muy pequeña para alimentar a los motores.

Luego tenemos dos grupos de 4 cables que van de las sálidas 36, 38, 40 y 42 , y 46, 48, 50 y 52 que van hacia las entradas de pilotaje de los drivers IN1, IN2, IN3 e IN4 . Cada grupo de 4 conductores van hacia cada uno de los dos drivers.  Es recomendable seguir bién el orden. Podeis leer posts antiguos sobre motores paso a paso para entender como funcionan estos...

A las 4 salidas del driver conectaremos nuestros motores paso a paso.

Luego nos toca conectar el relé en la sálida 25 de nuestro arduino , y el otro borne del relé a GND. En este esquema no está marcado correctamente para no liar más entre los diferentes conductores, pero debajo de los PINS 52 y 53 tenemos dos pins de GND. Y para vuestra información encima de los PINS22 y 23 tenemos dos pins que nos ofrecen 5v continuadamante.

Un detalle "tonto" pero necesario es la colocación de un diodo en paralelo a la bobina del relé para eliminar la corriente generada al desactivar el relé, protegiendonos nuestra salida del arduino.

Este relé es el encargado de activar el contacto remoto de nuestra camara.

Finalmente y como "accesorios" extras tengo montado unos sensores de temperatura tipo LM35 que a su vez gestionan el funcionamiento de otro relé que activa/desactiva el ventilador de refrigeración del sistema. En este caso la lectura la realizo en la entrada análogica A6 y la salida va al PIN 24. Sólo como curiosidad , en mi robot XS con pantalla más grande gestiono las temperaturas de los dos drivers por lo que utilizo dos LM35 , uno va a la entrada A6 y el otro a la A7, pero sigue existiendo sólo un ventilador que enfria a los dos.

Os dejo un ejemplo del conexionado del mismo, con la diferencia que aqui está conectado en el borne A5 en vez del A6. Podeis encontrar infinidad de información en Google sobre circuitos con el LM35.



Y otra "mariconada" más es un divisor de tensión que sirve para informarme del voltage de la bateria. Esta información es ofrecida cuando el robot retorna a la posición de inicio de cada linea, pero a efectos prácticos si no lo tenemos habilitado el programa en si cumple con su proposito. Esto lo gestiono a través de la entrada análogica A5, siguiendo el siguiente principio de circuito:


Finalmente os adjunto una vista de como lo tengo yo montado , pero cuidadín , repito, yo no utilizo la SHIELD LCD !


Si lo conectáis todo igual , y utilizais los mismos motores (ver post de lista de la compra de materiales) , tan sólo faltará casi cargar el programa, pero esto será para otro dia.

Saludos y DIY!