Paso 4: electrónica
Cuando un dardo pasa la barrera de luz IR-LED de bloqueo de la corriente cae instantáneamente a cero. En este momento el microcontrolador empieza a contar los microsegundos hasta que se bloquea el segundo LED. Como sabemos la distancia entre los LEDs podemos calcular la velocidad del dardo.
El valor es enviar a un chip de controlador de LED (SAA 1064) para mostrarlo en el display de siete segmentos ubicado a un costado del cañón.
Usé un Arduino UNO para cargar el código siguiente en el Atmega:
#include "Wire.h" / / I2C control #include "Bounce.h" byte diaplayAddr = 0x70 >> 1; Dirección del I2C control int digitBytes [16] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113}; 0 1 2 3 4 5 6 7 8 9, punto decimal = +128 //light barrera int LSFrontPin = A0; barrera de luz en la parte delantera de la barril int LSBackPin = A1; barrera de luz en la parte posterior del barril int TriggerPin = 11; Float meanVal = 0; Float meanCount = 0; Datenverarbeitung int LSFrontVal = 0; int LSBackVal = 0; int BaseLineFront = 0; int BaseLineBack = 0; umbral, a reconocer un dardo int TriggerFront = 0; int TriggerBack = 0; medición de la velocidad int measuringBack = 0; Float longitud = 0.173; m int loopTime = 100; tiempo del punto que mide en micro segundos measureLoops larga sin signo = 0; sin firmar largo latido = 0; Float TempBaseLineFront = 0; Float TempBaseLineBack = 0; Catador de rebote = rebote (TriggerPin, 10); void setup() {Serial.begin(9600); Wire.Begin(); puesta en marcha delay(500) de bus I2C; createDisplay(); pinMode (LSFrontPin, entrada); pinMode (LSBackPin, entrada); pinMode (TriggerPin, entrada); Delay(1000); crear una línea base para (int ii = 0; ii < 100; ii ++) {TempBaseLineFront = TempBaseLineFront + analogRead(LSFrontPin); TempBaseLineBack = TempBaseLineBack + analogRead(LSBackPin); Delay(10); } BaseLineFront = (int)(TempBaseLineFront / 100); TriggerFront = (int)(0.8*BaseLineFront); BaseLineBack = (int)(TempBaseLineBack / 100); TriggerBack = (int)(0.8*BaseLineBack); Mostrar que la inicialización se hace: abrir y cerrar tres veces con la línea de base valores writeNumber (TriggerFront, 500); Delay(200); writeNumber (TriggerBack, 500); Delay(200); writeNumber (888, 500); Delay(200); writeNumber (888, 500); Delay(200); writeNumber (888, 500); Delay(200); measuringBack = 1; medición de inicio y esperar a que los dardos} void createDisplay() {Wire.beginTransmission(diaplayAddr); Wire.Write(B00000000); entgegen / / Subadressing: B00000001 = dígito 1, Subadressing: B00000010 = 2 dígitos, Subadressing: B00000011 = dígito 3, Subadressing: B00000100 = Wire.write(B00110111) de 4 dígitos; byte de control (modo dinámico de 9 mA) Wire.endTransmission(); Wire.beginTransmission(diaplayAddr); Wire.Write(1); byte de la instrucción - primer dígito de control es 1 (lado derecho) Wire.write(digitBytes[0]); dígito 1 (lado derecho) Wire.write(digitBytes[1]); dígito 2 Wire.write(digitBytes[2]); dígitos 3 Wire.endTransmission(); Wire.beginTransmission(diaplayAddr); Wire.Write(1); byte de la instrucción - primer dígito de control es 1 (lado derecho) Wire.write(digitBytes[9]); dígito 1 (lado derecho) Wire.write (digitBytes [0] + 128); dígitos 2 + Dezimal Wire.write(digitBytes[1]) punto; dígitos 3 Wire.endTransmission(); } void writeNumber (int cantidad, int waitTime) {/ / creat número y mostrar de waitTime ms int digit1 = número/100; int digit2 = (número de - (digit1 * 100)) / 10; int digit3 = número - digit1 * 100 - digit2 * 10; Serial.println(Number); Serial.Print ("digit1:"); Serial.println(digit1); Serial.Print ("digit2:"); Serial.println(digit2); Serial.Print ("digit3:"); Serial.println(digit3); Wire.beginTransmission(diaplayAddr); Wire.Write(1); byte de la instrucción - primer dígito de control es 1 (lado derecho) Wire.write(digitBytes[digit3]); dígito 1 (lado derecho) Wire.write (digitBytes [digit2] + 128); dígitos 2 + punto decimal Wire.write(digitBytes[digit1]); dígitos 3 Wire.endTransmission(); Delay(waitTime); Wire.beginTransmission(diaplayAddr); Wire.Write(1); byte de la instrucción - primer dígito de control es 1 (lado derecho) Wire.write(0); dígito 1 (lado derecho) Wire.write(0); dígitos 2 + punto decimal Wire.write(0); dígitos 3 Wire.endTransmission(); } void heartBeatBeat() {//lets el punto decimal parpadea Wire.beginTransmission(diaplayAddr); Wire.Write(1); byte de la instrucción - primer dígito de control es 1 (lado derecho) Wire.write(0); dígito 1 (lado derecho) Wire.write(128); dígitos 2 + punto decimal Wire.write(0); dígitos 3 Wire.endTransmission(); Delay(100); Wire.beginTransmission(diaplayAddr); Wire.Write(1); byte de la instrucción - primer dígito de control es 1 (lado derecho) Wire.write(0); dígito 1 (lado derecho) Wire.write(0); dígitos 2 + punto decimal Wire.write(0); dígitos 3 Wire.endTransmission(); } void loop() {intervalo //Hearbeat si (millis() > (heartBeat + 5000)) {latido = millis(); heartBeatBeat();} //read el botón Taster.update(); int TasterStatus = Taster.read(); unsigned larga duración = Taster.duration(); si ((TasterStatus == HIGH) & & (duración < 2000)) {writeNumber((int)(meanVal*10/meanCount), 1000);} else if (TasterStatus == HIGH) {Serial.println("reset") writeNumber (0, 500); delay(200); writeNumber (0, 500); delay(200); writeNumber (0, 500); delay(200); meanVal = 0; meanCount = 0; delay(500);} / / delayMicroseconds(loopTime); //if (digitalRead(TriggerPin) == HIGH) {Serial.println ("Trigger!"); } Si (measuringBack == 1) {//Pfeil wurde noch nicht detektiert LSBackVal = analogRead(LSBackPin); if (LSBackVal < TriggerBack) {measuringBack = 0; measureLoops = micros(); Serial.Print ("iniciar activación:"); Serial.println(TriggerBack); Serial.println(LSBackVal); }} más {//dart fue detectado, pero no llegan a la parte delantera LSFrontVal = analogRead(LSFrontPin); if (LSFrontVal < TriggerFront) {stopTime=micros() largo sin firmar; float deltaTus = (float)(stopTime-measureLoops); deltaTus = deltaTus / 1.0e6; float mSpeed = longitud / deltaTus; measuringBack = 1; Serial.println(measureLoops); Serial.println(stopTime); Serial.println(deltaTus); Serial.println(mSpeed); meanCount = meanCount + 1; meanVal = meanVal + mSpeed; Serial.println(meanVal); Serial.println(meanCount); writeNumber((int)(mSpeed*10), 500); Delay(200); //#Reset {}} después de 1 s si ((measuringBack == 0) & & (micros() > (measureLoops + 1000000))) {measuringBack = 1;}}