Ejercicio 29: Ruta codificada

El robot sigue una trayectoria predefinida.

Novedades hardwareNovedades software
 Codificación de trayectorias en cadenas

Requisitos: Chasis del robot, circuito de potencia

Planteamiento: Va a trazar la letra M

Presentación de: Codificación manual de trayectorias.

Vamos a usar una cadena para guardar la secuencia de movimientos, que identificamos con números:

  • 0 para avanzar
  • 1para retroceder
  • 2 para girar a la derecha
  • 3 para girar a la izquierda

Usaremos condicionales para asignar a cada uno de esos valores una función que realice el movimiento.

Las funciones que realizan el movimiento constan del procedimiento básico para el movimiento y un delay con un valor que determina la duración del movimiento. Si corresponden a un desplazamiento el delay toma el valor de la variable “dist”. Si corresponden a un giro la variable es “ang”.

Luego cada función que corresponde a un movimiento tiene como argumento el valor de la variable “dist” o el valor de la variable “ang”. Las duraciones están guardadas en las cadenas distancias[ ] y angulos[ ], de forma que la posición de cada valor corresponde a la posición del movimiento correspondiente.

Las variables “dist” y “ang” se actualizan tomando los valores de las cadenas distancias[ ] y angulos[ ] cuando la iteración del bucle for principal va recorriendo las sucesivas posiciones de las cadenas.

Los condicionales seleccionan qué función corresponde (y, por tanto, qué movimiento) y la función toma el valor actualizado de su variable.

Variantes:

  • Prueba a codificar otras letras y haz que tu robot escriba una palabra.
  • Haz un recorrido de ida y vuelta, con el robot retrocediendo sobre sus pasos y con el robot girando para recorrer el camino de vuelta mientras avanza.
  • Añade un cuarto valor (4) que represente estar parado e incluye tiempos de parada en tu recorrido. (Si tu robot no puede parase, ponlo a dar un nº completo de vueltas).

