Meten van de snelheid van Nerf darts (4 / 4 stap)

Stap 4: elektronica


De dart-snelheid wordt gemeten met behulp van twee lichtschermen die zich bevinden aan de voorkant en het einde van het vat. De lichtschermen bestaan uit een infrarode LED (Osram LD 274-3) en een foto transistor (Q3 en Q4) (SFH 3100 F) elk. De LED's zijn het bestralen van de foto-transistors in het vat (zie foto) en een stroom tussen de 5V VCC en grond respectievelijk toestaan. Dit leidt tot een meetbare signaal in A1- en A0. De foto transistor bevatten ook een daglicht-filter waardoor het omgevingslicht uit te bemoeien met de metingen.

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;}}

Gerelateerde Artikelen

Hoe veel Nerf Darts zijn bestaan?

Hoe veel Nerf Darts zijn bestaan?

"Hoeveel Nerf darts hebben ooit gemaakt? Ever?"Het gaat een paar mensen - zelfs de meest fervente van Nerf liefhebbers - steeds aan het vragen denken. Temidden van de chaos van ons dagelijks leven, de drukte voor te bereiden voor onze volgende s
Hoe maak je een echt leuk uitziende nerf dart blaaspijp voor minder dan $10

Hoe maak je een echt leuk uitziende nerf dart blaaspijp voor minder dan $10

Ik had een dilemma dat dit Kerstmis voorbij. 6 neven en absoluut geen flauw idee wat kinderen op die leeftijd zijn in. Huckleberry Hound? Sigmund het zeemonster? De Beatles???Oke... Ik ben niet echt dat de verbinding verbroken. ;-)Mijn 15-jarige stie
Omvormen van uw verbruikte Nerf darts, niet meer kopen, herstellen van de oude.

Omvormen van uw verbruikte Nerf darts, niet meer kopen, herstellen van de oude.

Nerf darts kun je zo leuk, vooral de nieuwe Elite ones, maar elke vorm van dart zal beginnen te verpletteren en buig na intens gebruik. Darten geleidelijk meer dun geworden. Dunne Darten voer te zacht op kamers zodat ze goed op de kamers niet verzege
Arduino Nano en Visuino: meten van Motor snelheid (RPM) met Optocoupler en Encoder schijf

Arduino Nano en Visuino: meten van Motor snelheid (RPM) met Optocoupler en Encoder schijf

Bij het bouwen van een robot-auto, is het belangrijk om te controleren de snelheid van de rotatie van de wielen. Voordat we kunnen de controle van de snelheid echter, moeten we om te kunnen meten. Een van de eenvoudigste en meest populaire manieren o
Hoe te meten van de snelheid van het licht... Met behulp van chocolade!

Hoe te meten van de snelheid van het licht... Met behulp van chocolade!

In dit Instructable, de eerste in een reeks met behulp van het boek hoe verstart uw Hamster en andere verbazingwekkende experimenten voor de fauteuil wetenschapper als inspiratie, gebruiken we een balk in met chocolade voor het meten van de snelheid
Nerf Dart Tag van CS-6

Nerf Dart Tag van CS-6

hoe maak je een gestroomlijnde dart (een CS-6 dart) voor dart Tikkertje uit een normale dart tag dart!Stap 1: Intro en benodigdheden ik zou allereerst excuses voor de slechte beelden.OK, ik heb geen bereik mijn Darten getest maar ik heb zorgde ervoor
Meten van de snelheid van geluid met Arduino microcontroller en ultrasone sensor

Meten van de snelheid van geluid met Arduino microcontroller en ultrasone sensor

Mijn 6-jarige dochter, Samatha, laat zien hoe het meten van de snelheid van geluid in lucht met Arduino Uno microcontroller en ultrasone sensor.Ik denk dat dit een goed project voor kinderen te krijgen blootgesteld aan wetenschap, techniek en wiskund
Meten van bacteriële groei door kwantitatieve Chloroplast schatting

Meten van bacteriële groei door kwantitatieve Chloroplast schatting

IntroductieDeze set van instructies wordt uitgelegd hoe het meten van het aantal chloroplasten in een bepaalde hoeveelheid van de oplossing. De metingen kunnen worden geëxtrapoleerd om te bepalen van het bedrag van de groei van bacteriën. Bacteriele
Meten van de stroomsnelheid door warmte advectie

Meten van de stroomsnelheid door warmte advectie

Meten van de stroomsnelheid door warmte advectieVoor de cursus 'Meten aan water' (TU Delft), we hebben een apparaat voor het meten van de stroomsnelheid door advectie van warm water. In dit artikel beschrijven we hoe we het apparaat gemaakt en hoe de
Hoe te meten van de massa van de aarde met behulp van arduino.

Hoe te meten van de massa van de aarde met behulp van arduino.

Een mooie dag, was ik mijn zelf wegen op een weegschaal. Plotseling een gedachte kwam naar mijn mening, 'hoeveel zou de massa van de aarde?'. Laat dat apart 'Hoe kunnen we zelfs meten het?'. Er is geen dergelijke wegen schaal waarop, aarde kan worden
Meten van de rotatiesnelheid met telefoon en LED

Meten van de rotatiesnelheid met telefoon en LED

Het is leuk om te controleren hoe snel verschillende dingen--fans, boormachines en dergelijke--draaien. En het is gemakkelijk om te doen met de volgende ingrediënten die velen van ons thuis zal hebben:telefoon (ik ben met behulp van Android, maar ik
Meten van de sleep coëfficiënt van uw auto

Meten van de sleep coëfficiënt van uw auto

het doel van dit experiment is het bepalen van uw voertuig sleep coëfficiënt Cd en coëfficiënt voor rolweerstand CTR. Dit wordt gedaan door het meten van de snelheid van uw voertuig als een functie van de tijd terwijl kustvaarders in neutraal.Waarom
Het meten van hoeken en afstanden voor outdoor survival.

Het meten van hoeken en afstanden voor outdoor survival.

Er zijn tijden die u moet maken van hoek metingen maar kunnen noch moeten elk instrument, tewerkstellen, zoals bij het wandelen, tijdens het rijden: een motor-fiets, of wanneer op een touring-bus. In dergelijke gevallen het meten van hoeken met blote
Meten van de hoogte met behulp van de trigonometrie (meten Tape Hack)

Meten van de hoogte met behulp van de trigonometrie (meten Tape Hack)

Meten van de hoogte met behulp van een meetlint zou heel stressvol. Wanneer u probeert om te meten iets te hoog, zal de meetband beginnen om te buigen naar achteren. Onlangs zag ik sommige werknemers problemen optreden tijdens het meten van de hoogte