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 6 visitas.| 2994252 Visitas (desde Dic. 2011), hoy: 524 Visitas 6764 Pag. Vistas , ultimos 36 dias: 17034 Visitas. 100929 Pag. Vistas. Tu IP: 3.215.177.171
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 (13)

Arduino Robot Ps

Seguimos probando…

Una vez implementado este accesorio es hora de probarlo:

Un buen comportamiento, pero con alguna modificación de código quedaría mejor la exactitud de movimientos.

Intentando mejorar el código y simplificación de comandos he llegado a esto:

 

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

  Tutorial: Robot Ps
  Autor: www.pesadillo.com - 12 Agosto 2015

http://www.pesadillo.com/

  Implementamos altavoz para proporcionar pitidos de señalizacion. Simplificamos los giros en motores.

 ********************************************************************************************/
#define MOTOR1_CTL1  8  // I1
#define MOTOR1_CTL2  9  // I2

#define MOTOR2_CTL1  6  // I3
#define MOTOR2_CTL2  7  // I4

#define MOTOR_DIR_FORWARD  0
#define MOTOR_DIR_BACKWARD   1

int speakerPin = 13;  // declaro pin para speaker

void setup()
{
  // Setup pins for motor 1
   pinMode(MOTOR1_CTL1,OUTPUT);
   pinMode(MOTOR1_CTL2,OUTPUT);

  // Setup pins for motor 2
   pinMode(MOTOR2_CTL1,OUTPUT);
   pinMode(MOTOR2_CTL2,OUTPUT);

   // set the speaker pin mode to output
   pinMode(speakerPin, OUTPUT);
}

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)
{
   if (motor_num == 1)
   {
     digitalWrite(MOTOR1_CTL1,LOW);
     digitalWrite(MOTOR1_CTL2,LOW);
   }
   else
   {
     digitalWrite(MOTOR2_CTL1,LOW);
     digitalWrite(MOTOR2_CTL2,LOW);
   }
}

//pitidos
void pitido(char pitidos_num)
{

   for (int pip=0; pip<pitidos_num; pip++)
     {
     for (int i=300; i>0; i--)
     {
        digitalWrite(speakerPin, HIGH);
        delayMicroseconds(200);
        digitalWrite(speakerPin, LOW);
        delayMicroseconds(200);

     }
        delay (50);
     }
}

// avance

void avanza() //creamos el comando "avanza" y especificamos el comportamiento de las salidas (sentido de giro de los motores)
{
 digitalWrite(MOTOR1_CTL1,LOW);
 digitalWrite(MOTOR1_CTL2,HIGH);
 digitalWrite(MOTOR2_CTL1,LOW);
 digitalWrite(MOTOR2_CTL2,HIGH);
}

void para() //comando "para" donde dejamos de suministrar energia a los morores
{
 digitalWrite(MOTOR1_CTL1,LOW);
 digitalWrite(MOTOR1_CTL2,LOW);
 digitalWrite(MOTOR2_CTL1,LOW);
 digitalWrite(MOTOR2_CTL2,LOW);
pitido(2);
}

void girad() //giro a derecha
{
 digitalWrite(MOTOR1_CTL1,LOW);
 digitalWrite(MOTOR1_CTL2,HIGH);
 digitalWrite(MOTOR2_CTL1,HIGH);
 digitalWrite(MOTOR2_CTL2,LOW);
}

void girai() //giro a izquierda (vease que se alimenta uno de los polos de las bobinas del motor en funcion del giro deseado)
{
 digitalWrite(MOTOR1_CTL1,HIGH);
 digitalWrite(MOTOR1_CTL2,LOW);
 digitalWrite(MOTOR2_CTL1,LOW);
 digitalWrite(MOTOR2_CTL2,HIGH);
}

void atras()//atras... invertimos "avanza"
{
 digitalWrite(MOTOR1_CTL1,HIGH);
 digitalWrite(MOTOR1_CTL2,LOW);
 digitalWrite(MOTOR2_CTL1,HIGH);
 digitalWrite(MOTOR2_CTL2,LOW);
}

void loop()
{

    // usamos un bucle para hacer efecto silvido.
   for (int i=500; i>200; i--)
     {
        digitalWrite(speakerPin, HIGH);
        delayMicroseconds(i);
        digitalWrite(speakerPin, LOW);
        delayMicroseconds(i);

     }
    //fin pitido
   delay(5000);// espera 5 segundos

//Ejecutamos los comandos deseados llamando a los subprocesos:
avanza();
delay (2000);//paramos 5 segundos

para();
delay (5000);//paramos 5 segundos

atras();
delay (2000);//paramos 5 segundos

para();
delay (5000);//paramos 5 segundos

girad();
  delay(230);//= +-90g

para();
  delay (5000);//paramos 5 segundos

girai();
  delay(230);//= +-90g

para();
  delay (5000);//paramos 5 segundos

  // giro derecha 180g
girad();
  delay(460);//=+-180grados

para();
  delay (10000);//paramos 10 segundos

pitido(3);//damos 3 pitidos
delay (3000);//esperamos 3 segundos
}

Un código más entendible… podéis probarlo enviando la programación a la placa para ver su comportamiento.
El próximo día seguiremos con el desarrollo y aprendizaje.

Escribe un comentario

Tu comentario