Contacte

Cronograf pentru arme DIY. Cronograf ieftin pentru pneumatică. Cum funcționează un cronograf făcut singur

În prima mea publicație, vreau să vă spun cum am asamblat un cronograf în câteva seri din piese ieftine și accesibile. După cum probabil ați ghicit deja din nume, acest dispozitiv este folosit pentru a măsura viteza unui glonț în puști cu aer (și nu așa) și este util pentru monitorizarea stării sale tehnice.

1. Piese și accesorii

  • Digispark chinezesc - 80 de ruble la momentul achiziției
  • Afișare segment pe TM1637 - 90 de ruble în momentul achiziției
  • LED-uri IR și fototranzistoare IR (10 perechi) - 110 ruble în momentul achiziției, avem nevoie de 2 perechi
  • Rezistoare 220 Ohm (100 buc) - 70 ruble la momentul achiziției, avem nevoie doar de 2 bucăți
Acest lucru termină piesele care trebuie cumpărate. Rezistoarele pot fi omise, cu valoare similară (dar nu mai puțin!) Pot fi scoase din electronicele de larg consum inutile. Astfel, costurile totale sunt mai mici de 350 de ruble, ceea ce nu este nimic în comparație cu prețul unui nou cronograf de fabrică (peste 1000 de ruble pentru cel mai simplu, care de fapt este și mai primitiv decât subiectul nostru). Pe lângă detalii, vom avea nevoie de:
  • Fire - găsirea offline gratuit nu este o problemă
  • bucată de plastic teava de apa peste 10 cm lungime (diametru după gust) - la fel de ușor de găsit
  • Accesorii de lipit
  • Multimetru (optional)
Primele 3 detalii merită luate în considerare separat, deoarece au propriile lor caracteristici, așa că să începem cu mini-recenzii asupra lor.

1.1. Digispark

Este o placă simplă în miniatură compatibilă cu Arduino, cu un ATtiny85 la bord. Am citit cum să vă conectați la Arduino IDE pe site-ul oficial al proiectului, unde puteți găsi și drivere pentru acesta. Există două tipuri principale de această placă: cu microUSB și mai brutală cu un conector USB, cablat chiar pe placă.

Cronograful meu nu are propria sursă de alimentare, așa că am ales prima opțiune de placă. O baterie/acumulator încorporat va crește foarte mult prețul, în timp ce nu adaugă aproape nimic la utilizare. Aproape toată lumea are un power bank și un cablu pentru încărcarea telefonului.

Caracteristici desigur, moștenit de la ATtiny85, capabilitățile sale în cazul nostru sunt suficiente cu capul. De fapt, MK din cronograf nu face altceva decât să interogheze cei doi senzori și să controleze afișajul. Pentru cei care dau peste Digispark pentru prima dată, am rezumat cele mai importante caracteristici într-un tabel:

Folosesc această placă ca o foaie de cheat atunci când dezvolt diverse dispozitive bazate pe această placă. După cum probabil ați observat, numerotarea pinului pentru funcția analogRead() este diferită, acest lucru ar trebui să fie luat în considerare. Și încă o caracteristică: un rezistor pull-up de 1,5 kOhm atârnă pe al treilea pin, pentru că. este folosit in USB.

1.2. Afișaj bazat pe TM1637

Următorul detaliu important este un afișaj digital pe care vor fi afișate informații. Orice display poate fi folosit, alegerea mea se datorează doar ieftinității și ușurinței de a lucra cu el. În principiu, puteți refuza complet afișarea și puteți transmite date prin cablu către un computer, apoi dispozitivul va deveni și mai ieftin. Pentru a funcționa, aveți nevoie de biblioteca DigitalTube. Subiectul la care am făcut legătura la începutul postării este o clonă a afișajului Grove. Vedere din față:

Distanța dintre cifre este aceeași, așa că atunci când două puncte sunt oprite, valorile numerice sunt citite normal. Împreună cu biblioteca standard, este furnizat un exemplu care funcționează cu Digispark fără a dansa cu o tamburină:

Tot ce poate face biblioteca standard este să imprime numerele 0-9 și literele a-f, precum și modificarea luminozității întregului afișaj. Valoarea unei cifre este dată de funcția de afișare (int 0-3, int 0-15).

Curs expres despre utilizarea afișajului

// 1. Declarați fișierul antet #include // 2. Definiți pinii #define CLK 0 #define DIO 1 // 3. Declarați un obiect TM1637 tm1637(CLK, DIO); // 4. Inițializați void setup() ( tm1637.init(); tm1637.set(6); // Luminozitate ) // 5. Folosiți void loop() ( // Afișați numărul x pe afișaj int x = 1234 ; tm1637 .display(0, x / 1000); tm1637.display(1, x / 100% 10); tm1637.display(2, x / 10% 10); tm1637.display(3, x % 10); întârziere (500)); )


Dacă încercați să afișați un caracter cu un cod în afara granițelor, atunci afișajul arată o prostie, care nu este static, așa că nu veți putea să trișați pentru a afișa caractere speciale (grade, minus) fără tamburin:

Acest lucru nu mi s-a potrivit, deoarece în cronograful meu am vrut să prevăd nu numai viteza, ci și energia glonțului (calculată pe baza masei pre-scrise în schiță), aceste două valori ​\u200b\u200bar trebui să fie afișate secvenţial. Pentru a înțelege ce arată afișajul la un moment dat, trebuie să separați cumva aceste două valori vizual, de exemplu, folosind simbolul „J”. Desigur, puteți folosi în mod prost simbolul două puncte ca indicator de steag, dar acest lucru nu este adevărat și nu este kosher) Prin urmare, am intrat în bibliotecă și, pe baza funcției de afișare, am făcut funcția setSegments(byte addr, byte data) , care se aprinde în figură cu numărul de segmente de adresă codificate în date:

Void setSegments(adresă octet, date octet) ( tm1637.start(); tm1637.writeByte(ADDR_FIXED); tm1637.stop(); tm1637.start(); tm1637.writeByte(addr|0xc0); tm1637.data) ; tm1637.stop(); tm1637.start(); tm1637.writeByte(tm1637.Cmd_DispCtrl); tm1637.stop(); )
Segmentele sunt codificate extrem de simplu: bitul cel mai puțin semnificativ de date este responsabil pentru segmentul superior și așa mai departe. în sensul acelor de ceasornic, al șaptelea bit este responsabil pentru segmentul central. De exemplu, caracterul „1” este codificat ca 0b00000110. Al optulea, cel mai semnificativ bit este folosit doar în a doua cifră și este responsabil pentru două puncte, în toate celelalte cifre este ignorat. Pentru a-mi ușura viața, așa cum ar trebui orice specialist IT leneș, am automatizat procesul de obținere a codurilor de caractere folosind excel:

