CIRCUITO DE CARRERAS CON ARDUINO
Proyecto realizado por el Grupo 10.
Compuesto por Daniel Cáceres González, Manuel Roman Dydak, Juan Pablo Bernal Gutiérrez.
Introducción
El objetivo de esta práctica es la implementación de un sensor de
velocidad en un circuito de carreras simulando un uso real.
Se han dividido las distintas tareas del proyecto, separándolas en:
montaje del circuito, diseño del circuito y elaboración del código fuente.
Todos los participantes del grupo han colaborado en todas las tareas del
proyecto.
Componentes
MATERIALES | UNIDADES | PRECIO |
SENSORES PiR | 2 | 7.5€ |
BUZZER | 1 | – |
BOTÓN | 1 | – |
LEDS | 5 | – |
PROTOBOARDS | 2 | 4€ |
PLACA ARDUINO | 1 | – |
CABLES | – | – |
RESISTENCIAS | 6 | – |
TOTAL | 11.5€ |
Implementación y diseño del circuito
Led 1: Puerto Digital 8
Led 2: Puerto Digital 7
Led 3: Puerto Digital 6
Led 4: Puerto Digital 5
Led 5: Puerto Digital 4
Buzzer: Puerto Digital 10
Pulsador: Puerto Digital 11
Sensor PiR1: Puerto Digital 1
Sensor PiR2: Puerto Digital 2
Funcionamiento
El funcionamiento del proyecto corresponde a una ejecución secuencial
de varios procesos.
Un primer proceso es el encargado de detectar cuando es pulsado el
interruptor. Cuando este sea activado empezará una secuencia de
activación de los leds acompañado del sonido de un buzzer (simulando
la salida de un circuito de Fórmula 1).
Un segundo proceso, el encargado de activar los PiR y de ponerlos a
recibir información.
Un último tercer proceso será el encargado de hacer los cálculos
pertinentes a medida que se vayan activando los sensores y de sacar
por pantalla los resultados. Además de finalizar la ejecución del
programa.
Problemas/soluciones
El principal problema con el que nos hemos encontrado, ha tenido que
ver con los sensores PiR, los cuales tienen dos reguladores: uno de
distancia y uno de frecuencia de comprobación.
El problema que nos ha surgido ha sido tratando de regular la distancia
de activación, pues tenía un alcance de 3 a 7 m. Por lo que capta
cualquier movimiento que se encontrase en dicho rango, lo que
provocaba que los resultados no fuesen los esperados.
Para solucionar este problema, hemos decidido meterlos en una cabina,
de tal manera que únicamente capten el movimiento cuando algo pasa
por delante de los mismos para el correcto funcionamiento del circuito.
Código
const int pinOn = 10; const int pinBuzzer = 11; int isOn = LOW; int sensorPir1 = 12; int sensorPir2 = 13; void setup() { pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(sensorPir1, INPUT); pinMode(sensorPir2, INPUT); pinMode(pinOn, INPUT); pinMode(pinBuzzer, OUTPUT); Serial.begin(9600); } void loop() { int numeroVueltas = 5; isOn = digitalRead(pinOn); if (isOn == HIGH) { //SEMÁFORO CARRERA analogWrite(3, 255); tone(pinBuzzer, 783.99); delay(100); noTone(pinBuzzer); delay(1300); analogWrite(4, 255); //5 tone(pinBuzzer, 783.99); delay(100); noTone(pinBuzzer); delay(1300); analogWrite(6, 255); //3 tone(pinBuzzer, 783.99 ); delay(100); noTone(pinBuzzer); delay(1300); analogWrite(5, 255); //6 tone(pinBuzzer, 783.99); delay(100); 6 noTone(pinBuzzer); delay(1300); analogWrite(7, 255); //7 tone(pinBuzzer, 880); delay(650); noTone(pinBuzzer); analogWrite(3, 0); analogWrite(4, 0); analogWrite(5, 0); analogWrite(6, 0); analogWrite(7, 0); delay(0500); // COMIENZO CARRERA long comienzo = millis(); Serial.println("COMIENZO DE LA CARRERA"); delay(2000); int i = 0; long anterior = 0; int vueltas[10]; int vueltaRapida = 0; int numeroVueltaRapida = 0; long tiempoVuelta[numeroVueltas]; long vuelta; while (i < numeroVueltas) { boolean esVueltaMasRapida = false; if (digitalRead(sensorPir1) == HIGH) { long vuelta = millis(); vueltas[i] = vuelta; long tiempo; if (i >= 1) { tiempo = vuelta - anterior; tiempoVuelta[i] = tiempo; anterior = vuelta; if (tiempo < vueltaRapida) { esVueltaMasRapida = true; vueltaRapida = tiempo; numeroVueltaRapida = i; } } else { tiempo = vuelta - comienzo; tiempoVuelta[i] = tiempo; anterior = vuelta; 7 vueltaRapida = tiempo; numeroVueltaRapida = 1; } i++; Serial.print("Vuelta número = "); Serial.println(i-1 ); Serial.print("Tiempo de vuelta = "); Serial.println(tiempo); if (esVueltaMasRapida == true) { Serial.println("VUELTA RÁPIDA"); esVueltaMasRapida = false; } while (digitalRead(sensorPir2) != HIGH) { //Para que se quede esperando a hacer los cálculos de velocidad media. } long finVuelta = millis(); float tiempoMs = finVuelta - vuelta; float tiempoS = tiempoMs / 1000; float media = 17 / tiempoS; Serial.print("Velocidad coche en cm/s = "); Serial.println(media, 5); delay(3100); } } Serial.print("Tiempo de la vuelta más rápìda = "); Serial.println(vueltaRapida); Serial.print("Número de la vuelta más rápìda = "); Serial.println(numeroVueltaRapida); long fin = millis(); Serial.print("Tiempo Carrera = "); Serial.println(fin - comienzo); delay(3000); } }