Toro Mecánico
Proyecto creado por el grupo 20 de la asignatura Diseño de Sistemas Empotrados compuesto por Manuel Alejandro Jiménez Fernández y Mario García Barrero.
Idea
Nuestra idea se basó en un robot que pudiera ayudar a las empresas a mover objetos de lado a lado sin necesidad de personal. Por eso pensamos en hacer un toro mecánico autónomo, este cogería todo tipo de pales u objetos para moverlos sin necesidad de que nadie tenga que controlarlo.
Materiales utilizados
Material | Precio | Prestado |
Pack ruedas y motores | 16.99 € | No |
Placa Arduino UNO | – | Sí |
Cables | – | Mixto |
Base | – | De un integrante |
Ultrasonidos | 7.99 € | No |
Infrarrojos | 5.29 € | No |
Puentes H | 6.99 € | No |
Tablón | 2.50 € | No |
Cinta adhesiva negra | 2.99 € | No |
TOTAL | 42.55 € |
Hardware
Los componentes utilizados para hacer este proyecto han sido los siguientes:
- 3 Motores dc
- 1 Sensor de ultrasonidos
- 2 Sensores de infrarrojos
- 1 Placa Arduino UNO
- 1 Placa protoboard
- Muchos cables
- 1 Portapilas de 4 pilas AA
- 2 Puentes en H
Esquema de conexiones:
Problemas encontrados
Primero: Motores sin controladores
-SOLUCIÓN: Comprar puentes H
Segundo: No poder controlar la velocidad de los motores
-SOLUCIÓN: No hemos encontrado solución, se supone que a través de unos pines del puente H (ENA, ENB) se debería poder controlar pero no hemos sido capaces de solucionarlo
Tercero: Los infrarrojos no funcionaban correctamente, no detectaban el cambio de color de blanco a negro
SOLUCIÓN: Usar otro que teníamos por casa
Cuarto: Problemas de espacio, la base que hemos usado es muy justa y nos ha costado bastante meter todo
-SOLUCIÓN: Tener cuidado con los cables
Quinto: Problemas para pegar la pala
-SOLUCIÓN: Loctite (pero teníamos que estar muy seguros de que no iba a ser modificada)
Sexto: Separación del infrarrojo
-SOLUCIÓN: Líneas mas pequeñas pero mas difícil aún de controlar
Séptimo: Problema con el circuito debido a no poder controlar la velocidad de los motores
-SOLUCIÓN: Hacer un circuito con curva agudas
Mejoras futuras
Mejoras del diseño:
+ Creación y diseño de componentes con impresora 3D
+ Más espacio para una mejor organización
+ Huecos específicos para los componentes
Mejoras del Hardware:
+ Mejores motores y controladores para poder controlar la velocidad y que tengan mas potencia
+ Cables a medida
Mejoras del software:
+ Mapeo de la zona para que no sea necesario el uso de líneas(conlleva añadir más sensores)
Video del funcionamiento
Video explicativo parte Hardware
Video explicación Software/Código
Software/Código
El funcionamiento del código es simple aunque difícil de implementar debido al poco rango de fallo.
¿Como funciona? A traves de los infrarrojos que se encuentran detras de la pala detectamos si lo que tienen debajo(en el suelo) es negro o, por el contrario, blanco. Si ambos infrarrojos detectan blanco el toro avanza hacia delante, si el izquiero detecta negro y el derecho blanco gira a la izquiera porque el toro se esta desviando a la derecha y, al contrario si el infrarrojo derecho detecta negro y el izquierdo blanco. Si ambos infrarrojos detectan negro comprueban que haya un objeto delante a menos de 10 cm, si lo hay acciona la pala para que lo levante y continua recto, para dejarlo tiene que volver a detectar doble negro en los infrarrojos durante mas de 100 ms por si ha habido un false doble negro, cuando es correcto el doble negro baja la pala y suelta el objeto.
/* GRUPO 20: MARIO GARCIA BARRERO
MANUELA ALEJANDRO JIMENEZ FERNANDEZ*/
// CONEXIONES DE LOS SENSORES DEL ULTRASONIDO
const int PinTrig = 13;
const int PinEcho = 12;
const int mpA= 10; // CONEXION MOTOR PALA A
const int mpB= 11; // CONEXION MOTOR PALA B
const int m1IA= 6; // CONEXION MOTOR IZQUIERDO A
const int m1IB= 7; // CONEXION MOTOR IZQUIERDO B
const int m1DA= 4; // CONEXION MOTOR PALA DERECHO A
const int m1DB= 5; // CONEXION MOTOR PALA DERECHO B
const int i1 = 3; // CONEXION INFRARROJO 1
const int i2 = 2; // CONEXION INFRARROJO 2
// CONSTANTE DE LA VELOCIDAD DEL SONIDO
const float VelSon = 34000.0;
float distancia;
int vd; // AQUÍ SE GUARDA EL VALOR DEL INFRARROJO DERECHO
int vi; // AQUÍ SE GUARDA EL VALOR DEL INFRARROJO IZQUIERDO
bool cogido = false; // VARIABLE QUE SE ACTIVA CUANDO SE COGE EL OBJETO
void setup()
{
Serial.begin(9600);
// INICIALIZAMOS LOS MOTORES COMO SALIDA
pinMode(m1IA, OUTPUT);
pinMode(m1IB, OUTPUT);
pinMode(m1DA, OUTPUT);
pinMode(m1DB, OUTPUT);
pinMode(ENA, OUTPUT);
pinMode(mpA, OUTPUT);
pinMode(mpB, OUTPUT);
// INICIALIZAMOS LOS INFRARROJOS COMO ENTRADA
pinMode(i1, INPUT);
pinMode(i2, INPUT);
// INICIALIZAMOS EL ULTRASONIDO
pinMode(PinTrig, OUTPUT);
pinMode(PinEcho, INPUT);
}
void loop()
{
vi = digitalRead(i1); // LEER INFRARROJO IZQUIERDO
vd = digitalRead(i2); // LEER INFRARROJO DERECHO
// DETECTA AMBOS BLANCOS
while(vd == 1 && vi == 1 ){
palante();
vi = digitalRead(i1);
vd = digitalRead(i2);
}
// DETECTA DOBLE NEGRO
while(vd == 0 && vi == 0 ){
int us = medir();
parado();
// SI NO HA COGIDO AUN EL OBJETO, LO COGE
if(us < 10 && cogido == false){
parado();
delay(1500);
pala();
palaparada();
cogido = true;
palante();
delay(500);
}else{
palante();
}
// SI HA COGIDO EL OBJETO Y NO HA SIDO UN FALSO DOBLE NEGRO, LO SUELTA
if(cogido == true){
delay(100);
vi = digitalRead(i1);
vd = digitalRead(i2);
if(vd == 0 && vi == 0){
parado();
delay(1500);
palain();
palaparada();
delay(10000);
}
}
vi = digitalRead(i1);
vd = digitalRead(i2);
}
// SENSOR IZQUIERDO EN NEGRO
while(vd == 1 && vi == 0 ){
iz();
vi = digitalRead(i1);
vd = digitalRead(i2);
}
// SENSOR DERECHO EN NEGRO
while(vd == 0 && vi == 1 ){
der();
vi = digitalRead(i1);
vd = digitalRead(i2);
}
}
// METODO PARA MEDIR LA DISTANCIA DEL ULTRASONIDO
float medir()
{
// Ponemos el Triiger en estado bajo y esperamos 2 ms
digitalWrite(PinTrig, LOW);
delayMicroseconds(2);
// Ponemos el pin Trigger a estado alto y esperamos 10 ms
digitalWrite(PinTrig, HIGH);
delayMicroseconds(10);
// Comenzamos poniendo el pin Trigger en estado bajo
digitalWrite(PinTrig, LOW);
unsigned long tiempo = pulseIn(PinEcho, HIGH);
distancia = tiempo * 0.000001 * VelSon / 2.0;
return distancia;
}
// METODO PARA AVANZAR
void palante(){
digitalWrite(m1DA, HIGH);
digitalWrite(m1DB, LOW);
digitalWrite(m1IA, HIGH);
digitalWrite(m1IB, LOW);
}
// METODO PARA GIRAR A LA IZQUIERDA
void iz(){
digitalWrite(m1DA, HIGH);
digitalWrite(m1DB, LOW);
digitalWrite(m1IA, LOW);
digitalWrite(m1IB, LOW);
}
// METODO PARA GIRAR A LA DERECHA
void der(){
digitalWrite(m1DA, LOW);
digitalWrite(m1DB, LOW);
digitalWrite(m1IA, HIGH);
digitalWrite(m1IB, LOW);
}
// METODO PARA IR HACIA ATRAS
void atras(){
digitalWrite(m1DA, LOW);
digitalWrite(m1DB, HIGH);
digitalWrite(m1IA, LOW);
digitalWrite(m1IB, HIGH);
}
// METODO PARA PARARSE
void parado(){
digitalWrite(m1DA, LOW);
digitalWrite(m1DB, LOW);
digitalWrite(m1IA, LOW);
digitalWrite(m1IB, LOW);
}
// METODO PARA QUE LA PALA SUBA
void pala(){
digitalWrite(mpB, HIGH);
digitalWrite(mpA, LOW);
delay (165);
return;
}
// METODO PARA QUE LA PALA BAJE
void palain(){
digitalWrite(mpB, LOW);
digitalWrite(mpA, HIGH);
delay (90);
return;
}
// METODO PARA PARAR LA PALA
void palaparada(){
digitalWrite(mpB, LOW);
digitalWrite(mpA, LOW);
}