Acum puteți face cu ușurință acest lucru:

Să spunem SALUT

#include #define CLK 0 #define DIO 1 TM1637 tm1637(CLK, DIO); void setSegments(adresă octet, date octet) ( tm1637.start(); tm1637.writeByte(ADDR_FIXED); tm1637.stop(); tm1637.start(); tm1637.writeByte(addr|0xc0); tm1637.data) ; tm1637.stop(); tm1637.start(); tm1637.writeByte(tm1637.Cmd_DispCtrl); tm1637.stop(); ) void setup() (tm1637.init()); tm1637.set loop(6); () ( // Ieșire Bună setSegments(0, 118); setSegments(1, 121); setSegments(2, 54); setSegments(3, 63); delay(500); )

1.3. Senzori

Aici, din păcate, nu pot spune nimic special, pentru că pe pagina produsului nu există niciun cuvânt despre caracteristicile sau măcar marcajele prin care s-ar putea dezgropa fișa tehnică. Un nume tipic. Se cunoaște doar lungimea de undă de 940 nm.

La prețul unui LED, am stabilit că un curent de peste 40mA este fatal pentru ei, iar tensiunea de alimentare ar trebui să fie sub 3,3V. Fototranzistorul este ușor transparent și reacționează la lumină

2. Pregătirea pieselor și asamblarea

Circuitul este foarte simplu și necomplicat, dintre toți pinii digispark-a, avem nevoie doar de P0, P1 - pentru a lucra cu afișajul, precum și P2 - pentru a lucra cu senzori:

După cum puteți vedea, un rezistor limitează curentul pe LED-uri, al doilea trage P2 la masă. Fototranzistoarele sunt conectate în serie, astfel încât trecerea unui glonț în fața oricărui optocupler are ca rezultat o scădere a tensiunii pe P2. Înregistrând două supratensiuni consecutive și măsurând timpul dintre ele, putem determina viteza glonțului (cunoscând distanța dintre senzori, evident). Folosirea unui singur știft de măsurare are un alt plus - nu există nicio direcție necesară a glonțului, puteți trage de la ambele capete. Vom colecta din această mână de piese:

Am mers pe calea miniaturizării și am decis să fac un sandviș folosind o bucată de placă:

Întregul sandwich a fost umplut cu lipici fierbinte pentru rezistență:

Rămâne doar să plasați senzorii în tub și să lipiți firele:

Fotografia arată că am plasat un electrolit suplimentar la 100mKf în paralel cu LED-urile, astfel încât atunci când sunt alimentate de la power bank să nu existe ondulație a diodelor IR.

Pinul P2 a fost ales ca intrare dintr-un motiv. Permiteți-mi să vă reamintesc că P3 și P4 sunt folosite în USB, așa că utilizarea P2 face posibilă flash-ul dispozitivului deja asamblat. În al doilea rând, P2 este o intrare analogică, deci nu puteți folosi întreruperi, ci pur și simplu măsurați diferența de ciclu dintre valoarea anterioară și cea actuală de pe acesta, dacă diferența este peste un anumit prag, atunci glonțul trece între unul dintre optocuple. . Dar există un truc software, fără de care schema de mai sus nu va decola, vom vorbi despre asta mai târziu.

3. Firmware

3.1. Câteva cuvinte despre prescaler

Prescaler este un divizor de frecvență, implicit în plăcile de tip arduino este 128. Frecvența maximă de interogare ADC depinde de valoarea acestei valori, implicit pentru un controler de 16 MHz rezultă 16/128 = 125 kHz. Fiecare digitizare necesită 13 operații, astfel încât frecvența maximă de interogare a pinii este de 9600 kHz (teoretic, în practică, chiar nu depășește 7 kHz). Acestea. intervalul dintre măsurători este de aproximativ 120 μs, ceea ce este foarte, foarte mult. Un glonț care zboară cu o viteză de 300 m / s va zbura 3,6 cm în acest timp - controlerul pur și simplu nu are timp să detecteze faptul că glonțul trece prin optocupler. Pentru o funcționare normală, aveți nevoie de un interval între măsurători de cel puțin 20 µs, valoarea divizorului necesară pentru aceasta este 16. Am mers și mai departe și am folosit un divizor de 8 în dispozitivul meu, acest lucru se face după cum urmează:

#ifndef cbi #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #endif #ifndef sbi #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) # endif void setup() ( sbi(ADCSRA,ADPS2); cbi(ADCSRA,ADPS1); cbi(ADCSRA,ADPS0); ... )
Măsurători reale ale intervalului de citire analogic pe divizoare diferite:

3.2. Schița finală

Nu voi descrie codul în detaliu, este deja bine documentat. În schimb, sunt înăuntru in termeni generali Voi descrie algoritmul muncii sale. Deci, întreaga logică se reduce la următorii pași:
  • Primul ciclu - se măsoară diferența dintre valoarea curentă și cea anterioară de pe pin
  • Dacă diferența este mai mare decât pragul specificat, atunci ieșiți din buclă și amintiți-vă ora curentă (micros())
  • Al doilea ciclu - similar celui precedent + contor de timp din ciclu
  • Dacă contorul a atins valoarea specificată, atunci informați despre eroare și mergeți la început. Acest lucru permite ciclului să nu intre în eternitate dacă glonțul din anumite motive nu a fost observat de al doilea senzor.
  • Dacă contorul nu a depășit și diferența de valori este mai mare decât pragul, atunci măsurăm timpul curent (micros())
  • Pe baza diferenței de timp și distanță dintre senzori, calculăm viteza și o afișăm pe ecran
  • Du-te pentru a începe
Acesta este un model foarte simplificat, în codul în sine am adăugat un fluier, inclusiv calculul și afișarea energiei glonțului pe baza masei glonțului introdusă în prealabil în cod.

De fapt, întregul cod

