Parte I "Armado de la plataforma robotica"

Lo primero es armar una plataforma robótica como la que se muestra a continuación.

 

Material Necesario:


Parte II "Control basico de motores"

 

/*
Este ejemplo controla los motores de corriente directa de una forma básica
usa el shield de control de motores basado en el integrado L293B
 
Se usa un Arduino Uno y un Shield para motor de 1A
 
Codigo de dominio público wwww.suallabs.com 2014
 */
 
int EN1 = 6;  
int EN2 = 5;
int IN1 = 7;
int IN2 = 4;
// Define las constantes de control de los motores
 
void setup()
{   
    pinMode(IN2, OUTPUT);         
    pinMode(EN2, OUTPUT);         
    pinMode(EN1, OUTPUT);         
    pinMode(IN1, OUTPUT);             
// Inicializa los pines 4,5,6,7 como salidas 
}
 
void loop()
{
 Alto(6000);
 Avanzar(200,1000);
 Izquierda(100,1000);
 Avanzar(200,1000);
 Izquierda(100,1000);
 Avanzar(200,1000);
 Izquierda(100,1000);
 Avanzar(200,1000);
 Izquierda(100,1000);
 Alto(1000);
 Izquierda(200,1500);
 Derecha(200,1500);
 Avanzar(255,500);
 Regresar(255,500);
 Izquierda(100,3000);
 Derecha(100,3000);
 Avanzar(100,3000);
 Regresar(100,3000);
// Llama a diferentes sub rutinas de control
}
 
//********************
//AREA DE SUB RUTINAS
//********************
//Sub-rutina Avanzar, cuando esta sub-rutina es llamada el robot avanza
//Se ejecutara la subrutina por los milisegundos que estén entre paréntesis
int Avanzar(int Vel, int Mil){
  digitalWrite(IN2, LOW);    
  analogWrite(EN2,Vel);  
  digitalWrite(IN1, LOW);  
  analogWrite(EN1,Vel);    
  delay(Mil);
//Espera el tiempo que se indica entre paréntesis
//La configuración 0110 en los pines 10,11,12,13 
//hace que el robot avance
  }
 
//Sub-rutina Regresar, cuando esta sub-rutina es llamada el robot retrocede
//Se ejecutara la subrutina por los milisegundos que estén entre paréntesis
int Regresar(int Vel, int Mil){ 
  digitalWrite(IN2, HIGH);    
  analogWrite(EN2,Vel);  
  digitalWrite(IN1, HIGH);  
  analogWrite(EN1,Vel);    
  delay(Mil);
//Espera el tiempo que se indica entre paréntesis
//La configuración 1001 en los pines 10,11,12,13 
//hace que el robot regrese
  } 
 
//Sub-rutina Izquierda, cuando esta sub-rutina es llamada el robot gira a la izquierda
//Se ejecutara la subrutina por los milisegundos que estén entre paréntesis
int Izquierda(int Vel, int Mil){ 
  digitalWrite(IN2, LOW);    
  analogWrite(EN2,Vel);  
  digitalWrite(IN1, HIGH);  
  analogWrite(EN1,Vel);    
  delay(Mil);
//Espera el tiempo que se indica entre paréntesis
//La configuración 0101 en los pines 10,11,12,13 
//hace que el robot de vuelta a la izquierda
  } 
 
//Sub-rutina Derecha, cuando esta sub-rutina es llamada el robot gira a la derecha
//Se ejecutara la subrutina por los milisegundos que estén entre paréntesis
int Derecha(int Vel, int Mil){ 
  digitalWrite(IN2, HIGH);  
  analogWrite(EN2,Vel);  
  digitalWrite(IN1, LOW);  
  analogWrite(EN1,Vel);    
  delay(Mil);
//Espera el tiempo que se indica entre paréntesis
//La configuración 1010 en los pines 10,11,12,13 
//hace que el robot de vuelta a la derecha
  }
  
//Sub-rutina Alto, cuando esta sub-rutina es llamada el robot hace un alto
int Alto(int Mil){
  digitalWrite(5, LOW);   
  digitalWrite(6, LOW);   
  delay(Mil);
//La configuración 0000 en los pines 10,11,12,13 
//hace que el robot haga un alto
  } 
 
 

Parte III "Control IR de una plataforma robótica"

 

/*

Este ejemplo es un programa para controlar una plataforma robotica

tipo diferencial, se usa un controlador de motores basado en el 

integrado L293 envia señales por los pines 4,5,6,7 hacia los motores

por otro lado recibe señales IR por el pin 11, en este caso se usa 

una plataforma robotica, un Arduino uno, un controlador de motores

un shield de entradas salidas y un sensor de IR.

Codigo de dominio publico www.suallabs.com 2014

*/

 
#include <IRremote.h>
// Llama a la libreria que controla el IR
 