CODIGO FUENTE

 Copyright (C) 2006  Juan Carlos Alonso de Mena
 This program is free software; you can redistribute it and/or modify it under the terms
 of the GNU General Public License as published by the Free Software Foundation;
 See the GNU General Public License for more details?

  • Motor dc y circuito con par Darlington y relé de doble conmutador configurado como un inversor de giro:

 int motori =6;
 int motord =8;
 int n=0;
 int m=0;
 //int unidist=800;
 //int uniang=3200;
 int movimientos[]={0,2,0,3,0,2,0};               //cadena en la que el nº indica el tipo de movimiento y la posición el orden
 int distancias[]={4000,0,1500,0,1500,0,4000};    //distancias en los avences y retrocesos, nótense los 0 para los giros
 int angulos[]={0,3200*3/8,0,3200/4,0,3200*3/8,0};//valores de los giros relativos a la vuelta completa,
                                                  //nótense los 0 para los desplazamientos
 int dist=0;
 int ang=0;
 void setup(){
   pinMode(motori,OUTPUT);
   pinMode(motord,OUTPUT);
   pinMode(13,OUTPUT); 
 }
 void avanza(){
   digitalWrite(motori,LOW);
   digitalWrite(motord,LOW);
 }
 void retrocede(){
   digitalWrite(motord,HIGH);
   digitalWrite(motori,HIGH);
 }  
 void giraderecha(){
   digitalWrite(motord,HIGH);
   digitalWrite(motori,LOW); 
 }
 void giraizquierda(){
   digitalWrite(motord,LOW);
   digitalWrite(motori,HIGH);
 }
 void adelante(int dist){        //función que hace avanzar una distancia guardada en la variable dist
   avanza();
   delay(dist);
 }
 void atras(int dist){           //función que hace retroceder una distancia   guardada en la variable dist
   retrocede();
   delay(dist);
 }   
 void derecha(int ang){          //función que hace girar a la derecha un valor guardado en la variable ang
   giraderecha();
   delay(ang);
 } 
 void izquierda(int ang){        //función que hace girar a la izquierda un valor guardado en la variable ang
   giraizquierda();
   delay(ang);
 }
 void loop(){
   digitalWrite(13,HIGH);        //se enciende un LED para indicar que comienza
   delay(3000);
   digitalWrite(13,LOW);
   for(m=0;m<7;m++){             //iteración que recorre las cadenas de movimientos, distancias y ángulos a la vez
     dist=distancias[m];         //variable que recoje el valor de la cadena para entregarla a la función
     ang=angulos[m];
     if(movimientos[m]==0){      //según el valor de la cadena tenemos un movimiento u otro
       adelante(dist);
     }
     if(movimientos[m]==1){
       atras(dist);
     }
     if(movimientos[m]==2){
       derecha(ang);
     }
     if(movimientos[m]==3){
       izquierda(ang);
     }
   }
   while(m>=7){                  //cuando ha terminado se pone a dar vueltas
    giraderecha();
   }
 }

  • Motor dc y circuito con driver integrado 293D:

 int activai=8;
 int activad=13;
 int motord1=9;
 int motord2=10;
 int motori1=11;
 int motori2=12;
 int puls=2;
 int n=0;
 int m=0;
 //int unidist=1200;
 //int unigrado=5200;
 int movimientos[]={0,2,0,3,0,2,0};                //cadena en la que el nº indica el  tipo de movimiento y la posición el orden 
 int distancias[]={6000,0,2500,0,2500,0,6000};     //distancias en los avences y  retrocesos, nótense los 0 para los giros
 int angulos[]={0,5200*3/8,0,5200/4,0,5200*3/8,0}; //valores de los giros relativos a la vuelta completa, 
                                                   //nótense los 0 para los desplazamientos
 int dist=0;
 int ang=0;
 void para(){                                         
   digitalWrite(activai,LOW);
   digitalWrite(activad,LOW);
 }
 void setup(){
   pinMode(motori1,OUTPUT);
   pinMode(motori2,OUTPUT);
   pinMode(motord1,OUTPUT);
   pinMode(motord2,OUTPUT);
   pinMode(activai,OUTPUT);
   pinMode(activad,OUTPUT);
   pinMode(puls,INPUT);  
   while(digitalRead(puls)==LOW){  //espera a que se pulse para comenzar
     para();
   }   
 }
 void avanza(){
   digitalWrite(motori1,HIGH);
   digitalWrite(motori2,LOW);
   digitalWrite(motord1,HIGH);
   digitalWrite(motord2,LOW); 
 }
 void retrocede(){
   digitalWrite(motori1,LOW);
   digitalWrite(motori2,HIGH);
   digitalWrite(motord1,LOW);
   digitalWrite(motord2,HIGH);
 }  
 void giraderecha(){
   digitalWrite(motori1,HIGH);
   digitalWrite(motori2,LOW);
   digitalWrite(motord1,LOW);
   digitalWrite(motord2,HIGH);
 }
 void giraizquierda(){
   digitalWrite(motord1,HIGH);
   digitalWrite(motord2,LOW);
   digitalWrite(motori1,LOW);
   digitalWrite(motori2,HIGH);
 }
 void adelante(int dist){          //función que hace avanzar una distancia guardada en la variable dist
   avanza();
   delay(dist);
 }
 void atras(int dist){             //función que hace retroceder una distancia guardada en la   variable dist
   retrocede();
   delay(dist);
 }  
 void derecha(int ang){            //función que hace girar a la derecha un valor guardado en la   variable ang
   giraderecha();
   delay(ang);
 } 
 void izquierda(int ang){          //función que hace girar a la izquierda un valor guardado en  la variable ang
   giraizquierda();
   delay(ang); 
 }
 void loop(){
   digitalWrite(activai,HIGH);     //activamos los motores
   digitalWrite(activad,HIGH);
   for(m=0;m<7;m++){               //iteración que recorre las cadenas de movimientos, distancias y ángulos a la vez
     dist=distancias[m];           //variables que recojen los valores de las cadenas para entregarlos a las funciones
     ang=angulos[m];
     if(movimientos[m]==0){        //según el valor de la cadena tenemos un movimiento u otro
       adelante(dist);
     }
     if(movimientos[m]==1){
       atras(dist);
     }
     if(movimientos[m]==3){
       izquierda(ang);
     }
     if(movimientos[m]==2){
       derecha(ang);
     }
   }
   if(m>=7){
     while(digitalRead(puls)==LOW){//cuando ha terminado se para
      para();
     }
   }
 }

  • Motor paso a paso y circuito con driver integrado 74H245

 int vel2=5;         
 int vel =5; 
 int tgiro =10;         
 int unoai = 8;         
 int unobi = 9;         
 int dosai = 10;         
 int dosbi = 11;        
 int unoad = 2;
 int unobd = 3;
 int dosad = 4;
 int dosbd = 5;
 int puls=7;
 int n=0;
 int m=0;
 //int unidist=900;
 //int unigrado=4000;
 int movimientos[]={0,2,0,3,0,2,0};                //cadena en la que el nº indica el tipo de movimiento y la posición el orden
 int distancias[]={4000,0,1500,0,1500,0,4000};     //distancias en los avences y retrocesos, nótense los 0 para los giros
 int angulos[]={0,4000*3/8,0,4000/4,0,4000*3/8,0}; //valores de los giros relativos a la vuelta completa, 
                                                   //nótense los 0 para los desplazamientos
 int dist=0;
 int ang=0;
 void para(){
   digitalWrite(unoai,LOW);
   digitalWrite(unoad,LOW);
   digitalWrite(unobi,LOW);
   digitalWrite(unobd,LOW);
   digitalWrite(dosai,LOW);
   digitalWrite(dosad,LOW);
   digitalWrite(dosbi,LOW);
   digitalWrite(dosbd,LOW);
 }
 void setup(){
   pinMode(unoai,OUTPUT);      
   pinMode(unobi,OUTPUT);
   pinMode(dosai,OUTPUT);
   pinMode(dosbi,OUTPUT);
   pinMode(unoad,OUTPUT);
   pinMode(unobd,OUTPUT);
   pinMode(dosad,OUTPUT);
   pinMode(dosbd,OUTPUT);
   pinMode(puls,INPUT);
   while(digitalRead(puls)==LOW){  //espera a que se pulse para comenzar
     para();
   } 
 }
 void avanza(){
   digitalWrite(unoai,HIGH);
   digitalWrite(unoad,HIGH);
   digitalWrite(unobi,LOW);
   digitalWrite(unobd,LOW);
   digitalWrite(dosai,HIGH);
   digitalWrite(dosad,HIGH);
   digitalWrite(dosbi,LOW);
   digitalWrite(dosbd,LOW);
   delay(vel);
   digitalWrite(unoai,LOW);
   digitalWrite(unoad,LOW);
   digitalWrite(unobi,HIGH);
   digitalWrite(unobd,HIGH);
   delay(vel);
   digitalWrite(dosai,LOW);
   digitalWrite(dosad,LOW);
   digitalWrite(dosbi,HIGH);
   digitalWrite(dosbd,HIGH);
   delay(vel);
   digitalWrite(unoai,HIGH);
   digitalWrite(unoad,HIGH);
   digitalWrite(unobi,LOW);  
   digitalWrite(unobd,LOW);  
   delay(vel);
 } 
 void retrocede(){
   digitalWrite(unoai,LOW);
   digitalWrite(unoad,LOW);
   digitalWrite(unobi,HIGH);
   digitalWrite(unobd,HIGH);
   digitalWrite(dosai,LOW);
   digitalWrite(dosad,LOW);
   digitalWrite(dosbi,HIGH);
   digitalWrite(dosbd,HIGH);
   delay(vel);
   digitalWrite(unoai,HIGH);  
   digitalWrite(unoad,HIGH);
   digitalWrite(unobi,LOW);
   digitalWrite(unobd,LOW);
   delay(vel);
   digitalWrite(dosai,HIGH);
   digitalWrite(dosad,HIGH);
   digitalWrite(dosbi,LOW);
   digitalWrite(dosbd,LOW);
   delay(vel);
   digitalWrite(unoai,LOW);
   digitalWrite(unoad,LOW);
   digitalWrite(unobi,HIGH);  
   digitalWrite(unobd,HIGH);  
   delay(vel);
 }   
 void giraizquierda(){
   digitalWrite(unoad,HIGH);
   digitalWrite(unoai,LOW);
   digitalWrite(unobd,LOW);
   digitalWrite(unobi,HIGH);
   digitalWrite(dosad,HIGH);
   digitalWrite(dosai,LOW);
   digitalWrite(dosbd,LOW);
   digitalWrite(dosbi,HIGH);
   delay(vel2);
   digitalWrite(unoad,LOW);
   digitalWrite(dosbi,LOW);
   digitalWrite(unobd,HIGH);
   digitalWrite(dosai,HIGH); 
   delay(vel2); 
   digitalWrite(dosad,LOW);
   digitalWrite(unobi,LOW);
   digitalWrite(dosbd,HIGH);
   digitalWrite(unoai,HIGH);
   delay(vel2);
   digitalWrite(unoad,HIGH);
   digitalWrite(dosbi,HIGH);
   digitalWrite(unobd,LOW); 
   digitalWrite(dosai,LOW); 
   delay(vel2);    
 }
 void giraderecha(){
   digitalWrite(unoai,HIGH);
   digitalWrite(unoad,LOW);
   digitalWrite(unobi,LOW);
   digitalWrite(unobd,HIGH);
   digitalWrite(dosai,HIGH);
   digitalWrite(dosad,LOW);
   digitalWrite(dosbi,LOW);
   digitalWrite(dosbd,HIGH);
   delay(vel2);
   digitalWrite(unoai,LOW);
   digitalWrite(dosbd,LOW);
   digitalWrite(unobi,HIGH);
   digitalWrite(dosad,HIGH);
   delay(vel2); 
   digitalWrite(dosai,LOW);
   digitalWrite(unobd,LOW);
   digitalWrite(dosbi,HIGH);
   digitalWrite(unoad,HIGH);
   delay(vel2);
   digitalWrite(unoai,HIGH);
   digitalWrite(dosbd,HIGH);
   digitalWrite(unobi,LOW); 
   digitalWrite(dosad,LOW); 
   delay(vel2);    
 }
 void adelante(int dist){          //función que hace avanzar una distancia guardada en la variable dist
   avanza();
   delay(dist); 
 }
 void atras(int dist){             //función que hace retroceder una distancia guardada en   la variable dist
   retrocede();
   delay(dist);
 }

}

 void derecha(int ang){            //función que hace girar a la derecha un valor guardado en la variable ang
   giraderecha();
   delay(ang);
 } 
 void izquierda(int ang){          //función que hace girar a la izquierda un valor guardado en la variable ang
   giraizquierda();
   delay(ang);
 }
 void loop(){
   digitalWrite(13,LOW);
   for(m=0;m<7;m++){
     dist=distancias[m];           //variables que recojen los valores de las cadenas para entregarlos a las funciones
     ang=angulos[m];
     if(movimientos[m]==0){        //según el valor de la cadena tenemos un movimiento u otro
       adelante(dist);
     }
     if(movimientos[m]==1){
       atras(dist);
     }
     if(movimientos[m]==3){
       izquierda(angulos[m]);
     }
     if(movimientos[m]==2){
       derecha(angulos[m]);
     }
   }
   if(m>=7){                       //cuando ha terminado se para
     while(digitalRead(puls)==LOW){
       para();
     }
   }
 }

Volver?

  Copyright (c) 2006  Juan Carlos Alonso de Mena

  Permission is granted to copy, distribute and/or modify this document under the terms of 
 the GNU Free Documentation License, Version 1.2 or any later version published by the
 Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no
 Back-Cover Texts.  A copy of the license is included in the section entitled 
 GNU Free Documentation License?.