/* * Cronograf Bullet Speed, SinuX 23.03.2016 */ #include #define CLK 1 // Pin de afișare #define DIO 0 // Pin de afișare #define START_PIN 1 // Pin de pornire analogic #define END_PIN 1 // Pin de terminare analogic #define START_LEV 50 // Prag de pornire #define END_LEV 50 // Prag de terminare declanșare #define TIMEOUT 10000 // Timp de așteptare pentru terminare în microsecunde #define BULLET_WEIGHT 0.00051 // Greutatea glonțului în kilograme (pentru calculul energiei) #define ENCODER_DIST 0.1 // Distanța dintre senzori în metri (10cm = 0.1m) #definiți SHOW_0_DELAY / Afișează timpul // Pentru a accelera analogRead #ifndef cbi #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #endif #ifndef sbi #define sbi(sfr, bit) (_SFR_BYTE(sfr) ) |= _BV(bit)) #endif // Variabile de serviciu int prevVal, curVal; nesemnat lung startTime, endTime; TM1637 tm1637(CLK, DIO); /* Funcția TM1637::display() reproiectată, care vă permite să iluminați segmente individuale * Numerotarea segmentelor: bit scăzut - segment înalt etc. în sensul acelor de ceasornic * Segmentul central este bitul cel mai semnificativ */ void setSegments(adresă octet, date octet) ( tm1637.start(); tm1637.writeByte(ADDR_FIXED); tm1637.stop(); tm1637.start(); tm1637.writeByte( addr |0xc0); tm1637.writeByte(date); tm1637.stop(); tm1637.start(); tm1637.writeByte(tm1637.Cmd_DispCtrl); tm1637.stop(); ) // Inițializare setup() ( // setup void prescaler la 8 pentru a accelera analogRead cbi(ADCSRA,ADPS2); sbi(ADCSRA,ADPS1); sbi(ADCSRA,ADPS0); // Afișează inițializarea tm1637.init(); tm1637.set(6); // Afișează set de salutări (0, 118); setSegments(1, 121); setSegments(2, 54); setSegments(3, 63); delay(1000); ) // Bucla principală void loop() ( // Se așteaptă ecranul de deschidere showReady() ; // Așteptați pornirea curVal = analogRead(START_PIN); do (prevVal = curVal; curVal = analogRead(START_PIN); ) while (curVal - prevVal< START_LEV); startTime = micros(); // Ожидание финиша curVal = analogRead(END_PIN); do { prevVal = curVal; curVal = analogRead(END_PIN); // Если превышен интервал ожидания - показ ошибки и выход из цикла if (micros() - startTime >= TIMEOUT) ( showError(); return; ) ) while (curVal - prevVal< END_LEV); endTime = micros(); // Вычисление и отображение результата showResult(); } // Отображение заставки ожидания выстрела void showReady() { setSegments(0, 73); setSegments(1, 73); setSegments(2, 73); setSegments(3, 73); delay(100); } // Вычисление и отображение скорости, энергии пули void showResult() { // Вычисление скорости пули в м/с и вывод на дисплей float bulletSpeed = ENCODER_DIST * 1000000 / (endTime - startTime); tm1637.display(0, (int)bulletSpeed / 100 % 10); tm1637.display(1, (int)bulletSpeed / 10 % 10); tm1637.display(2, (int)bulletSpeed % 10); setSegments(3, 84); delay(SHOW_DELAY); // Вычисление энергии в джоулях и вывод на дисплей float bulletEnergy = BULLET_WEIGHT * bulletSpeed * bulletSpeed / 2; tm1637.point(1); // Вместо точки ":" - костыль, но пойдет) tm1637.display(0, (int)bulletEnergy / 10 % 10); tm1637.display(1, (int)bulletEnergy % 10); tm1637.display(2, (int)(bulletEnergy * 10) % 10); setSegments(3, 30); delay(SHOW_DELAY); tm1637.point(0); } // Вывод ошибки при превышении времени ожидания пули void showError() { setSegments(0, 121); setSegments(1, 80); setSegments(2, 80); setSegments(3, 0); delay(SHOW_DELAY); }

4. Exemple de lucru

Când este conectat corect, dispozitivul a decolat aproape imediat, singurul dezavantaj găsit este că reacționează negativ la LED-uri și iluminarea fluorescentă (frecvența pulsului este de aproximativ 40 kHz), prin urmare pot apărea erori spontane. În total, dispozitivul are 3 moduri de funcționare:

Salut după pornire și trecere în modul de așteptare pentru o fotografie (ecranul este plin cu dungi):

În cazul unei erori, se afișează „Err” și se trece din nou în modul de așteptare:

Ei bine, măsurarea vitezei în sine:

După lovitură, mai întâi este afișată viteza glonțului (cu simbolul „n”), apoi - energia (simbolul „J”), iar energia este calculată cu o precizie de o zecimală (pe gif puteți vedea că când sunt afișați joulii, colonul este pornit). Nu am reușit să găsesc încă o carcasă mai frumoasă, așa că am umplut totul cu muci termic:

Poate asta e tot ce am, sper ca a fost de folos cuiva.

În prima mea publicație, vreau să vă spun cum am asamblat un cronograf în câteva seri din piese ieftine și accesibile. După cum probabil ați ghicit deja din nume, acest dispozitiv este folosit pentru a măsura viteza unui glonț în puști cu aer (și nu așa) și este util pentru monitorizarea stării sale tehnice.

1. Piese și accesorii

  • Digispark chinezesc - 80 de ruble la momentul achiziției
  • Afișare segment pe TM1637 - 90 de ruble în momentul achiziției
  • LED-uri IR și fototranzistoare IR (10 perechi) - 110 ruble în momentul achiziției, avem nevoie de 2 perechi
  • Rezistoare 220 Ohm (100 buc) - 70 ruble la momentul achiziției, avem nevoie doar de 2 bucăți
Acest lucru termină piesele care trebuie cumpărate. Rezistoarele pot fi omise, cu valoare similară (dar nu mai puțin!) Pot fi scoase din electronicele de larg consum inutile. Astfel, costurile totale sunt mai mici de 350 de ruble, ceea ce nu este nimic în comparație cu prețul unui nou cronograf de fabrică (peste 1000 de ruble pentru cel mai simplu, care de fapt este și mai primitiv decât subiectul nostru). Pe lângă detalii, vom avea nevoie de:
  • Fire - găsirea offline gratuit nu este o problemă
  • O bucata de teava de apa din plastic de peste 10 cm lungime (diametru dupa gust) – la fel de usor de gasit
  • Accesorii de lipit
  • Multimetru (optional)
Primele 3 detalii merită luate în considerare separat, deoarece au propriile lor caracteristici, așa că să începem cu mini-recenzii asupra lor.

1.1. Digispark

Este o placă simplă în miniatură compatibilă cu Arduino, cu un ATtiny85 la bord. Am citit cum să vă conectați la Arduino IDE pe site-ul oficial al proiectului, unde puteți găsi și drivere pentru acesta. Există două tipuri principale de această placă: cu microUSB și mai brutală cu un conector USB, cablat chiar pe placă.

Cronograful meu nu are propria sursă de alimentare, așa că am ales prima opțiune de placă. O baterie/acumulator încorporat va crește foarte mult prețul, în timp ce nu adaugă aproape nimic la utilizare. Aproape toată lumea are un power bank și un cablu pentru încărcarea telefonului.

