Ejercicio 27: Cuadrado
El robot recorre un cuadrado.
| Novedades hardware | Novedades 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:
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
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?.