Ejercicio 27: Cuadrado

El robot recorre un cuadrado.

Novedades hardwareNovedades software
Relé 
Circuitos de potencia 

Requisitos: Chasis del robot, circuito de potencia

Planteamiento: Vamos a producir desplazamientos y giros controlados usando distintos tipos de circuitos de potencia y motores.

Presentación de: Par Darlington, Relé, drivers integrados 293D y 74H245

En este ejercicio creamos los procedimientos básicos que vamos a usar para mover el robot:

  • avanza( )
  • retrocede( )
  • giraderecha( )
  • giraizquierda( )
  • para( )

También calibramos los avances y los giros para tener un control cuantitativo del movimiento.

Como los robots tienen un motor responsable del movimiento de cada rueda, los giros, avances y retrocesos dependen de si uno o ambos motores giran en un sentido o en el contrario.

La forma concreta de los procedimientos depende de cómo se controlen las distintas combinaciones de motores y circuitos de potencia para producir un giro en un sentido o en el otro:

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

    Una salida digital por motor:

    --> Una salida digital HIGH corresponde a una posición del relé.
    --> Una salida digital LOW corresponde a la otra.

Si elegimos la posición de reposo del relé para el sentido de giro que corresponde al avance del motor, cuando la salida sea LOW, el motor avanza y cuando sea HIGH retrocede.

digitalWrite(motord,HIGH); avanza el motor derecho
digitalWrite(motori,LOW); retrocede el motor izquierdo

  • Motor dc y circuito con driver integrado 293D:

    Tres salidas digitales por motor:

    --> Una, que hemos guardado en las variables activai y activad. Si es LOW para el motor correspondiente.
    --> Una pareja relacionada, si una es HIGH, la otra debe ser LOW.

Según cuál sea HIGH tenemos uno u otro sentido de giro.

digitalWrite(activai,HIGH); activa motor izquierdo
digitalWrite(activad,HIGH); activa motor derecho

digitalWrite(motord1,HIGH);
digitalWrite(motord2,LOW); avanza motor derecho

digitalWrite(motori1,LOW);
digitalWrite(motori2,HIGH); retrocede motor izquierdo

digitalWrite(activai,LOW); para motor izquierdo
digitalWrite(activad,LOW); para motor derecho

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

    Cuatro salidas digitales por motor:

    En el ejercicio el Limpiaparabrisas? veíamos cómo enviar una secuencia de pulsos para hacer girar un motor paso a paso en uno u otro sentido. Ahora las secuencias son las mismas, pero como tenemos dos motores, para conseguir un movimiento más suave, intercalaremos los pulsos correspondientes a cada motor para tener sincronizadas las dos secuencias.

    Añadimos el procedimiento para( ), que simplemente no envía pulso alguno.

En el primer caso no hay una opción de mantener los motores parados. Podríamos haberla obtenido de una forma sencilla incorporando otro relé que actuara sobre la alimentación, pero eso complicaría el diseño y aumentaría el coste.

Se ha tenido muy en cuenta que el circuito de control con el par Darlington y el relé de doble conmutador actuando como inversor de giro es ampliamente utilizado en proyectos de robótica cableada, lo que permite reutilizar de forma fácil y rápida, y a muy bajo coste, robots cableados construidos previamente por los alumnos y actualizarlos a robots programables simplemente añadiendo la tarjeta Arduino.

Una vez tenemos los procedimientos que producen cada movimiento básico los vamos a usar para conseguir desplazamientos y giros controlados.

La duración del desplazamiento o giro se controla a través de un delay.

Establecemos la unidad de desplazamiento en 10 cm. y la unidad de giro en una vuelta completa.

Para ello debemos determinar los tiempos que tarda el robot en recorrer esa distancia y en dar una vuelta, por ejemplo:

unidist=800;
uniang=3200;

y expresamos distancias y giros como múltiplos o fracciones de estas referencias:

dist=5*unidist; correspondería a 50 cm
ang=uniang/a; correspondería a 90 grados.

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;                //salida digital al circuito de potencia del motor izquierdo
 int motord =8;                //salida digital al circuito de potencia del motor derecho
 int unidist=800;              //tiempo que tarda en recorrer 10 cm en línea recta
 int uniang=3200;              //tiempo que tarda en dar una vuelta completa
 int dist=0;                   //variable que guarda la longitud del lado
 int ang=0;                    //variable que guarda el ángulo de giro
 void setup(){
   pinMode(motori,OUTPUT);
   pinMode(motord,OUTPUT);
   dist=5*unidist;             //el lado mide 50 cm.
   ang=uniang/4;               //el ángulo es de 90 grados
 }
 void avanza(){                //procedimiento para avanzar
   digitalWrite(motori,LOW);   // porque la posición del relé sin señal es la de giro para avnzar
   digitalWrite(motord,LOW);
 }
 void retrocede(){             //procedimiento para retroceder
   digitalWrite(motori,HIGH);          
   digitalWrite(motori,HIGH);
 }  
 void giraderecha(){           //procedimeinto para girar a la derecha
   digitalWrite(motord,HIGH);
   digitalWrite(motori,LOW);
 }
 void giraizquierda(){         //procedimiento para girar a la izquierda
   digitalWrite(motord,LOW);
   digitalWrite(motori,HIGH);
 }
 void loop(){
   avanza();
   delay(dist);                //tiempo que corresponde a 50 cm
   giraderecha();
   delay(ang);                 //tiempo que corresponde a 90 grados
 }

  • Motor dc y circuito con driver integrado 293D:

 int activai=8;                    //salida digital que activa/para el motor izquierdo
 int activad=13;                   //salida digital que activa/para el motor derecho
 int motord1=9;                    //salidas digitales que controlan el sentido de giro 
 int motord2=10;                   //del motor derecho
 int motori1=11;                   //salidas digitales que controlan el sentido de giro 
 int motori2=12;                   //del motor izquierdo
 int puls=2;
 int unidist=1200;                 //tiempo que tarda en recorrer 10 cm en línea recta
 int uniang=5200;                  //tiempo que tarda en dar una vuelta completa
 int dist=0;                       //variable que guarda la longitud del lado
 int ang=0;                        //variable que guarda el ángulo de giro
 void para(){                      //procedimiento que para ambos motores
   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){  //mientras no se presione el pulsador estará parado  
     para();
   } 
   dist=5*unidist;                 //el lado mide 50 cm.
   ang=uniang/4;                   //el ángulo es de 90 grados
 }
 void avanza(){                    //procedimiento para avanzar
   digitalWrite(motori1,HIGH);
   digitalWrite(motori2,LOW);
   digitalWrite(motord1,HIGH);
   digitalWrite(motord2,LOW);
 } 
 void retrocede(){                 //procedimiento para retroceder
   digitalWrite(motori1,LOW);
   digitalWrite(motori2,HIGH);
   digitalWrite(motord1,LOW);
   digitalWrite(motord2,HIGH);
 }   
 void giraderecha(){               //procedimeinto para girar a la derecha
   digitalWrite(motori1,HIGH);
   digitalWrite(motori2,LOW);
   digitalWrite(motord1,LOW);
   digitalWrite(motord2,HIGH);
 }
 void giraizquierda(){             //procedimiento para girar a la izquierda
   digitalWrite(motord1,HIGH);
   digitalWrite(motord2,LOW);
   digitalWrite(motori1,LOW);
   digitalWrite(motori2,HIGH);
 }

 void loop(){
   digitalWrite(activai,HIGH);
   digitalWrite(activad,HIGH);
   avanza();
   delay(dist);                    //tiempo que corresponde a 50 cm
   giraderecha();
   delay(ang);                     //tiempo que corresponde a 90 grados
 }

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

 int vel2=5;         
 int vel =5;       
 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 unidist=900;                 //tiempo que tarda en recorrer 10 cm en línea recta
 int uniang=4000;                 //tiempo que tarda en dar una vuelta completa
 int dist=0;                      //variable que guarda la longitud del lado
 int ang=0;                       //variable que guarda el ángulo de giro
 void para(){                     //procedimiento que para ambos motores
   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){ //mientras no se presione el pulsador estará parado
     para();                                
   }
   dist=5*unidist;                //el lado mide 50 cm.
   ang=uniang/4;                  //el ángulo es de 90 grados 
 }
 void avanza(){                   //procedimiento para avanzar
   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(){                //procedimiento para retroceder
   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(){            //procedimiento para girar a la izquierda
   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(){              //procedimeinto para girar a la derecha
   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 loop(){
   avanza();
   delay(dist);                   //tiempo que corresponde a 50 cm
   giraderecha();
   delay(ang);                    //tiempo que corresponde a 90 grados
 }

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?.