int RECV_PIN = 11;
//Pin donde se conecta el sensor IR
int EN1 = 6;  
int EN2 = 5;
int IN1 = 7;
int IN2 = 4;
// Define las constantes de control de los motores
long valorAvanzar = 0x20DF02FD;
long valorRegresar = 0x20DF827D;
long valorIzquierda = 0x20DFE01F;
long valorDerecha = 0x20DF609F;
//Valores para control del robot
long valorRepetido = 0xFFFFFFFF;
//Valor que se envia cuando se pulsa dos veces la misma tecla
long valorRecibido= 0xFFFFFFFF;
long valorGuardado = 0xFFFFFFFF;
//Valores temporales de trabajo
IRrecv irrecv(RECV_PIN);
//Inicializa el sensor IR
decode_results results;
// Define la variable results
void setup()
{
  Serial.begin(9600);
// Inicia la comunicacion serial
  irrecv.enableIRIn(); 
// Inicia el IR
    pinMode(IN2, OUTPUT);         
    pinMode(EN2, OUTPUT);         
    pinMode(EN1, OUTPUT);         
    pinMode(IN1, OUTPUT);              
// Inicializa los pines 4,5,6,7 como salidas    
}
 
void loop() {
  if (irrecv.decode(&results)) {
    //Recibe el primer valor IR
    irrecv.resume(); 
    //Para la recepcion de señales IR
  }
  valorRecibido = results.value;  
  //Extrae el valor IR
 if (valorRecibido != valorRepetido){
  valorGuardado = valorRecibido;
  Serial.print("Guardado ");
  Serial.println(valorGuardado, HEX);
  //Si el valor recibido es diferente de valorRepetido 
  //guarda el valor recuperado para usarlo luego
  }
  else {
  valorRecibido = valorGuardado;
  Serial.print("Recibido ");
  Serial.println(valorRecibido, HEX);
  //Se recibio una tecla repetida asi que se recupera el valor guardado
  }
  
  if (valorRecibido == valorAvanzar){
    Serial.println("Avanzar");
    Avanzar(200, 255);
  }
  else if(valorRecibido == valorRegresar){
    Serial.println("Regresar");    
    Regresar(200,255);
  }
  else if(valorRecibido == valorIzquierda){
    Serial.println("Izquierda");    
    Izquierda(200,255);
  }
  else if(valorRecibido == valorDerecha){
    Serial.println("Derecha");    
    Derecha(200,255);
  }
  else {Alto(10);}
  delay(50);
}
 
//********************
//AREA DE SUB RUTINAS
//********************
//Sub-rutina Avanzar, cuando esta sub-rutina es llamada el robot avanza
//Se ejecutara la subrutina por los milisegundos que estén entre paréntesis
int Avanzar(int Vel, int Mil){  
  digitalWrite(IN2, LOW);    
  analogWrite(EN2,Vel);    
  digitalWrite(IN1, LOW);    
  analogWrite(EN1,Vel);     
  delay(Mil);
//Espera el tiempo que se indica entre paréntesis
//La configuración 0110 en los pines 10,11,12,13 
//hace que el robot avance
  }
 
//Sub-rutina Regresar, cuando esta sub-rutina es llamada el robot retrocede
//Se ejecutara la subrutina por los milisegundos que estén entre paréntesis
int Regresar(int Vel, int Mil){ 
  digitalWrite(IN2, HIGH);     
  analogWrite(EN2,Vel);    
  digitalWrite(IN1, HIGH);    
  analogWrite(EN1,Vel);     
  delay(Mil); 
//Espera el tiempo que se indica entre paréntesis
//La configuración 1001 en los pines 10,11,12,13 
//hace que el robot regrese
  } 
 
//Sub-rutina Izquierda, cuando esta sub-rutina es llamada el robot gira a la izquierda
//Se ejecutara la subrutina por los milisegundos que estén entre paréntesis
int Izquierda(int Vel, int Mil){ 
  digitalWrite(IN2, LOW);     
  analogWrite(EN2,Vel);    
  digitalWrite(IN1, HIGH);    
  analogWrite(EN1,Vel);     
  delay(Mil);
//Espera el tiempo que se indica entre paréntesis
//La configuración 0101 en los pines 10,11,12,13 
//hace que el robot de vuelta a la izquierda
  } 
 
//Sub-rutina Derecha, cuando esta sub-rutina es llamada el robot gira a la derecha
//Se ejecutara la subrutina por los milisegundos que estén entre paréntesis
int Derecha(int Vel, int Mil){ 
  digitalWrite(IN2, HIGH);  
  analogWrite(EN2,Vel);    
  digitalWrite(IN1, LOW);    
  analogWrite(EN1,Vel);     
  delay(Mil); 
//Espera el tiempo que se indica entre paréntesis
//La configuración 1010 en los pines 10,11,12,13 
//hace que el robot de vuelta a la derecha
  }
  
//Sub-rutina Alto, cuando esta sub-rutina es llamada el robot hace un alto
int Alto(int Mil){
  digitalWrite(5, LOW);   
  digitalWrite(6, LOW);   
  delay(Mil);
//La configuración 0000 en los pines 10,11,12,13 
//hace que el robot haga un alto
  }
 

Regresar