Étape 4: Electronics
Quand un dard passe le barrage photoélectrique bloquant l’IR-LED, le courant diminue instantanément à zéro. En ce moment le microcontrôleur commence à compter les microsecondes jusqu'à ce que le deuxième LED est bloqué. Comme nous le savons la distance entre les LED, nous pouvons calculer la vitesse de la dart.
La valeur est envoyée à une puce de conducteur de LED (SAA 1064) pour l’afficher sur l’afficheur 7 segments situé sur le côté du canon.
J’ai utilisé un Arduino UNO pour télécharger le code suivant à l’Atmega :
#include « Wire.h » / / I2C commande #include « Bounce.h » byte diaplayAddr = 0 x 70 >> 1 ; Adresse de l’I2C contrôle 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, point décimal = +128 //light barrière int LSFrontPin = A0 ; barrière lumineuse à l’avant du canon int LSBackPin = A1 ; barrière lumineuse à l’arrière du canon int TriggerPin = 11 ; float meanVal = 0 ; float meanCount = 0 ; Datenverarbeitung int LSFrontVal = 0 ; int LSBackVal = 0 ; int BaseLineFront = 0 ; int BaseLineBack = 0 ; seuil, de reconnaître un dart int TriggerFront = 0 ; int TriggerBack = 0 ; mesurer la vitesse int measuringBack = 0 ; flotteur de longueur = 0,173 ; loopTime int m = 100 ; du point de mesure en micro secondes unsigned long measureLoops = 0 ; unsigned long battement de coeur = 0 ; float TempBaseLineFront = 0 ; float TempBaseLineBack = 0 ; Bounce Taster = Bounce (TriggerPin, 10) ; void setup() {Serial.begin(9600) ; Wire.Begin() ; démarrage I2C bus delay(500) ; createDisplay() ; pinMode (entrée, LSFrontPin) ; pinMode (entrée, LSBackPin) ; pinMode (entrée, TriggerPin) ; Delay(1000) ; créer une ligne de base pour (ii int = 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) ; Montrent que l’initialisation est effectuée : clignote trois fois avec le writeNumber de valeurs de ligne de base (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 ; début de mesure et d’attendre les jeux de fléchettes} void createDisplay() {Wire.beginTransmission(diaplayAddr) ; Wire.Write(B00000000) ; entgegen / / Subadressing : B00000001 = chiffre 1, Subadressing : B00000010 = chiffre 2, Subadressing : B00000011 = chiffre 3, Subadressing : B00000100 = chiffre 4 Wire.write(B00110111) ; octet de contrôle (modus dynamique sur, 9 mA) Wire.endTransmission() ; Wire.beginTransmission(diaplayAddr) ; Wire.Write(1) ; instruction byte - premier chiffre de contrôle est 1 (côté droit) Wire.write(digitBytes[0]) ; Numéro 1 (ERS) Wire.write(digitBytes[1]) ; chiffre 2 Wire.write(digitBytes[2]) ; chiffre 3 Wire.endTransmission() ; Wire.beginTransmission(diaplayAddr) ; Wire.Write(1) ; instruction byte - premier chiffre de contrôle est 1 (côté droit) Wire.write(digitBytes[9]) ; Numéro 1 (ERS) Wire.write (digitBytes [0] + 128) ; chiffre 2 + Dezimal point de Wire.write(digitBytes[1]) ; chiffre 3 Wire.endTransmission() ; } void writeNumber (int number, int waitTime) {/ / creat numéro et montrez-le pour waitTime ms int digit1 = nombre/100 ; int digit2 = (numéro - (digit1 * 100)) / 10 ; int digit3 = nombre - 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) ; instruction byte - premier chiffre de contrôle est 1 (côté droit) Wire.write(digitBytes[digit3]) ; Numéro 1 (ERS) Wire.write (digitBytes [digit2] + 128) ; chiffre 2 + virgule Wire.write(digitBytes[digit1]) ; chiffre 3 Wire.endTransmission() ; Delay(waitTime) ; Wire.beginTransmission(diaplayAddr) ; Wire.Write(1) ; instruction byte - premier chiffre de contrôle est 1 (côté droit) Wire.write(0) ; Numéro 1 (ERS) Wire.write(0) ; chiffre 2 + virgule Wire.write(0) ; chiffre 3 Wire.endTransmission() ; } void heartBeatBeat() {//lets un point décimal clin Wire.beginTransmission(diaplayAddr) ; Wire.Write(1) ; instruction byte - premier chiffre de contrôle est 1 (côté droit) Wire.write(0) ; Numéro 1 (ERS) Wire.write(128) ; chiffre 2 + virgule Wire.write(0) ; chiffre 3 Wire.endTransmission() ; Delay(100) ; Wire.beginTransmission(diaplayAddr) ; Wire.Write(1) ; instruction byte - premier chiffre de contrôle est 1 (côté droit) Wire.write(0) ; Numéro 1 (ERS) Wire.write(0) ; chiffre 2 + virgule Wire.write(0) ; chiffre 3 Wire.endTransmission() ; } void loop() {//Hearbeat intervalle si (millis() > (rythme cardiaque + 5000)) {pulsation = millis() ; heartBeatBeat();} //read la touche Taster.update() ; int TasterStatus = Taster.read() ; unsigned longue durée = Taster.duration() ; if ((TasterStatus == HIGH) & & (durée < 2000)) {writeNumber((int)(meanVal*10/meanCount), 1000);} ElseIf (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 ("Start Trigger:") ; Serial.println(TriggerBack) ; Serial.println(LSBackVal) ; }} else {//dart a été détecté, mais ne sont pas arrivés à l’avant, LSFrontVal = analogRead(LSFrontPin) ; if (LSFrontVal < TriggerFront) {unsigned long stopTime=micros() ; float deltaTus = (float)(stopTime-measureLoops) ; deltaTus = deltaTus / 1.0e6 ; float mSpeed = longueur / 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 après 1 s si ((measuringBack == 0) & & (micros() > (measureLoops + 1000000))) {measuringBack = 1;}}