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 4 visitas.| 2994256 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 (16)

Arduino Robot Ps

Llegados a este punto, donde hemos simplificado suficientemente lo comandos de acción sobre nuestros motores a través del Arduino, y viendo la eficacia de comando “array” para generar unas secuencias pre programadas, mejoramos el código de la siguiente manera:

 

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

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

http://www.pesadillo.com/

  Modificamos codigo para programar movimientos y tiempos predifinidos ILIMITADOS

 ********************************************************************************************/
#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
//Se termina de eliminar codigo antiguo con  el // que lo transforma en comentario y nos quedamos con el programa personalizado

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);
}

//pitidos (subproceso)
void pitido(char pitidos_num)
{
// el sibproceso pitido(3) Haría 3 pitidos)
   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);
     }
}

/*
Tarea a realizar por el robot
avanza(2000);//enviamos cuanto avanza
para(2000);//enviamos cuanto para
atras(2000);//enviamos cuanto atras...
para(2000);
girad(230);//= +-90g
para(2000);
girai(230);//= +-90g
para(2000);
girad(460);// giro derecha 180g
para(2000);
*/

//comandos (programa)
//definimos dos valores ilimitados, comado y tiempo de tarea (tarea)
// array con mismo numero de valores (se corresponden)
//tabla de comandos
// 0 = parar
// 1 = avanza
// 2 = atras
// 3 = giraderecha
// 4 = giraizquierda

//definimos un array  "comado" que almacena las ordenes a realizar
int comando[]={1,0,2,0,3,0,4,0,3,0,3,0};
//definimos un array "tarea" que especifica los tiempos de esa tarea
int tarea[]={1000,2000,1000,2000,230,2000,230,2000,460,1000,460,2000};

//Empieza el ciclo infinito
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);

 }
delay (5000);//esperamos 5 segundos despues de silvido

//comenzamos el ciclo del programa en el bucle
//si el programa esta bien definido (misma cantidad de valores) en "comando" y "tarea", ejecutamos el programa
if (sizeof(comando)==sizeof(tarea)){
  //ejecutamos las ordenes programadas en el array,
  //donde "sizeof(comando)" nos dará el numero total de comandos a realizar
  //y restamos 1 por que el primer comando ha de ser el array con valor "0"
  for (int i = 0; i < sizeof(comando)-1; i++) {
  // avance
  if (comando[i]==1)
  {
   digitalWrite(MOTOR1_CTL1,LOW);
   digitalWrite(MOTOR1_CTL2,HIGH);
   digitalWrite(MOTOR2_CTL1,LOW);
   digitalWrite(MOTOR2_CTL2,HIGH);
   delay (tarea[i]);
  }
  //giro derecha
  if (comando[i]==3)
  {
   digitalWrite(MOTOR1_CTL1,LOW);
   digitalWrite(MOTOR1_CTL2,HIGH);
   digitalWrite(MOTOR2_CTL1,HIGH);
   digitalWrite(MOTOR2_CTL2,LOW);
   delay (tarea[i]);
  }
  //giro izquierda
  if (comando[i]==4)
  {
   digitalWrite(MOTOR1_CTL1,HIGH);
   digitalWrite(MOTOR1_CTL2,LOW);
   digitalWrite(MOTOR2_CTL1,LOW);
   digitalWrite(MOTOR2_CTL2,HIGH);
   delay (tarea[i]);
  }
  //atras
  if (comando[i]==2)
  {
   digitalWrite(MOTOR1_CTL1,HIGH);
   digitalWrite(MOTOR1_CTL2,LOW);
   digitalWrite(MOTOR2_CTL1,HIGH);
   digitalWrite(MOTOR2_CTL2,LOW);
   delay (tarea[i]);
  }
  //para
  if (comando[i]==0)
  {
   digitalWrite(MOTOR1_CTL1,LOW);
   digitalWrite(MOTOR1_CTL2,LOW);
   digitalWrite(MOTOR2_CTL1,LOW);
   digitalWrite(MOTOR2_CTL2,LOW);
   pitido(2);
   delay (tarea[i]);
  }
  }
}

//Final de tarea programada y volvemos al principio despues de 3 pitidos y 3 segundos de espera.
pitido(3);
delay (3000);
}

Interesante… pre programamos tareas en un array “ilimitado”… ummm podríamos realizar varios subproceos para que se ejecutaran arrays distintos en función de si hay un choque, una acción de un haz de luz,…

La utilización de arrays es muy simple aún que podríamos entrar más en la utilización de “arrays dobles” que almacenan las dos variables, pero ahora no es el momento.

Lo que hemos estirado a 15 días (10 minutos diarios), se ha realizado en la mesa en una tarde de rompederos de cabeza, y funciona!!!

En este punto, damos por entendido el programa de control de nuestro robot y pasamos a tareas mayores….

Escribe un comentario

Tu comentario