Vagones de metro
Introducción y funcionamiento
1. Materiales y costes del proyecto
Cantidad |
Precio unitario |
Total |
|
Arduino UNO |
1 + 1 cedido |
10,00€ |
10,00€ |
LCD 16×2 |
1 |
3,91€ |
3,91€ |
LEDs color (R,G,W) |
8 |
Cedido |
— |
LEDs IR |
2 |
0,16€ |
0,32€ |
Receptores IR |
4 |
0,26€ |
1,04€ |
LDRs |
3 |
Cedido |
— |
Resistencias |
~20 |
Cedido |
— |
Diodo IN4007 |
2 |
0,08€ |
0,16€ |
Transistor 2N2222A |
2 |
0,74€ |
1,49€ |
Servomotor |
1 |
Cedido |
— |
Chasis + Motores |
1 |
15,24€ |
15,24€ |
Interruptor |
1 |
0,65€ |
0,65€ |
Protoboards varias |
7 |
— |
7,42€ |
Pack cables Macho-Hembra |
40 |
2,56€ |
2,56€ |
Pack cables Macho-Macho |
40 |
2,56€ |
2,56€ |
Tabla de Contrachapado 3mm |
1 |
5,00€ |
5,00€ |
TOTAL |
50,35€ |
Esquema del módulo de detección del vehículo |
Esquema eléctrico del módulo del vehículo |
Módulo Parada: #include <IRremote.h> #include <LiquidCrystal.h> #define PIN_DETECT_IN 7# define PIN_STATUS_IN 10# define PIN_DETECT_OUT 8# define PIN_STATUS_OUT 9 LiquidCrystal lcd(12, 11, 5, 4, 3, 2); IRsend irsend; void setup() { delay(1000); lcd.begin(16, 2); lcd.print(“METRINO”); lcd.setCursor(0, 1); lcd.print(“Sistema iniciado”); pinMode(PIN_DETECT_IN, INPUT); pinMode(PIN_STATUS_IN, OUTPUT); pinMode(PIN_DETECT_OUT, INPUT); pinMode(PIN_STATUS_OUT, OUTPUT); irsend.enableIROut(38); irsend.mark(0); } void loop() { if (!digitalRead(PIN_DETECT_IN)) { digitalWrite(PIN_STATUS_IN, HIGH); lcd.clear(); lcd.print(“TREN ENTRANDO”); delay(3000); lcd.setCursor(0, 0); lcd.print(“TREN EN ESTACION”); lcd.setCursor(0, 1); lcd.print(“Estacion 1”); digitalWrite(PIN_STATUS_IN, LOW); delay(2000); } if (!digitalRead(PIN_DETECT_OUT)) { digitalWrite(PIN_STATUS_OUT, HIGH); lcd.clear(); lcd.print(“TREN FUERA EST.”); delay(3000); lcd.setCursor(0, 1); lcd.print(“Proximo: 01 min.”); //Estimación digitalWrite(PIN_STATUS_OUT, LOW); delay(2000); } } Módulo Vehículo: #include <Servo.h> #define pinMotorLeft 1 # define pinMotorRight 2 # define pinLEDverde 3 # define pinLEDrojo 11 # define pinServo 13 //analogicos int pinLDRizdo = 0; int pinLDRdcho = 1; int pinParada = 2; //variables int valorLDRL = 0; int valorLDRR = 0; int parada = 0; Servo servoMotor; void setup() { pinMode(pinMotorLeft, OUTPUT); pinMode(pinMotorRight, OUTPUT); pinMode(pinLEDrojo, OUTPUT); //LED PUERTA pinMode(pinLEDverde, OUTPUT); //LED PUERTA servoMotor.attach(pinServo); } void loop() { servoMotor.write(15); //cierro puerta valorLDRL = analogRead(pinLDRizdo); //guardo lectura de LDR en valorLDRR = analogRead(pinLDRdcho); //guardo lectura de LDR en parada = analogRead(pinParada); //guardo lectura de ldr parada if (parada > 20) { //si el funcionamiento es normal //coloco los led en modo circulación digitalWrite(pinLEDrojo, HIGH); digitalWrite(pinLEDverde, LOW); if ((valorLDRL > 3) && (valorLDRR <= 3)) { digitalWrite(pinMotorRight, LOW); digitalWrite(pinMotorLeft, HIGH); } else if ((valorLDRR > 3) && (valorLDRL <= 3)) { digitalWrite(pinMotorLeft, LOW); digitalWrite(pinMotorRight, HIGH); } else if ((valorLDRR > 3) && (valorLDRL > 3)) { digitalWrite(pinMotorLeft, LOW); digitalWrite(pinMotorRight, LOW); } else { digitalWrite(pinMotorRight, HIGH); digitalWrite(pinMotorLeft, HIGH); } } else { digitalWrite(pinMotorRight, LOW); digitalWrite(pinMotorLeft, LOW); servoMotor.write(80); //abro puerta digitalWrite(pinLEDrojo, LOW); digitalWrite(pinLEDverde, HIGH); delay(5000); servoMotor.write(15); //cierro puerta digitalWrite(pinLEDrojo, HIGH); digitalWrite(pinLEDverde, LOW); digitalWrite(pinMotorRight, HIGH); digitalWrite(pinMotorLeft, HIGH); delay(500); } }
4. Evolución del proyecto, problemas y resolución
Chasis con motores del vehículo |
Chasis con contrachapado y par |
La caja que porta el sistema de detección de paradas cuenta con un interruptor que finalmente no fue implementado, ya que no funcionaba como es debido por no inicializar el LCD cuando se presiona.
5. Posibles/futuras mejoras
El proyecto es ampliamente mejorable en bastantes aspectos debido a su modularidad. Una de las primeras mejoras que se podrían realizar sería la implantación de múltiples paradas y el desarrollo de un algoritmo que permita calcular el tiempo que hay entre ellas basado en experiencias previas y con sensibilidad a desviaciones, ya que ahora mismo se imprime un texto que no representa el tiempo real.
Asimismo se podría mejorar la forma en la que se siguen las líneas para que tomase curvas con mayor precisión y no se saliese de la vía, probablemente mediante la implantación de sensores IR en lugar de LDRs y LEDs, tal y como se hace con los módulos de parada, así como regular el peso del vehículo para evitar derrapes mediante el incremento del peso del vehículo o la colocación de resistencias para regular la intensidad de corriente que les llega a los motores. Otras posibles mejoras podrían incluir un sistema de ventilación con un sensor de temperatura cuando se alcance cierto valor preestablecido. De mayor utilidad sería implementar un sensor mediante IR que evitase colisiones con objetos en la vía y que hiciese detenerse al vehículo en el caso de detectarlo.
6. Conclusión
Hemos conseguido realizar un proyecto con Arduino, lo que nos ha servido para organizar un sistema propio de electrónica y programación.
Durante el desarrollo nos hemos encontrado con múltiples problemas que hemos ido solucionando, teniendo que idear alternativas para sobrepasarlos con éxito. Esto nos ha hecho darnos cuenta de que de la teoría a la práctica hay bastantes variables que no siempre se tienen en cuenta y que alteran el resultado final de forma inesperada; no obstante hemos conseguido solucionar la mayoría.
Ha sido un proyecto entretenido pero laborioso, y hemos podido descubrir todo el potencial que tienen las placas computadoras para el desarrollo de hardware/software.
7. Recursos
Vídeo: https://vimeo.com/214749497
Presentación: PDF con las diapositivas