Continuamos con el tutorial de construcción y programación de nuestro robot. En esta ocasión vamos a implementar la función de control de los dos servomotores con un mando a distancia de infrarrojos. El mando en cuestión es el que aparece en el listado de materiales pero podemos usar cualquier mando que tengamos por casa. Solo tenemos que sustituir el código que aparece en las estructuras switch-case con el código de los botones de nuestro mando.
//Arduino Robot v09_02 2016/05/02 //Diseño y programación: Antonio Vallecillos, @fotovallegrafia //Movimiento con IR #include <IRremote.h> // incluimos la librería para IRremote int RECV_PIN = 12; // definimos una variable de tipo entero llamada RECV_PIN // con un valor 12 por defecto IRrecv irrecv(RECV_PIN); // el TSOP 2238 está conectado al pin 12 decode_results results; // el código de cada tecla se almacenará en la variable results #include <Servo.h> // incluimos la librería para controlar los servomotores Servo servoDER; // creamos un objeto servo llamado servoDER Servo servoIZQ; // creamos un objeto servo llamado servoIZQ void setup() { Serial.begin(9600); // iniciamos el Monitor Serial a 9600 baudios irrecv.enableIRIn(); // iniciamos el receptor de infrarrojos servoDER.attach(7); // el servomotor de la derecha está conectado al pin 7 servoIZQ.attach(8); // el servomotor de la izquierda está conectado al pin 8 funcionStop(); // ejecutamos el código detro de funcionStop() } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value); // imprime el código de la tecla pulsada en el // Monitor Serial switch (results.value) { // control de flujo mediante switch case 16615543: // botón Flecha Arriba funcionAv(); // ejecutamos el código detro de funcionAv() break; case 16619623: // botón Flecha Abajo funcionRe(); // ejecutamos el código detro de funcionRe() break; case 16607383: // botón Flecha Derecha funcionGd(); // ejecutamos el código detro de funcionGd() break; case 16591063: // botón Flecha Izquierda funcionGi(); // ejecutamos el código detro de funcionGi() break; } irrecv.resume(); // recibe el siguiente valor } else { funcionStop(); // ejecutamos el código detro de funcionStop() } delay(250); } // funciones de movimiento void funcionAv() { Serial.println("ADELANTE"); // imprime ADELANTE en el Monitor Serial servoDER.write(0); // el servomotor de la derecha gira en sentido horario // (hacia adelante) a máxima velocidad (90 es parado) servoIZQ.write(180); // el servomotor de la izquierda gira en sentido antihorario // (hacia adelante) a máxima velocidad (90 es parado) } void funcionRe() { Serial.println("ATRÁS"); servoDER.write(180); servoIZQ.write(0); } void funcionGd() { Serial.println("DERECHA"); servoDER.write(180); servoIZQ.write(180); } void funcionGi() { Serial.println("IZQUIERDA"); servoDER.write(0); servoIZQ.write(0); } void funcionStop() { Serial.println("STOP"); servoDER.write(90); // el servomotor de la derecha permanece parado // (0 es la máxima velocidad en sentido horario) // (180 es la máxima velocidad en sentido antihorario) servoIZQ.write(90); // el servomotor de la izquierda permanece parado // (0 es la máxima velocidad en sentido horario) // (180 es la máxima velocidad en sentido antihorario) }