Caracteristici desigur, moștenit de la ATtiny85, capabilitățile sale în cazul nostru sunt suficiente cu capul. De fapt, MK din cronograf nu face altceva decât să interogheze cei doi senzori și să controleze afișajul. Pentru cei care dau peste Digispark pentru prima dată, am rezumat cele mai importante caracteristici într-un tabel:

Folosesc această placă ca o foaie de cheat atunci când dezvolt diverse dispozitive bazate pe această placă. După cum probabil ați observat, numerotarea pinului pentru funcția analogRead() este diferită, acest lucru ar trebui să fie luat în considerare. Și încă o caracteristică: un rezistor pull-up de 1,5 kOhm atârnă pe al treilea pin, pentru că. este folosit in USB.

1.2. Afișaj bazat pe TM1637

Următorul detaliu important este un afișaj digital pe care vor fi afișate informații. Orice display poate fi folosit, alegerea mea se datorează doar ieftinității și ușurinței de a lucra cu el. În principiu, puteți refuza complet afișarea și puteți transmite date prin cablu către un computer, apoi dispozitivul va deveni și mai ieftin. Pentru a funcționa, aveți nevoie de biblioteca DigitalTube. Subiectul la care am făcut legătura la începutul postării este o clonă a afișajului Grove. Vedere din față:

Distanța dintre cifre este aceeași, așa că atunci când două puncte sunt oprite, valorile numerice sunt citite normal. Împreună cu biblioteca standard, este furnizat un exemplu care funcționează cu Digispark fără a dansa cu o tamburină:

Tot ceea ce poate face biblioteca standard este să imprime numerele 0-9 și literele a-f, precum și să modifice luminozitatea întregului afișaj. Valoarea unei cifre este dată de funcția de afișare (int 0-3, int 0-15).

Curs expres despre utilizarea afișajului

// 1. Declarați fișierul antet #include // 2. Definiți pinii #define CLK 0 #define DIO 1 // 3. Declarați un obiect TM1637 tm1637(CLK, DIO); // 4. Inițializați void setup() ( tm1637.init(); tm1637.set(6); // Luminozitate ) // 5. Folosiți void loop() ( // Afișați numărul x pe afișaj int x = 1234 ; tm1637 .display(0, x / 1000); tm1637.display(1, x / 100% 10); tm1637.display(2, x / 10% 10); tm1637.display(3, x % 10); întârziere (500)); )


Dacă încercați să afișați un caracter cu un cod în afara granițelor, atunci afișajul arată o prostie, care nu este static, așa că nu veți putea să trișați pentru a afișa caractere speciale (grade, minus) fără tamburin:

Acest lucru nu mi s-a potrivit, deoarece în cronograful meu am vrut să prevăd nu numai viteza, ci și energia glonțului (calculată pe baza masei pre-scrise în schiță), aceste două valori ​\u200b\u200bar trebui să fie afișate secvenţial. Pentru a înțelege ce arată afișajul la un moment dat, trebuie să separați cumva aceste două valori vizual, de exemplu, folosind simbolul „J”. Desigur, puteți folosi în mod prost simbolul două puncte ca indicator de steag, dar acest lucru nu este adevărat și nu este kosher) Prin urmare, am intrat în bibliotecă și, pe baza funcției de afișare, am făcut funcția setSegments(byte addr, byte data) , care se aprinde în figură cu numărul de segmente de adresă codificate în date:

Void setSegments(adresă octet, date octet) ( tm1637.start(); tm1637.writeByte(ADDR_FIXED); tm1637.stop(); tm1637.start(); tm1637.writeByte(addr|0xc0); tm1637.data) ; tm1637.stop(); tm1637.start(); tm1637.writeByte(tm1637.Cmd_DispCtrl); tm1637.stop(); )
Segmentele sunt codificate extrem de simplu: bitul cel mai puțin semnificativ de date este responsabil pentru segmentul superior și așa mai departe. în sensul acelor de ceasornic, al șaptelea bit este responsabil pentru segmentul central. De exemplu, caracterul „1” este codificat ca 0b00000110. Al optulea, cel mai semnificativ bit este folosit doar în a doua cifră și este responsabil pentru două puncte, în toate celelalte cifre este ignorat. Pentru a-mi ușura viața, așa cum ar trebui orice specialist IT leneș, am automatizat procesul de obținere a codurilor de caractere folosind excel:

Acum puteți face cu ușurință acest lucru:

Să spunem SALUT

#include #define CLK 0 #define DIO 1 TM1637 tm1637(CLK, DIO); void setSegments(adresă octet, date octet) ( tm1637.start(); tm1637.writeByte(ADDR_FIXED); tm1637.stop(); tm1637.start(); tm1637.writeByte(addr|0xc0); tm1637.data) ; tm1637.stop(); tm1637.start(); tm1637.writeByte(tm1637.Cmd_DispCtrl); tm1637.stop(); ) void setup() (tm1637.init()); tm1637.set loop(6); () ( // Ieșire Bună setSegments(0, 118); setSegments(1, 121); setSegments(2, 54); setSegments(3, 63); delay(500); )

1.3. Senzori

Aici, din păcate, nu pot spune nimic special, pentru că pe pagina produsului nu există niciun cuvânt despre caracteristicile sau măcar marcajele prin care s-ar putea dezgropa fișa tehnică. Un nume tipic. Se cunoaște doar lungimea de undă de 940 nm.

La prețul unui LED, am stabilit că un curent de peste 40mA este fatal pentru ei, iar tensiunea de alimentare ar trebui să fie sub 3,3V. Fototranzistorul este ușor transparent și reacționează la lumină

2. Pregătirea pieselor și asamblarea

Circuitul este foarte simplu și necomplicat, dintre toți pinii digispark-a, avem nevoie doar de P0, P1 - pentru a lucra cu afișajul, precum și P2 - pentru a lucra cu senzori:

După cum puteți vedea, un rezistor limitează curentul pe LED-uri, al doilea trage P2 la masă. Fototranzistoarele sunt conectate în serie, astfel încât trecerea unui glonț în fața oricărui optocupler are ca rezultat o scădere a tensiunii pe P2. Înregistrând două supratensiuni consecutive și măsurând timpul dintre ele, putem determina viteza glonțului (cunoscând distanța dintre senzori, evident). Folosirea unui singur știft de măsurare are un alt plus - nu există nicio direcție necesară a glonțului, puteți trage de la ambele capete. Vom colecta din această mână de piese:

