Desde 1994 en la Red. La pagina de los aficionados a la electronica, informatica y otras curiosidades de la vida. No dudes en visitarnos.
Ahora 2 visitas.| 3409901 Visitas (desde Dic. 2011), hoy: 271 Visitas 854 Pag. Vistas , ultimos 36 dias: 10133 Visitas. 48531 Pag. Vistas. Tu IP: 18.221.53.209
Que ando curioseando:
AutosuficienciaCosas de casaElectronicaEn InternetInformáticaMundo MisticoSin categoríaSociedadTe lo recomiendo

Construye tu robot por menos de 20€ con Arduino. Arduino Robot Ps (10)

Arduino Robot Ps

Parte 7

La programación…

Nuestro robot, sin código, no es un robot, para ello nos plantearemos un propósito (en nuestro caso una serie de movimientos) y nos ponemos manos a la obra.

Una vez todo montado, lo conectaremos a nuestro ordenador con el cable USB. No olvides retirar la alimentación de la placa de Arduino, ya que de lo contrario, estarás alimentando este por el USB junto con el driver motor, lo que hará que el robot pueda empezar a moverse en la mesa.

Primera modificación:

/*********************************************************************************************

  Tutorial: Arduino Robot Ps V1.0
  Autor: Pesadillo.com Agosto 2015

http://www.pesadillo.com

 ********************************************************************************************/
//esto es una linea comentada (no se ejecuta en el codigo)

/*
Esto es una frase comentada (no se ejecutaen el codigo)
*/

/*
En este ejercicio estudiamos el comportamiento de las variables "delay" para adaptarlas a los movimientos deseados.
Intentamos conseguir el tiempo necesario en milisegundos para el giro de 90º
*/
 
 
#define MOTOR1_CTL1  8  // I1
#define MOTOR1_CTL2  9  // I2
#define MOTOR1_PWM   11 // EA

#define MOTOR2_CTL1  6  // I3
#define MOTOR2_CTL2  7  // I4
#define MOTOR2_PWM   10 // EB

#define MOTOR_DIR_FORWARD  0 //especificamos que la variable MOTOR_DIR_FORWARD es 0
#define MOTOR_DIR_BACKWARD   1

void setup()
{
  // Setup pins for motor 1
   pinMode(MOTOR1_CTL1,OUTPUT);//patilla 8
   pinMode(MOTOR1_CTL2,OUTPUT);//patilla 9
   pinMode(MOTOR1_PWM,OUTPUT);
   
  // Setup pins for motor 2
   pinMode(MOTOR2_CTL1,OUTPUT);//patilla 6
   pinMode(MOTOR2_CTL2,OUTPUT);//patilla 7 (definidas mas arriba)
   pinMode(MOTOR2_PWM,OUTPUT);   
}

void setSpeed(char motor_num, char motor_speed)
{
   if (motor_num == 1)
   {
      analogWrite(MOTOR1_PWM, motor_speed);
   }   
   else
   {
      analogWrite(MOTOR2_PWM, motor_speed);
   }
}

void motorStart(char motor_num, byte direction)
{
  
   char pin_ctl1;
   char pin_ctl2;
   
   if (motor_num == 1)
   {
      pin_ctl1 = MOTOR1_CTL1;
      pin_ctl2 = MOTOR1_CTL2;
   }   
   else
   {
      pin_ctl1 = MOTOR2_CTL1;
      pin_ctl2 = MOTOR2_CTL2;     
   }
  
   switch (direction)
   {
     case MOTOR_DIR_FORWARD:
     {
       digitalWrite(pin_ctl1,LOW);
       digitalWrite(pin_ctl2,HIGH);          
     }
     break; 
          
     case MOTOR_DIR_BACKWARD:
     {
        digitalWrite(pin_ctl1,HIGH);
        digitalWrite(pin_ctl2,LOW);          
     }
     break;         
   }
}

void motorStop(char motor_num)
{
   setSpeed(motor_num, 0);
   if (motor_num == 1)
   {
     digitalWrite(MOTOR1_CTL1,LOW);
     digitalWrite(MOTOR1_CTL2,LOW);     
   }
   else
   {
     digitalWrite(MOTOR2_CTL1,LOW);
     digitalWrite(MOTOR2_CTL2,LOW);     
   }
}



void loop()
{
  // avance
  motorStart(1, MOTOR_DIR_FORWARD);  
  setSpeed(1, 50);
  motorStart(2, MOTOR_DIR_FORWARD);      
  setSpeed(2, 50);
  delay(2200);//2200 =1m de desplazamiento
  delay(2200);//2200 =1m
  delay(2200);//2200 =1m
  //Mientras el delay (retardo) se ejecuta no hace otra orden.
  
  //paro
  //mando parar los motores (salidas del Arduino)
  motorStop(1);
  motorStop(2);
  delay (5000);//espero

    // giro derecha 90g
  motorStart(1, MOTOR_DIR_FORWARD);  
  setSpeed(1, 50);
  motorStart(2, MOTOR_DIR_BACKWARD);      
  setSpeed(2, 50);
  delay(250);//90g
  //paro
  motorStop(1);
  motorStop(2);
  delay (5000);
  
  // giro izquierda 90g
  motorStart(2, MOTOR_DIR_FORWARD);  
  setSpeed(2, 50);
  motorStart(1, MOTOR_DIR_BACKWARD);      
  setSpeed(1, 50);
  delay(250);//90g
  //paro
  motorStop(1);
  motorStop(2);
  delay (5000);
  
  
  /*
  Ocultamos esta parte de codigo que no queremos ejecutar
  motorStart(1, MOTOR_DIR_BACKWARD);  
  setSpeed(1, 200);
  motorStart(2, MOTOR_DIR_BACKWARD);      
  setSpeed(2, 200);
  
  delay(2000);
  
  motorStart(1, MOTOR_DIR_FORWARD);  
  setSpeed(1, 140);
  motorStart(2, MOTOR_DIR_BACKWARD);      
  setSpeed(2, 140);  
  
  delay(2000);
  
  motorStart(1, MOTOR_DIR_BACKWARD);  
  setSpeed(1, 140);
  motorStart(2, MOTOR_DIR_FORWARD);      
  setSpeed(2, 140);  
  
  delay(2000); 
 */ 
  
}

Partiendo del primer código, estamos toqueteando este para conseguir dos cosas:
1- Saber cuanto tiempo (milisegundos) tiene que tener activos los motores (delay) para moverse 1 Metro.
2- Saber cuanto tiempo (milesegundos) debemos darle a los motores en sentidos contrarios para que se gire 45grados.

Puedes hacer tus pruebas. Aquí el segundo test de nuestro prototipo:

Programamos

En marcha!:

El próximo día seguimos con las modificaciones y simplificaciones (aprenderás el funcionamiento de la programación con las explicaciones a lo largo de todo es código). Nos vemos.

Escribe un comentario

Tu comentario