In this post we show the Andromina robot which it is controlled to a IR remote control of a PHILIPS TV. The robot has the basic configuration, with an Arduino UNO board, a proto shield modified with a voltage regulator of 5v, a motor board and a IR remote control. In this configuration the robot sketch is a bit complex and we can add a lot of movements and functions. In the sketch, we have set preset buttons with a maneuver or buttons for example to accelerate or turn the robot.
Andromina robot OFF ROAD and the IR remote control. |
Disposal of the batteries. |
With a IR remote control PHILIPS.
Autor: Jordi T. C.
Autor: Jordi T. C.
*/// Libraries /////////////////////////////////////////////////////////////////////////////////
#include <Servo.h> // servos
#include <IRremote.h> // Remote control
//// Keys of IR remote control Philips /////////////////////
#define TECLA_ON_1 0XC // On.
#define TECLA_ON_2 0X80C // On.
#define TECLA_ROJA_1 0X4B995E59
#define TECLA_ROJA_2 0X1C102884
#define TECLA_VERDE_1 0XE050BDE6
#define TECLA_VERDE_2 0XEF4EDF53
#define TECLA_AMARILLA_1 0XDF50BC53
#define TECLA_AMARILLA_2 0XF04EE0E6
#define TECLA_GRIS_1 0X8533B77
#define TECLA_GRIS_2 0X5F564B6A
#define TECLA_MUSICA_1 0X14
#define TECLA_MUSICA_2 0X814
#define TECLA_RADIO_1 0XA4E66026
#define TECLA_RADIO_2 0X9CEDF1F
#define TECLA_PANTALLA_1 0X15
#define TECLA_PANTALLA_2 0X815
#define TECLA_i_1 0XF
#define TECLA_i_2 0X80F
#define TECLA_AUGMENTAR_1 0X2B
#define TECLA_AUGMENTAR_2 0X82
#define TECLA_REDUCIR_1 0X29
#define TECLA_REDUCIR_2 0X829
#define TECLA_PREGUNTA_1 0X2C
#define TECLA_PREGUNTA_2 0X82C
#define TECLA_MENU_1 0XD9F9700B
#define TECLA_MENU_2 0XBFB8F2FE
#define TECLA_RALLAS_1 0X3C
#define TECLA_RALLAS_2 0X83C
#define TECLA_ARRIBA_1 0XE5139CA7
#define TECLA_ARRIBA_2 0XAC516266
#define TECLA_ABAJO_1 0XE4139B12
#define TECLA_ABAJO_2 0XAD5163FB
#define TECLA_IZQUIERDA_1 0XDB9D3097
#define TECLA_IZQUIERDA_2 0XBE15326E
#define TECLA_DERECHA_1 0X9FA96F
#define TECLA_DERECHA_2 0X9912B99A
#define TECLA_VOL_MENOS_1 0X11
#define TECLA_VOL_MENOS_2 0X811
#define TECLA_VOL_MAS_1 0X10
#define TECLA_VOL_MAS_2 0X810
#define TECLA_P_MENOS_1 0X21
#define TECLA_P_MENOS_2 0X821
#define TECLA_P_MAS_1 0X20
#define TECLA_P_MAS_2 0X820
#define TECLA_UNO_1 0X1
#define TECLA_UNO_2 0X801
#define TECLA_DOS_1 0X2
#define TECLA_DOS_2 0X802
#define TECLA_TRES_1 0X3
#define TECLA_TRES_2 0X803
#define TECLA_CUATRO_1 0X4
#define TECLA_CUATRO_2 0X804
#define TECLA_CINCO_1 0X5
#define TECLA_CINCO_2 0X805
#define TECLA_SEIS_1 0X6
#define TECLA_SEIS_2 0X806
#define TECLA_SIETE_1 0X7
#define TECLA_SIETE_2 0X807
#define TECLA_OCHO_1 0X8
#define TECLA_OCHO_2 0X808
#define TECLA_NUEVE_1 0X9
#define TECLA_NUEVE_2 0X809
#define TECLA_CERO_1 0X0
#define TECLA_CERO_2 0X800
const int receptorPin_12 = 12; // PIN Nº12
IRrecv irrecv(receptorPin_12); // IRRECV
decode_results results;
//// Variables ///////////////////////////////////////////////////////////////
Servo servo_derecho_delantero; int calibracion_dd = -1; // Servos and calibration.
Servo servo_izquierdo_delantero; int calibracion_id = -3;
Servo servo_derecho_trasero; int calibracion_dt = -2;
Servo servo_izquierdo_trasero; int calibracion_it = 2;
// Variables, inicial positions
int v_d_a = 0; // velocidad_derecha_actual
int v_i_a = 0; // velocidad_izquierda_actual
int a_r_d_d_a = 90; // angulo_rueda_derecha_delantera_actual
int a_r_i_d_a = 90; // angulo_rueda_izquierda_delantera_actual
int a_r_d_t_a = 90; // angulo_rueda_derecha_trasera_actual
int a_r_i_t_a = 90; // angulo_rueda_izquierda_trasera_actual
int traccion_actual = 0;
//// Variables of 4 motors ///////////////////////////////////////////////
int ENA=5; //connected to Arduino's port 5 (output pwm)
int IN1=2; //connected to Arduino's port 2
int IN2=8; //connected to Arduino's port 8 (ojo que originariamente era la salida 3.
int ENB=6; //connected to Arduino's port 6(output pwm)
int IN3=4; //connected to Arduino's port 4
int IN4=7; //connected to Arduino's port 7
//// Cofiguration of Arduino ///////////////////////////////////////////////////////////////////
void setup(){
Serial.begin(115200); // Conection of PC and Arduino
irrecv.enableIRIn(); // Renote control
//// Configuratión of 4 servos //////////////////////////////////////////////////////////////
servo_derecho_delantero.attach(11); delay(100);
servo_izquierdo_delantero.attach(10);delay(100);
servo_derecho_trasero.attach(9);delay(100);
servo_izquierdo_trasero.attach(3);delay(100);
recto();
//// Configuration of KEYES L298N board.////////////////////////////////////////
pinMode(ENA,OUTPUT); // Inputs
pinMode(ENB,OUTPUT);
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
delay(500);}
//// Main programe //////////////////////////////////////////////////////////////////////
void loop(){
if (irrecv.decode(&results)) {mostrarTecla();}}
//// The End //////////////////////////////////////////////////////////////////////////
//// Motor break /////////////////////////////////////////////////////////////
void frenar() {
digitalWrite(ENA,LOW); //motor A
digitalWrite(ENB,LOW);} //motor B
////Fuction run /////////////////////////////////////////////////////
void recto(){
desplazar(0,0,90,90,90,90,0);}
//// Run fuction of robot ///////////////////////////////////////////////////////////////////////////////////
void desplazar(int velocida_derecha,int velocida_izquierda,int angulo_rueda_derecha_delantera,int angulo_rueda_izquierda_delantera,int angulo_rueda_derecha_trasera,int angulo_rueda_izquierda_trasera,int traccion) {
boolean giro_derecho; // Variable que define el sentido de giro de los motores
boolean giro_izquierdo; // Variable que define el sentido de giro de los motores
// Variables que almacenan los valores entrantes actuales de velocidad, giro y tracción.
v_d_a = velocida_derecha;
v_i_a = velocida_izquierda;
a_r_d_d_a = angulo_rueda_derecha_delantera;
a_r_i_d_a = angulo_rueda_izquierda_delantera;
a_r_d_t_a = angulo_rueda_derecha_trasera;
a_r_i_t_a = angulo_rueda_izquierda_trasera;
traccion_actual = traccion;
// Run configuration //////////////////////////////////////////////////////////////////////////
if (traccion == 0){
giro_derecho = HIGH;
giro_izquierdo = LOW;}
if (traccion == 1){
giro_derecho = LOW;
giro_izquierdo = HIGH;}
if (traccion == 2){
giro_derecho = LOW;
giro_izquierdo = LOW;}
if (traccion == 3){
giro_derecho = HIGH;
giro_izquierdo = HIGH;}
//// Motor A //////////////////////////////////////////////////////////////////////////////
digitalWrite(IN1,giro_derecho); // IN1 y IN2 motor A. .
digitalWrite(IN2,!giro_derecho);
analogWrite(ENA,velocida_derecha); // motor A
//// Motor B //////////////////////////////////////////////////////////////////////////////
digitalWrite(IN3,giro_izquierdo); // IN3 y IN4l motor B.
digitalWrite(IN4,!giro_izquierdo);
analogWrite(ENB,velocida_izquierda); // motor B
//// Giro de la dirección ////////////////////////////////////////////////////////////////////
delay(150); // Espera a que el robot se ponga en movimiento. El coeficiente de rozamiento dinámico es inferior al coeficiente de rozamiento estàtico. Los servos consumen menos energia.
servo_derecho_delantero.writeMicroseconds(map(angulo_rueda_derecha_delantera + calibracion_dd,-5, 185,455,2144)); // (0,180,500,2100) // Giro de la rueda derecha delantera
delay(50); /
servo_izquierdo_delantero.writeMicroseconds(map(angulo_rueda_izquierda_delantera + calibracion_id,-5, 185,455,2144));
delay(50);
servo_derecho_trasero.writeMicroseconds(map(angulo_rueda_derecha_trasera + calibracion_dt,-5, 185,455,2144));
delay(50);
servo_izquierdo_trasero.writeMicroseconds(map(angulo_rueda_izquierda_trasera + calibracion_it,-5, 185,455,2144));}
//// Function IR remote control PHILIPS ////////////////////////
void mostrarTecla (){
switch (results.value) { // Llega el valor del mando de infrarrojos y lo compara con el "case" que corresponda. Y hace la sentencia del "case"
case TECLA_ON_1: desplazar(0,0,90,90,90,90,0);break; // Caso para la tecla ON
case TECLA_ON_2 : desplazar(0,0,90,90,90,90,0);break;
case TECLA_ROJA_1: desplazar(v_d_a,v_i_a,a_r_d_d_a-2,a_r_i_d_a-2,a_r_d_t_a-2,a_r_i_t_a-2,traccion_actual); break;
case TECLA_ROJA_2: desplazar(v_d_a,v_i_a,a_r_d_d_a-2,a_r_i_d_a-2,a_r_d_t_a-2,a_r_i_t_a-2,traccion_actual); break;
case TECLA_VERDE_1 : desplazar(v_d_a,v_i_a,a_r_d_d_a-2,a_r_i_d_a 2,a_r_d_t_a+2,a_r_i_t_a+2,traccion_actual); break;
case TECLA_VERDE_2 : desplazar(v_d_a,v_i_a,a_r_d_d_a-2,a_r_i_d_a-2,a_r_d_t_a+2,a_r_i_t_a+2,traccion_actual); break;
case TECLA_AMARILLA_1 : desplazar(v_d_a,v_i_a,a_r_d_d_a+2,a_r_i_d_a+2,a_r_d_t_a-2,a_r_i_t_a-2,traccion_actual); break;
case TECLA_AMARILLA_2 : desplazar(v_d_a,v_i_a,a_r_d_d_a+2,a_r_i_d_a+2,a_r_d_t_a-2,a_r_i_t_a-2,traccion_actual); break;
case TECLA_GRIS_1 : desplazar(v_d_a,v_i_a,a_r_d_d_a+2,a_r_i_d_a+2,a_r_d_t_a+2,a_r_i_t_a+2,traccion_actual); break;
case TECLA_GRIS_2 : desplazar(v_d_a,v_i_a,a_r_d_d_a+2,a_r_i_d_a+2,a_r_d_t_a+2,a_r_i_t_a+2,traccion_actual); break;
case TECLA_i_1 : desplazar(255,255,90,90,90,90,2);break;
case TECLA_i_2 : desplazar(255,255,90,90,90,90,2);break;
case TECLA_AUGMENTAR_1 : desplazar(155,155,45,45,45,45,0);break;
case TECLA_AUGMENTAR_2 : desplazar(155,155,45,45,45,45,0);break;
case TECLA_REDUCIR_1 : desplazar(155,155,135,135,135,135,0);break;
case TECLA_REDUCIR_2 : desplazar(155,155,135,135,135,135,0);break;
case TECLA_PREGUNTA_1 : desplazar(255,255,90,90,90,90,3);break;
case TECLA_PREGUNTA_2 : desplazar(255,255,90,90,90,90,3);break;
case TECLA_MUSICA_1 : desplazar(v_d_a,v_i_a,3,0,3,16,0);break;
case TECLA_MUSICA_2 : desplazar(v_d_a,v_i_a,3,0,3,16,0);break;
case TECLA_RADIO_1 : desplazar(v_d_a,v_i_a,90,90,90,90,0);break;
case TECLA_RADIO_2 : desplazar(v_d_a,v_i_a,90,90,90,90,0);break;
case TECLA_PANTALLA_1 : desplazar(v_d_a,v_i_a,200,200,174,160,0);break;
case TECLA_PANTALLA_2 : desplazar(v_d_a,v_i_a,200,200,174,160,0);break;
case TECLA_MENU_1 : desplazar(v_d_a,v_i_a,a_r_d_d_a-5,a_r_i_d_a-5,a_r_d_t_a,a_r_i_t_a,traccion_actual); break;
case TECLA_MENU_2 : desplazar(v_d_a,v_i_a,a_r_d_d_a-5,a_r_i_d_a-5,a_r_d_t_a,a_r_i_t_a,traccion_actual); break;
case TECLA_RALLAS_1 : desplazar(v_d_a,v_i_a,a_r_d_d_a+5,a_r_i_d_a+5,a_r_d_t_a,a_r_i_t_a,traccion_actual); break;
case TECLA_RALLAS_2 : desplazar(v_d_a,v_i_a,a_r_d_d_a+5,a_r_i_d_a+5,a_r_d_t_a,a_r_i_t_a,traccion_actual); break;
case TECLA_ARRIBA_1 : desplazar(155,155,90,90,90,90,0); break;
case TECLA_ARRIBA_2 : desplazar(155,155,90,90,90,90,0); break;
case TECLA_ABAJO_1 : desplazar(155,155,90,90,90,90,1); break;
case TECLA_ABAJO_2 : desplazar(155,155,90,90,90,90,1); break;
case TECLA_IZQUIERDA_1 : desplazar(155,155,0,0,0,0,0); break;
case TECLA_IZQUIERDA_2 : desplazar(155,155,0,0,0,0,0); break;
case TECLA_DERECHA_1 : desplazar(155,155,180,180,180,180,0); break;
case TECLA_DERECHA_2 : desplazar(155,155,180,180,180,180,0); break;
case TECLA_VOL_MENOS_1 : desplazar(v_d_a-10,v_i_a-10,a_r_d_d_a,a_r_i_d_a,a_r_d_t_a,a_r_i_t_a,0); break;
case TECLA_VOL_MENOS_2 : desplazar(v_d_a-10,v_i_a-10,a_r_d_d_a,a_r_i_d_a,a_r_d_t_a,a_r_i_t_a,0); break;
case TECLA_VOL_MAS_1 : desplazar(v_d_a+10,v_i_a+10,a_r_d_d_a,a_r_i_d_a,a_r_d_t_a,a_r_i_t_a,0); break;
case TECLA_VOL_MAS_2 : desplazar(v_d_a+10,v_i_a+10,a_r_d_d_a,a_r_i_d_a,a_r_d_t_a,a_r_i_t_a,0); break;
case TECLA_P_MENOS_1 : desplazar(v_d_a-10,v_i_a-10,a_r_d_d_a,a_r_i_d_a,a_r_d_t_a,a_r_i_t_a,1); break;
case TECLA_P_MENOS_2 : desplazar(v_d_a-10,v_i_a-10,a_r_d_d_a,a_r_i_d_a,a_r_d_t_a,a_r_i_t_a,1); break;
case TECLA_P_MAS_1 : desplazar(v_d_a+10,v_i_a+10,a_r_d_d_a,a_r_i_d_a,a_r_d_t_a,a_r_i_t_a,1); break;
case TECLA_P_MAS_2 : desplazar(v_d_a+10,v_i_a+10,a_r_d_d_a,a_r_i_d_a,a_r_d_t_a,a_r_i_t_a,1); break;
case TECLA_UNO_1 : desplazar(68,150,124,105,56,75,0);break;
case TECLA_UNO_2 : desplazar(68,150,124,105,56,75,0);break;
case TECLA_DOS_1 : desplazar(150,68,75,56,105,124,0);break;
case TECLA_DOS_2 : desplazar(150,68,75,56,105,124,0);break;
case TECLA_TRES_1 : desplazar(68,150,147.5,109,32.5,71.2,0);break;
case TECLA_TRES_2 : desplazar(68,150,147.5,109,32.5,71.2,0);break;
case TECLA_CUATRO_1 : desplazar(150,68,71.2,32.5,109,147.5,0);break;
case TECLA_CUATRO_2 : desplazar(150,68,71.2,32.5,109,147.5,0);break;
case TECLA_CINCO_1 : Serial.print("TECLA CINCO_1 = ");Serial.println(TECLA_CINCO_1,HEX); break;
case TECLA_CINCO_2 : Serial.print("TECLA CINCO_2 = ");Serial.println(TECLA_CINCO_2,HEX); break;
case TECLA_SEIS_1 : Serial.print("TECLA SEIS_1 = ");Serial.println(TECLA_SEIS_1,HEX); break;
case TECLA_SEIS_2 : Serial.print("TECLA SEIS_2 = ");Serial.println(TECLA_SEIS_2,HEX); break;
case TECLA_SIETE_1 : Serial.print("TECLA SIETE_1 = ");Serial.println(TECLA_SIETE_1,HEX); break;
case TECLA_SIETE_2 : Serial.print("TECLA SIETE_2 = ");Serial.println(TECLA_SIETE_2,HEX); break;
case TECLA_OCHO_1 : Serial.print("TECLA OCHO_1 = ");Serial.println(TECLA_OCHO_1,HEX); break;
case TECLA_OCHO_2 : Serial.print("TECLA 0CHO_2 = ");Serial.println(TECLA_OCHO_2,HEX); break;
case TECLA_NUEVE_1:
case TECLA_NUEVE_2:
case TECLA_CERO_1:
case TECLA_CERO_2:
default : Serial.print("TECLA SENAL ERRONEA = ");Serial.println(results.value,HEX);break;}
irrecv.resume();}
///// The end ////////////////////////////////////////////////////////////////////////////////
Brilliant project, now add Raspberry and camera with OpenCV. Interface arduino and Rasbi you get a mini tesla, a battery operated self driving robo.
ReplyDeleteExcellent work andromina. Thanks for sharing your superb robot with us.
ReplyDelete