Am mers pe calea miniaturizării și am decis să fac un sandviș folosind o bucată de placă:

Întregul sandwich a fost umplut cu lipici fierbinte pentru rezistență:

Rămâne doar să plasați senzorii în tub și să lipiți firele:

Fotografia arată că am plasat un electrolit suplimentar la 100mKf în paralel cu LED-urile, astfel încât atunci când sunt alimentate de la power bank să nu existe ondulație a diodelor IR.

Pinul P2 a fost ales ca intrare dintr-un motiv. Permiteți-mi să vă reamintesc că P3 și P4 sunt folosite în USB, așa că utilizarea P2 face posibilă flash-ul dispozitivului deja asamblat. În al doilea rând, P2 este o intrare analogică, deci nu puteți folosi întreruperi, ci pur și simplu măsurați diferența de ciclu dintre valoarea anterioară și cea actuală de pe acesta, dacă diferența este peste un anumit prag, atunci glonțul trece între unul dintre optocuple. . Dar există un truc software, fără de care schema de mai sus nu va decola, vom vorbi despre asta mai târziu.

3. Firmware

3.1. Câteva cuvinte despre prescaler

Prescaler este un divizor de frecvență, implicit în plăcile de tip arduino este 128. Frecvența maximă de interogare ADC depinde de valoarea acestei valori, implicit pentru un controler de 16 MHz rezultă 16/128 = 125 kHz. Fiecare digitizare necesită 13 operații, astfel încât frecvența maximă de interogare a pinii este de 9600 kHz (teoretic, în practică, chiar nu depășește 7 kHz). Acestea. intervalul dintre măsurători este de aproximativ 120 μs, ceea ce este foarte, foarte mult. Un glonț care zboară cu o viteză de 300 m / s va zbura 3,6 cm în acest timp - controlerul pur și simplu nu are timp să detecteze faptul că glonțul trece prin optocupler. Pentru o funcționare normală, aveți nevoie de un interval între măsurători de cel puțin 20 µs, valoarea divizorului necesară pentru aceasta este 16. Am mers și mai departe și am folosit un divizor de 8 în dispozitivul meu, acest lucru se face după cum urmează:

#ifndef cbi #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #endif #ifndef sbi #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) # endif void setup() ( sbi(ADCSRA,ADPS2); cbi(ADCSRA,ADPS1); cbi(ADCSRA,ADPS0); ... )
Măsurători reale ale intervalului de citire analogic pe divizoare diferite:

3.2. Schița finală

Nu voi descrie codul în detaliu, este deja bine documentat. În schimb, voi descrie în termeni generali algoritmul funcționării acestuia. Deci, întreaga logică se reduce la următorii pași:
  • Primul ciclu - se măsoară diferența dintre valoarea curentă și cea anterioară de pe pin
  • Dacă diferența este mai mare decât pragul specificat, atunci ieșiți din buclă și amintiți-vă ora curentă (micros())
  • Al doilea ciclu - similar celui precedent + contor de timp din ciclu
  • Dacă contorul a atins valoarea specificată, atunci informați despre eroare și mergeți la început. Acest lucru permite ciclului să nu intre în eternitate dacă glonțul din anumite motive nu a fost observat de al doilea senzor.
  • Dacă contorul nu a depășit și diferența de valori este mai mare decât pragul, atunci măsurăm timpul curent (micros())
  • Pe baza diferenței de timp și distanță dintre senzori, calculăm viteza și o afișăm pe ecran
  • Du-te pentru a începe
Acesta este un model foarte simplificat, în codul în sine am adăugat un fluier, inclusiv calculul și afișarea energiei glonțului pe baza masei glonțului introdusă în prealabil în cod.

De fapt, întregul cod

/* * Cronograf Bullet Speed, SinuX 23.03.2016 */ #include #define CLK 1 // Pin de afișare #define DIO 0 // Pin de afișare #define START_PIN 1 // Pin de pornire analogic #define END_PIN 1 // Pin de terminare analogic #define START_LEV 50 // Prag de pornire #define END_LEV 50 // Prag de terminare declanșare #define TIMEOUT 10000 // Timp de așteptare pentru terminare în microsecunde #define BULLET_WEIGHT 0.00051 // Greutatea glonțului în kilograme (pentru calculul energiei) #define ENCODER_DIST 0.1 // Distanța dintre senzori în metri (10cm = 0.1m) #definiți SHOW_0_DELAY / Afișează timpul // Pentru a accelera analogRead #ifndef cbi #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #endif #ifndef sbi #define sbi(sfr, bit) (_SFR_BYTE(sfr) ) |= _BV(bit)) #endif // Variabile de serviciu int prevVal, curVal; nesemnat lung startTime, endTime; TM1637 tm1637(CLK, DIO); /* Funcția TM1637::display() reproiectată, care vă permite să iluminați segmente individuale * Numerotarea segmentelor: bit scăzut - segment înalt etc. în sensul acelor de ceasornic * Segmentul central este bitul cel mai semnificativ */ void setSegments(adresă octet, date octet) ( tm1637.start(); tm1637.writeByte(ADDR_FIXED); tm1637.stop(); tm1637.start(); tm1637.writeByte( addr |0xc0); tm1637.writeByte(date); tm1637.stop(); tm1637.start(); tm1637.writeByte(tm1637.Cmd_DispCtrl); tm1637.stop(); ) // Inițializare setup() ( // setup void prescaler la 8 pentru a accelera analogRead cbi(ADCSRA,ADPS2); sbi(ADCSRA,ADPS1); sbi(ADCSRA,ADPS0); // Afișează inițializarea tm1637.init(); tm1637.set(6); // Afișează set de salutări (0, 118); setSegments(1, 121); setSegments(2, 54); setSegments(3, 63); delay(1000); ) // Bucla principală void loop() ( // Se așteaptă ecranul de deschidere showReady() ; // Așteptați pornirea curVal = analogRead(START_PIN); do (prevVal = curVal; curVal = analogRead(START_PIN); ) while (curVal - prevVal< START_LEV); startTime = micros(); // Ожидание финиша curVal = analogRead(END_PIN); do { prevVal = curVal; curVal = analogRead(END_PIN); // Если превышен интервал ожидания - показ ошибки и выход из цикла if (micros() - startTime >= TIMEOUT) ( showError(); return; ) ) while (curVal - prevVal< END_LEV); endTime = micros(); // Вычисление и отображение результата showResult(); } // Отображение заставки ожидания выстрела void showReady() { setSegments(0, 73); setSegments(1, 73); setSegments(2, 73); setSegments(3, 73); delay(100); } // Вычисление и отображение скорости, энергии пули void showResult() { // Вычисление скорости пули в м/с и вывод на дисплей float bulletSpeed = ENCODER_DIST * 1000000 / (endTime - startTime); tm1637.display(0, (int)bulletSpeed / 100 % 10); tm1637.display(1, (int)bulletSpeed / 10 % 10); tm1637.display(2, (int)bulletSpeed % 10); setSegments(3, 84); delay(SHOW_DELAY); // Вычисление энергии в джоулях и вывод на дисплей float bulletEnergy = BULLET_WEIGHT * bulletSpeed * bulletSpeed / 2; tm1637.point(1); // Вместо точки ":" - костыль, но пойдет) tm1637.display(0, (int)bulletEnergy / 10 % 10); tm1637.display(1, (int)bulletEnergy % 10); tm1637.display(2, (int)(bulletEnergy * 10) % 10); setSegments(3, 30); delay(SHOW_DELAY); tm1637.point(0); } // Вывод ошибки при превышении времени ожидания пули void showError() { setSegments(0, 121); setSegments(1, 80); setSegments(2, 80); setSegments(3, 0); delay(SHOW_DELAY); }

