En este tutorial vamos a hacer un vehículo de radio control partiendo de un coche, chasis o lo que se nos ocurra.
En mi caso he optado por una caravana del oeste que tras un accidente perdió las ruedas y quedó inservible. Se me ocurrió que era posible darle una segunda utilidad y de paso seguir experimentando con Arduino y sus múltiples posibilidades.
Con los motores del kit del proyecto 16, una rueda loca comprada en un bazar y un par de pletinas de adaptación de metacrilato ya tenemos el vehículo listo para el baile.
Y para darle más colorín he añadido unos leds, ya sé que es anacrónico, pero a los críos les encanta. También se puede añadir un zumbador piezo eléctrico a modo de claxon.
¡El farolillo también se enciende!
En éste esquema no está incluido el zumbador, pero sí en la versión bluetooth. Lo podéis añadir en la salida D12 directamente, siempre que consuma menos de 40mA. En caso contrario emplear un transistor para activar el zumbador.
Dependiendo del número de leds que vayamos a conectar se debe sustituir el transistor BC547 por un 2N2222. El primero aguanta hasta 100 mA, unos cinco leds y el 2N2222 unos 800 mA, como para una atracción de feria.
//RC car with IR Remote Control
//M1 Left Motor
//M2 Right Motor
int receiverpin = 11;
#include <IRremote.h>
IRrecv irrecv(receiverpin);
decode_results results;
int enableM1 = 5;
int in1Pin = 10;
int in2Pin = 9;
int enableM2 = 6;
int in4Pin = 13;
int in3Pin = 4;
int speed = 255;
int avanzar = 500;
int girar = 200;
boolean lights = 0;
void setup()
{
pinMode(in1Pin, OUTPUT);
pinMode(in2Pin, OUTPUT);
pinMode(enableM1, OUTPUT);
pinMode(in3Pin, OUTPUT);
pinMode(in4Pin, OUTPUT);
pinMode(enableM2, OUTPUT);
irrecv.enableIRIn();
pinMode(2, OUTPUT); // lights PIN
}
//Funcion Lights ON/OFF
void lightsONOFF()
{
if (lights==0){
digitalWrite(2, HIGH);
}
if (lights==1){
digitalWrite(2, LOW);
}
lights=!lights;
delay(500);
}
// Funciones de los motores
//Funcion 2. Go Forward
void goForward(int speed)
{
//Motor1
boolean FW = 0;
boolean reverse1 = FW;
analogWrite(enableM1, speed);
digitalWrite(in1Pin, !reverse1);
digitalWrite(in2Pin, reverse1);
//Motor2
boolean reverse2 = FW;
analogWrite(enableM2, speed);
digitalWrite(in3Pin, !reverse2);
digitalWrite(in4Pin, reverse2);
delay(avanzar);
analogWrite(enableM1, 0);
analogWrite(enableM2, 0);
}
//Funcion 4. turnLeftSlow
void turnLeftSlow(int speed)
{
//Motor1 inhabilitado, giramos sobre una rueda
boolean FW = 0;
analogWrite(enableM1, 0);
//Motor2
boolean reverse2 = FW;
analogWrite(enableM2, speed);
digitalWrite(in3Pin, !reverse2);
digitalWrite(in4Pin, reverse2);
delay(girar);
analogWrite(enableM2, 0);
}
//Funcion 6. turnRightSlow
void turnRightSlow(int speed)
{
//Motor2 inhabilitado, giramos sobre una rueda
boolean FW = 0;
analogWrite(enableM2, 0);
//Motor1
boolean reverse1 = FW;
analogWrite(enableM1, speed);
digitalWrite(in1Pin, !reverse1);
digitalWrite(in2Pin, reverse1);
delay(girar);
analogWrite(enableM1, 0);
}
//Funcion 8. Go Backward
void goBackward(int speed)
{
//Motor1
boolean BW = 1;
boolean reverse1 = BW;
analogWrite(enableM1, speed);
digitalWrite(in1Pin, !reverse1);
digitalWrite(in2Pin, reverse1);
//Motor2
boolean reverse2 = BW;
analogWrite(enableM2, speed);
digitalWrite(in3Pin, !reverse2);
digitalWrite(in4Pin, reverse2);
delay(avanzar);
analogWrite(enableM1, 0);
analogWrite(enableM2, 0);
}
void translateIR()
{
switch(results.value)
{
speed = 255;
case 0xD29: lightsONOFF(); break; // Lights On / Off
case 0x529: lightsONOFF(); break; // Lights On / Off
case 0xD02: goForward(speed); break; // Go Forward
case 0x502: goForward(speed); break; // Go Forward
case 0xD04: turnLeftSlow(speed); break; // Turn Left
case 0x504: turnLeftSlow(speed); break; // Turn Left
case 0xD06: turnRightSlow(speed); break; // Turn Right
case 0x506: turnRightSlow(speed); break; // Turn Right
case 0xD08: goBackward(speed); break; // Go Backward
case 0x508: goBackward(speed); break; // Go Backward
}
}
void loop()
{
if (irrecv.decode(&results))
{
translateIR();
{
irrecv.resume();
}
}
}
Este código puede modificarse para que el vehículo se mueva ininterrumpidamente hasta que reciba la siguiente instrucción con tan solo quitar el delay al final de cada función.
El funcionamiento sería el siguiente, por ejemplo se puede añadir un botón de STOP y que el coche avance o gire hasta que se pulse STOP o se le ordene otra cosa, en lugar de mantener pulsado constantemente el botón que corresponda.