En la segunda parte vimos la instalación de la placa Arduino UNO R3 junto al Shield de Control de Motores Ardumoto (fabricado por Sparkfun Electronics), la conexión de los motores al shield y la conexión a la fuente de alimentación de lo mencionado anteriormente. Además, escribimos un código de prueba para verificar el correcto funcionamiento de Ardumoto y de los motores conectados al mismo (incluyendo la inversión de giro).
Ahora, en la tercera parte, veremos una de las diversas maneras que tenemos de controlar a nuestro robot y que el mismo ejecute diferentes órdenes según nuestro criterio. Para el sistema de control utilizaremos una tecnología más que común en estos días y la tenemos en nuestros hogares en más de un dispositivo: la radiación infrarroja, comúnmente conocida como IR.
El Receptor Infrarrojo
Para llevar a cabo nuestro propósito utilizaremos un receptor infrarrojo cuya frecuencia de operación será de 38kHz y su longitud de onda será de 940nm. Es de fácil adquisición en cualquier comercio de electrónica y no es requisito fundamental el fabricante, puede ser cualquier receptor cuya frecuencia de operación sea de 38kHz y su longitud de onda de 940nm. En mi caso particular, como veremos más adelante, he utilizado un receptor genérico. También puede obtenerse de equipos electrónicos en desuso.
Como transmisor infrarrojo podemos utilizar cualquier control remoto que tengamos en casa. En mi caso particular, he utilizado el control remoto del TV LCD.
Nuestro Robot
Luego de haber completado exitosamente las dos etapas anteriores, nuestro robot se encuentra listo para recorrer el mundo y recibir nuestras órdenes. A continuación llevaremos a cabo la instalación de toda la electrónica necesaria para que esto ocurra.
La instalación del receptor infrarrojo es muy sencilla y no requiere componentes externos, simplemente debemos conectar los pines de alimentación y el pin de datos.
La tensión de alimentación del receptor es de 5V, por lo tanto, se puede obtener la alimentación directamente del pin 5V de la placa Arduino. Ahora sólo resta soldar un pequeño trozo de cable para conectar el pin “Data” del receptor infrarrojo a un pin de la placa Arduino, como se observa en la siguiente imagen:
Ahora procedemos a instalarlo en Ardumoto (que a su vez se encuentra conectado a la placa Arduino UNO R3) conectando los pines de alimentación a los pines 5V y GND respectivamente. Luego conectaremos el pin “Data” del receptor infrarrojo al pin 4 de la placa Arduino, como se muestra a continuación:
Llegado este punto, ya tenemos instalada toda la electrónica necesaria para controlar nuestro robot mediante IR. Ahora, conectaremos nuestra placa Arduino a la PC a través del puerto USB y ejecutaremos el IDE de Arduino.
Necesitamos conocer los códigos correspondientes a las teclas del control remoto con las cuales controlaremos nuestro robot. En principio, serían cuatro teclas para controlar, lógicamente, las cuatro direcciones por la que se desplaza nuestro robot: adelante, atrás, izquierda y derecha. Podemos definir las teclas que consideremos más apropiadas. Luego, en la barra de menú del IDE, seleccionamos “Archivo” –> “Ejemplos” –> “IRremote”–> “IRrecvDump”, este sketch de ejemplo nos permitirá conocer los códigos correspondientes a las teclas del control remoto. Antes de cargarlo a nuestra placa Arduino, debemos modificar la línea número doce: “int RECV_PIN = 11;” por “int RECV_PIN = 4;” y finalmente lo cargaremos a nuestra placa Arduino. Luego seleccionamos “Herramientas” –> “Monitor Serial” (o simplemente presionamos CTRL+SHIFT+M). Ahora, apuntamos nuestro control remoto en dirección al receptor infrarrojo y pulsamos las teclas de las cuales deseamos conocer su código, como se observa en la siguiente imagen:
Luego, conociendo los códigos hexadecimales correspondientes a cada tecla, procederemos a escribir el código para controlar nuestro robot.
IMPORTANTE: al momento de cargar el siguiente código se deben reemplazar los códigos hexadecimales en el grupo de directivas “#define” (titulado “Remote Control Codes”) por los códigos hexadecimales particulares de cada control remoto. Además, debemos modificar dos líneas en el archivo “IRremoteInt.h” ubicado en “DirPrincipalIDEArduino\libraries\IRremote”. Las líneas en cuestión son las número 71 y 72:
// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc #else #define IR_USE_TIMER1 // tx = pin 9 //#define IR_USE_TIMER2 // tx = pin 3 #endif
Deben modificarse de la siguiente manera:
// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc #else //#define IR_USE_TIMER1 // tx = pin 9 #define IR_USE_TIMER2 // tx = pin 3 #endif
#include <IRremote.h> #define PWM_A 3 #define PWM_B 11 #define DIR_A 12 #define DIR_B 13 #define RECV_PIN 4 // Remote Control Codes #define DIR_UP 0x1CE3728D #define DIR_DOWN 0x1CE3F20D #define DIR_LEFT 0x1CE3F807 #define DIR_RIGHT 0x1CE37887 #define START_STOP 0x1CE32AD5 IRrecv irrecv(RECV_PIN); decode_results results; bool stopped; void fadein() { for(int fadeValue = 125 ; fadeValue <= 255; fadeValue +=5) { analogWrite(PWM_A, fadeValue); analogWrite(PWM_B, fadeValue); } } void fadeout() { for(int fadeValue = 255 ; fadeValue >= 125 ; fadeValue -=5) { analogWrite(PWM_A, fadeValue); analogWrite(PWM_B, fadeValue); } } void forward() { fadeout(); digitalWrite(DIR_A, HIGH); digitalWrite(DIR_B, HIGH); fadein(); } void backward() { fadeout(); digitalWrite(DIR_A, LOW); digitalWrite(DIR_B, LOW); fadein(); } void rotateleft() { fadeout(); digitalWrite(DIR_A, LOW); digitalWrite(DIR_B, HIGH); } void rotateright() { fadeout(); digitalWrite(DIR_A, HIGH); digitalWrite(DIR_B, LOW); } void stop() { analogWrite(PWM_A, 0); analogWrite(PWM_B, 0); } void setup() { pinMode(PWM_A, OUTPUT); pinMode(PWM_B, OUTPUT); pinMode(DIR_A, OUTPUT); pinMode(DIR_B, OUTPUT); irrecv.enableIRIn(); stopped = true; } void loop() { if (irrecv.decode(&results)) { switch (results.value) { case START_STOP: if(stopped) { forward(); stopped = false; } else { stop(); stopped = true; } break; case DIR_UP: if(!stopped) forward(); break; case DIR_DOWN: if(!stopped) backward(); break; case DIR_LEFT: if(!stopped) rotateleft(); break; case DIR_RIGHT: if(!stopped) rotateright(); break; default: break; } irrecv.resume(); } }