Saturday, April 19, 2014

Andromina robot with a IR remote control. (Arduino, Raspberry, PICAXE, ROS robot)

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.

Arduino Robot and Raspberry Pi robot.
Andromina robot OFF ROAD and the IR remote control.

Arduino Rover and Raspberry Pi rover.
Disposal of the batteries.
/* Programe of Andromina Robot 4x4 with 4 multiderectiona wheels with 4 servos  + Arduino Uno + a "proshield" KEYES 5.1 + motor shield KEYES L298N. (17-04-2013). 
With a IR remote control PHILIPS.
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 ////////////////////////////////////////////////////////////////////////////////

2 comments:

  1. Brilliant project, now add Raspberry and camera with OpenCV. Interface arduino and Rasbi you get a mini tesla, a battery operated self driving robo.

    ReplyDelete
  2. Excellent work andromina. Thanks for sharing your superb robot with us.

    ReplyDelete

Google analytics