Stap 4: elektronica
Wanneer een dart passeert de lichte barrière voor het blokkeren van de IR-LED de huidige daalt direct tot nul. Op dit moment begint de micro controller tellen de microseconden totdat de tweede LED is geblokkeerd. Zoals we de afstand tussen de LED's weten kunnen we de snelheid dart berekenen.
De waarde wordt verzonden naar een LED driver chip (stabilisatie-en associatieovereenkomst 1064) weer te geven op het display van de zeven segment gelegen aan de zijkant van het vat.
Ik gebruikte een Arduino UNO te uploaden met de volgende code naar de Atmega:
#include "Wire.h" / / I2C control #include "Bounce.h" byte diaplayAddr = 0x70 >> 1; Adres van de I2C controle 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, decimale komma = +128 //light barrière int LSFrontPin = A0; lichte barrière op de voorkant van het vat int LSBackPin = a1 worden verkregen; lichte barrière aan de achterkant van het vat int TriggerPin = 11; zweven meanVal = 0; zweven meanCount = 0; Datenverarbeitung int LSFrontVal = 0; int LSBackVal = 0; int BaseLineFront = 0; int BaseLineBack = 0; drempel, te erkennen van een dart int TriggerFront = 0; int TriggerBack = 0; het meten van de snelheid int measuringBack = 0; zweven lengte = 0.173; m int loopTime = 100; tijd van het meetpunt in micro seconden unsigned long measureLoops = 0; unsigned long heartBeat = 0; zweven TempBaseLineFront = 0; zweven TempBaseLineBack = 0; Voorproefje stuiteren = Bounce (TriggerPin, 10); void setup {Serial.begin(9600); Wire.begin(); opstarten I2C bus delay(500); createDisplay(); pinMode (LSFrontPin, INPUT); pinMode (LSBackPin, INPUT); pinMode (TriggerPin, INPUT); delay(1000); Maak een basis regel voor (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); Blijkt dat de initialisatie wordt gedaan: blink driemaal uit met de basislijn waarden 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; meten van start en wacht op de pijlen} ongeldig createDisplay() {Wire.beginTransmission(diaplayAddr); Wire.write(B00000000); entgegen / / Subadressing: B00000001 = cijfer 1, Subadressing: B00000010 = cijfer 2, Subadressing: B00000011 = cijfer 3, Subadressing: B00000100 = cijfer 4 Wire.write(B00110111); controle van byte (dynamische modus op, 9 mA) Wire.endTransmission(); Wire.beginTransmission(diaplayAddr); Wire.write(1); instructie byte - eerste cijfer naar besturingselement is 1 (rechterkant) Wire.write(digitBytes[0]); cijfer 1 (RHS) Wire.write(digitBytes[1]); cijfer 2 Wire.write(digitBytes[2]); cijfer 3 Wire.endTransmission(); Wire.beginTransmission(diaplayAddr); Wire.write(1); instructie byte - eerste cijfer naar besturingselement is 1 (rechterkant) Wire.write(digitBytes[9]); cijfer 1 (RHS) Wire.write (digitBytes [0] + 128); cijfer 2 + Dezimal punt Wire.write(digitBytes[1]); cijfer 3 Wire.endTransmission(); } void writeNumber (int-nummer, int waitTime) {/ / creat nummer en laat het voor waitTime ms int digit1 = nummer/100; int digit2 = (aantal - (digit1 * 100)) / 10; int digit3 = aantal - 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); instructie byte - eerste cijfer naar besturingselement is 1 (rechterkant) Wire.write(digitBytes[digit3]); cijfer 1 (RHS) Wire.write (digitBytes [digit2] + 128); cijfer 2 + decimaalteken Wire.write(digitBytes[digit1]); cijfer 3 Wire.endTransmission(); delay(waitTime); Wire.beginTransmission(diaplayAddr); Wire.write(1); instructie byte - eerste cijfer naar besturingselement is 1 (rechterkant) Wire.write(0); cijfer 1 (RHS) Wire.write(0); cijfer 2 + decimaalteken Wire.write(0); cijfer 3 Wire.endTransmission(); } heartBeatBeat() {//lets het decimaalteken knipperen Wire.beginTransmission(diaplayAddr); void Wire.write(1); instructie byte - eerste cijfer naar besturingselement is 1 (rechterkant) Wire.write(0); cijfer 1 (RHS) Wire.write(128); cijfer 2 + decimaalteken Wire.write(0); cijfer 3 Wire.endTransmission(); delay(100); Wire.beginTransmission(diaplayAddr); Wire.write(1); instructie byte - eerste cijfer naar besturingselement is 1 (rechterkant) Wire.write(0); cijfer 1 (RHS) Wire.write(0); cijfer 2 + decimaalteken Wire.write(0); cijfer 3 Wire.endTransmission(); } void loop {//Hearbeat interval als (millis() > (hartslag + 5000)) {heartBeat = millis(); heartBeatBeat();} //read de drukknop Taster.update(), int TasterStatus = Taster.read(); niet-ondertekende lange duur = Taster.duration(); als ((TasterStatus == HIGH) & & (duur < 2000)) {writeNumber((int)(meanVal*10/meanCount), 1000);} anders als (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!"); } Als (measuringBack == 1) {//Pfeil wurde noch nicht detektiert LSBackVal = analogRead(LSBackPin); if (LSBackVal < TriggerBack) {measuringBack = 0; measureLoops = micros(); Serial.Print ("Trigger Start:"); Serial.println(TriggerBack); Serial.println(LSBackVal); }} anders {//dart werd ontdekt, maar is niet aangekomen aan de voorkant LSFrontVal = analogRead(LSFrontPin); als (LSFrontVal < TriggerFront) {unsigned long stopTime=micros(); float deltaTus = (float)(stopTime-measureLoops); deltaTus = deltaTus / 1.0e6; float mSpeed = lengte / 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 na 1 s als ((measuringBack == 0) & & (micros() > (measureLoops + 1000000))) {measuringBack = 1;}}