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….
Tuitear 1.823 Veces leído 0 comentarios |
16 septiembre 2015 en Electronica | tags: Arduino, Cursos, Electronica |