4. Exemple de lucru

Când este conectat corect, dispozitivul a decolat aproape imediat, singurul dezavantaj găsit este că reacționează negativ la LED-uri și iluminarea fluorescentă (frecvența pulsului este de aproximativ 40 kHz), prin urmare pot apărea erori spontane. În total, dispozitivul are 3 moduri de funcționare:

Salut după pornire și trecere în modul de așteptare pentru o fotografie (ecranul este plin cu dungi):

În cazul unei erori, se afișează „Err” și se trece din nou în modul de așteptare:

Ei bine, măsurarea vitezei în sine:

După lovitură, mai întâi este afișată viteza glonțului (cu simbolul „n”), apoi - energia (simbolul „J”), iar energia este calculată cu o precizie de o zecimală (pe gif puteți vedea că când sunt afișați joulii, colonul este pornit). Nu am reușit să găsesc încă o carcasă mai frumoasă, așa că am umplut totul cu muci termic:

Poate asta e tot ce am, sper ca a fost de folos cuiva.

Cronograful este un instrument versatil capabil să măsoare viteza obiectelor mici. Cel mai convenabil este să configurați și să testați pneumatica cu cronografe de tip cadru. Ele pot detecta mișcarea gloanțelor, a șuruburilor de arbaletă, a săgeților, a capselor de praștie. Puteți face un cronograf pentru pneumatică cu propriile mâini sau îl puteți achiziționa în magazine specializate.

Tipuri de cronograf

Măsurarea vitezei de pornire a unui glonț cu un cronograf vă permite să determinați puterea unui pistol sau a unei puști, să selectați gloanțele potrivite, să calculați corecțiile balistice și să comparați viteza la început și după actualizarea armei.

Există diferite tipuri de cronografe. Modelul gonflabil ocupa putin spatiu si incape usor in buzunarul carcasei si consuma si mai putina energie. Pentru un anumit tip de armă, este posibil să aveți nevoie adaptor. Acest tip nu depinde de iluminare și este convenabil de utilizat în natură. Fotografierea țintită poate fi efectuată împreună cu dispozitivul. Pentru CO2, acest model nu este potrivit.

Dacă aveți un arsenal impresionant, este mai bine să cumpărați cronograf cadru să nu cumpere un numar mare de adaptoare. Acest tip de dispozitiv funcționează bine cu CO2, are un conector pentru o sursă de alimentare externă. Armura vă permite să măsurați indicatoare la distanțe diferite fără teama de a deteriora mecanismul. Prezența unui ecran suplimentar ajută la obținerea rapidă a rezultatelor.

Există și modele de cadru mari care extind numărul de posibilități. Această opțiune este potrivită pentru utilizarea cu orice tip de armă, este convenabilă pentru o conexiune staționară la rețea. Alternativ, cronograful poate fi alimentat de opt baterii AA. Spre deosebire de modelul mic, mașina mare are indicator de tip frontal incorporat. Puteți instala opțional un ecran detașabil. Folosind adaptorul USB, puteți transfera datele de măsurare de pe dispozitiv pe un computer.

Cumpărarea unui cronograf pentru pneumatică

Puteți cumpăra diverse tipuri de cronografe la Moscova și Sankt Petersburg din următoarele magazine:

  • Airgun Store - la un preț de 3500 până la 24 mii de ruble;
  • Diada Arms - la un preț de 4 mii până la 13 mii de ruble;
  • Pnevmat 24 - la un preț de 4 mii până la 7 mii de ruble;
  • Oxotnika.net - la un preț de 3 mii până la 20 mii de ruble.

Aceste magazine oferă, de asemenea, o varietate de piese și accesorii pentru cronograf. Puteți achiziționa un model mai buget pe AliExpress la un preț de 3 mii de ruble. sau cumpărați unul folosit, de exemplu, pe portalul Guns.ru sau Avito la un preț de 1500 de ruble.

Cronograf tip cadru pentru pneumatică

Cronograful înregistrează timpul de zbor al glonțului între mai mulți senzori și calculează viteza acestuia. Dispozitivul este format din trei părți:

  • zona de lucru, trecând un glonț prin ea însăși;
  • un circuit care efectuează calcule;
  • afișaj care arată rezultatele calculate.

Schemele pentru un cronograf pot fi diferite ca cost, funcționalitate și design. Cei mai simpli senzori citesc lumina care cade asupra lor, a cărei intensitate se schimbă pe măsură ce glonțul care aruncă umbră se mișcă. Elementele sensibile la lumină fac parte din multe cronografe de casă și fabricate din fabrică.

Dispozitivul self-made are mai multe avantaje:

Odată cu aceasta, dispozitivul are propriile sale limitări:

  • design greoi;
  • nevoia de protecție la pătrundere pentru fața zonei de lucru;
  • influența condițiilor meteorologice și a luminii asupra muncii;
  • sensibilitatea schemei optice la impacturi mecanice semnificative, inclusiv fragmente de gloanțe și ricoșeuri;
  • ieșirea de citiri false atunci când apar în cameră obiecte străine, cum ar fi zăpada, insecte sau fragmente mecanice;
  • influența traiectoriei de zbor asupra vitezei glonțului înregistrată (deplasarea în diagonală a obiectului reduce indicatorul).

Componente si materiale pentru asamblare

Numărul total de piese și complexitatea acestora depind de nivelul de calificare al utilizatorului în proiectarea și instalarea circuitelor. Unele componente sunt obligatoriu pentru orice fel de montaj:

  • LED-uri pentru a crea o sursă de lumină artificială;
  • fier de lipit cu flux și lipit pentru fixarea firelor și instalarea unui microcircuit;
  • receptoare optice pentru citirea nivelului de iluminare în timpul trecerii unui glonț prin LED-uri;
  • un microcircuit pentru determinarea timpului de zbor al unui glonț și calcularea vitezei;
  • afișaj pentru afișarea rezultatelor măsurătorilor;
  • Corp dreptunghiular gol, închis pe patru laturi (este mai bine să alegeți un produs metalic solid, care va fi rezistent la șocuri).

Etape de montare a cronografului

Elementele microcircuitului și senzorii trebuie să fie protejate sau amplasate în locuri care nu vor fi accesibile pentru o lovitură directă de un glonț. Sub ele, trebuie să pregătiți un loc în caz în avans. Interiorul produsului este acoperit cu o vopsea închisă la culoare care nu creează strălucire pentru a evita funcționarea inutilă a dispozitivului și pentru a crește sensibilitatea acestuia.

Elementele sensibile la lumină și LED-urile în sine sunt montate în găuri pre-marcate. Fotodetectoarele ar trebui să fie ușor îngropate, iar LED-urile ar trebui să se bombaze ușor în interiorul cronografului. Acest aranjament va reduce intensitatea luminii externe care cade pe dispozitiv.

În etapa următoare, placa este instalată și conectată la senzori, secțiunile sunt marcate pentru alimentare. Pentru auto-întocmirea unei diagrame, puteți folosi Fig. unu.

Orez. 1 cip cronograf

Când componentele principale sunt asamblate, circuitul va trebui protejat de stres mecanic și umiditate. Pentru această sarcină, este potrivită o cutie de plastic pentru o placă de circuit imprimat, care va avea ieșiri către baterie, afișaj și senzori.

Cum funcționează un cronograf făcut singur

Ca sursă de alimentare pentru dispozitiv, pot fi folosite baterii, acumulatori, o sursă de alimentare conectată la rețea. O sursă autonomă este mai profitabilă și mai convenabilă, deoarece în majoritatea cazurilor reglarea armelor se efectuează în afara casei.

Procesul de măsurare a vitezei trece prin trei etape:

  • glonțul trece prin axa senzorului inițial, resetând contorul de timp din microprocesor;
  • după ce glonțul traversează axa următorului senzor, timpul se oprește și datele sunt transmise pentru calcule;
  • microprocesorul efectuează calcule și afișează indicatorii de viteză pe afișaj.

Funcționarea cronografului de tip cadru poate fi văzută vizual în Fig. 2.

Orez. 2 Diagrama de funcționare a cronografului

Pentru a asambla singur un cronograf, veți avea nevoie de cunoștințe și experiență în inginerie electrică, lipire și proiectare de circuite electrice. Puteți ușura sarcina comandând fabricarea unui microcircuit unui maestru electronic. Un cronograf auto-asamblat va costa mult mai puțin decât o versiune achiziționată.


În acest articol, vom analiza cum puteți face un cronograf simplu din piese ieftine și accesibile. fixare necesar pentru a măsura viteza unui glonț de la o pușcă. Aceste numere sunt necesare pentru a determina starea puștii, deoarece în timp, unele componente pneumatice se uzează și trebuie înlocuite.

Pregătirea materialele necesare si instrumente:
- Digispark chinezesc (a costat 80 de ruble la momentul achiziției);
- afișaj de tip segment pe TM1637 (a costat 90 de ruble la cumpărare);
- LED-uri în infraroșu și fototranzistoare (10 perechi) - costul a fost de 110 ruble;
- o sută de rezistențe de 220 ohmi costă 70 de ruble, dar vor fi necesare doar două dintre ele.

Asta este tot, aceasta este întreaga listă de articole pe care va trebui să le cumpărați. Apropo, rezistențele pot fi găsite și în vechiul aparate electrocasnice. Puteți paria mai mult la valoarea nominală, dar nu mai puțin. Drept urmare, puteți întâlni 350 de ruble, dar acest lucru nu este atât de mult, având în vedere că cronograful din fabrică va costa cel puțin 1000 de ruble, iar asamblarea de acolo este mult mai rău decât a noastră. de casă.

Printre altele, trebuie să vă aprovizionați cu detalii precum:
- fire;
- o bucată de țeavă de cel puțin 10 cm lungime (se potrivește instalațiile sanitare din plastic);
- toate pentru lipit;
- multimetru (optional).


Primele trei detalii descrise au propriile lor nuanțe, așa că fiecare dintre ele trebuie luate în considerare separat.

Digispark
Acest articol este o placă în miniatură compatibilă cu Arduino, ea are un ATtiny85 la bord. Cum să conectați acest element la IDE-ul Arduino, puteți citi mai departe, puteți descărca și drivere pentru el acolo.
Această placă are mai multe opțiuni, una folosește microUSB, iar cealaltă este echipată cu un conector USB care este conectat chiar pe placă. Datorită faptului că produsul de casă nu are o sursă de alimentare individuală, autorul a ales prima versiune a plăcii. Dacă instalați o baterie sau un acumulator într-un produs de casă, acest lucru va crește foarte mult prețul acestuia și nu va afecta foarte mult caracterul practic. Și aproape toată lumea are un cablu pentru încărcarea unui telefon mobil și Power Bank.


În ceea ce privește caracteristicile, acestea sunt similare cu ATtiny85, aici capabilitățile sale sunt mai mult decât suficiente. Microcontrolerul din cronograf sondajează doar senzorii și controlează afișajul.
Dacă nu ai întâlnit niciodată Digispark, cel mai mult nuanțe importante poate fi văzut în tabel.


Este important să țineți cont de faptul că numerotarea pinului pentru funcția analogRead() este diferită. Și pe al treilea pin există un rezistor pull-up cu o valoare nominală de 1,5 kOhm, deoarece este utilizat în USB.

Câteva cuvinte despre afișaj
Se poate folosi orice afișaj pentru produse de casă, însă autorul a optat pentru o variantă ieftină. Pentru a face dispozitivul și mai ieftin, afișajul poate fi complet abandonat. Datele pot fi pur și simplu transmise unui computer printr-un cablu. Aici va fi nevoie. Afișajul considerat este o copie a afișajului.
Cum arată afișajul în față și în spate poate fi văzut în fotografie.




Deoarece distanțele dintre cifre sunt aceleași, cu două puncte dezactivate, cifrele sunt citite fără probleme. Biblioteca standard este capabilă să scoată numere în intervalul 0-9. litere în intervalul a-f, și există și posibilitatea de a modifica luminozitatea întregului afișaj. Valorile cifrelor pot fi setate folosind funcția de afișare (int 0-3, int 0-15).


Cum se utilizează afișajul

// 1. Declarați un fișier antet
#include
// 2. Setați știfturi
#define CLK 0
#define DIO 1
// 3. Declara un obiect
TM1637 tm1637(CLK, DIO);
// 4. Inițializați
void setup()(
tm1637.init();
tm1637.set(6); // Luminozitate
}
// 5. Utilizare
void loop() (
// Afișează numărul x pe afișaj
int x = 1234;
tm1637.display(0, x / 1000);
tm1637.display(1, x / 100% 10);
tm1637.display(2, x / 10% 10);
tm1637.display(3, x % 10);
întârziere (500);
}

Dacă încercați să depășiți valorile, atunci afișajul va afișa confuzie, care, plus orice altceva, nu este statică. Prin urmare, pentru a afișa caractere speciale, cum ar fi grade, minusuri etc., va trebui să mânuiești.


Autorul a dorit ca afișajul să arate energia finală a zborului glonțului, care ar fi calculată în funcție de viteza glonțului și de masa acestuia. Așa cum a fost planificat, valorile ar fi trebuit să fie afișate secvențial și, pentru a înțelege unde se află, acestea trebuie să fie marcate cumva, de exemplu, folosind litera „J”. Ca ultimă soluție, puteți folosi pur și simplu două puncte, dar acest lucru nu i s-a potrivit autorului și a intrat în bibliotecă. Ca urmare, pe baza funcției de afișare, a fost realizată funcția setSegments(byte addr, byte data), aceasta luminează segmente codificate în date în cifra cu numărul adresei:


{
tm1637.start();
tm1637.stop();
tm1637.start();
tm1637.writeByte(addr|0xc0);
tm1637.writeByte(date);
tm1637.stop();
tm1637.start();
tm1637.stop();
}

Astfel de segmente sunt codificate destul de simplu, bitul de date scăzut este responsabil pentru segmentul superior, iar apoi în sensul acelor de ceasornic, al 7-lea bit este responsabil pentru segmentul din mijloc. Caracterul „1” atunci când este codificat arată ca 0b00000110. Al optulea cel mai semnificativ bit este responsabil pentru colon, este folosit în a doua cifră și este ignorat în toate celelalte. Ulterior, autorul a automatizat procesul de obținere a codurilor folosind Excel.


Ce s-a întâmplat până la urmă, puteți vedea în fotografie




#include
#define CLK 0
#define DIO 1
TM1637 tm1637(CLK, DIO);

void setSegments (adresă octet, date octet)
{
tm1637.start();
tm1637.writeByte(ADDR_FIXED);
tm1637.stop();
tm1637.start();
tm1637.writeByte(addr|0xc0);
tm1637.writeByte(date);
tm1637.stop();
tm1637.start();
tm1637.writeByte(tm1637.Cmd_DispCtrl);
tm1637.stop();
}

void setup()(
tm1637.init();
tm1637.set(6);
}

void loop() (
// Ieșire Bună
setSegments(0, 118);
setSegments(1, 121);
setSegment(2, 54);
setSegments(3, 63);
întârziere (500);
}



Și în sfârșit, senzorii

Nu sunt furnizate informații precise despre senzori, se știe doar că aceștia au o lungime de undă de 940 nm. În timpul experimentelor, s-a constatat că senzorii nu sunt capabili să reziste la un curent mai mare de 40 mA. În ceea ce privește tensiunea de alimentare, aceasta nu trebuie să fie mai mare de 3,3V. În ceea ce privește fototranzistorul, acesta are o carcasă ușor transparentă și reacționează la lumină.


Să începem asamblarea și configurarea unui produs de casă:

Primul pas. Asamblare

Totul este asamblat după o schemă foarte simplă. Dintre toți pinii, vor fi necesari doar P0, P1 și P2. Primele două sunt folosite pentru afișaj, iar P2 este necesar pentru ca senzorii să funcționeze.
După cum puteți vedea, un rezistor este folosit pentru a limita curentul pentru LED-uri, în timp ce al doilea trage P2 la masă. Datorită faptului că fototranzistoarele sunt conectate în paralel, atunci când glonțul trece prin fața oricărui optocupler, tensiunea pe P2 va scădea. Pentru a determina viteza unui glonț, trebuie să cunoașteți distanța dintre senzori, să măsurați două supratensiuni și să determinați timpul în care au avut loc.
Datorită faptului că va fi folosit un singur știft, nu contează din ce parte să tragi. Fototranzistoarele vor observa oricum glonțul.










Totul este asamblat din detaliile care se văd în fotografie. Pentru a asambla totul, autorul a decis să folosească o placă. Apoi, întreaga structură pentru rezistență a fost umplută cu adeziv topit la cald. Senzorii sunt plasați pe țeavă și firele sunt lipite de ei.
Pentru a preveni pulsarea diodelor atunci când sunt alimentate de un power bank, autorul a instalat un electrolit de 100 uF în paralel cu LED-urile.




De asemenea, este important de menționat că pinul P2 a fost ales dintr-un motiv, fapt este că P3 și P4 sunt folosite în USB, așa că acum cu ajutorul lui P2 este posibil să flashezi un produs de casă după asamblare.
P2 este, de asemenea, o intrare analogică, deci nu este nevoie să folosiți o întrerupere. Pur și simplu puteți măsura citirile dintre valoarea curentă și cea anterioară, dacă diferența devine peste un anumit prag, înseamnă că în acest moment glonțul tocmai trece pe lângă optocupler.

Pasul doi. Firmware

Prescaler este un divizor de frecvență, în cazurile standard în plăci precum Arduino este 128. Această cifră afectează cât de des este interogat ADC. Adică, pentru 16 MHz implicit, iese 16/128 = 125 kHz. Fiecare digitizare constă din 13 operații, astfel încât pinul poate fi interogat la o rată maximă de 9600 kHz. În practică, aceasta nu este mai mare de 7 kHz. Ca urmare, intervalul dintre măsurători este de 120 μs, ceea ce este prea lung pentru munca de casă. Dacă glonțul zboară cu o viteză de 300 m/s, acesta va acoperi o distanță de 3,6 cm în acest timp, adică controlerul pur și simplu nu va putea observa acest lucru. Pentru ca totul să funcționeze corect, intervalul dintre măsurători trebuie să fie de cel puțin 20 µs. Pentru a face acest lucru, valoarea divizorului trebuie să fie egală cu 16. Autorul a făcut un divizor de 8, cum se face acest lucru poate fi văzut mai jos.
Ți-a plăcut articolul? Împărtășește-l