Jeftini kronograf za pneumatiku vlastitim rukama. Jeftin kronograf za zračnu pušku Dijagram domaćeg kronografa za zračnu pušku

Već dugo imam stari kompresijski pneumatski IZH-53. Kupio sam ga prije 7 godina rabljenog za smiješne novce. Odmah sam stavio novu prozirnu manžetnu i novu oprugu od puške, skratio nekoliko zavoja, ne sjećam se prije koliko godina.

Danas sam zalutao na forum gdje se svi bave overclockingom zračnih pušaka i za nekoliko sati sam progutao cijelu temu o IZH-ovima.

Odmah sam htio izmjeriti brzinu metka, pa sam skinuo AirSpeed ​​​​program i pročitao o folijskim senzorima. Ovdje me pogodila lijenost. Ne volim loše radove koji se moraju ponavljati nekoliko puta. A s folijskim senzorima to bi se dogodilo nakon jednog ili dva hica, obnavljajući cijelu strukturu - ne, hvala.

Pogledao sam dijagrame kupljenih kronometara - zelene melankolije s firmwareom, PIC-ovima i dvostranim pločama. LUT tehnologija je poznata iz prve ruke, ali ne želim si dati hemoroide tjedan dana samo radi deset injekcija.

Odmah je došla ideja da spojim ove dvije ideje. Napravite najjednostavnije optičke senzore od optokaplera i kombinirajte ih s AirSpeed ​​​​programom.

Pa, počnimo!

Već sam skicirao dijagram za ovaj opis, ali možda će nekome biti od koristi prije početka sastavljanja



Otkupna cijena u mom dizajnu je nula rubalja, ali samo zato što uvijek imam raznorazno elektroničko smeće koje leži po kući.

Da, ono najvažnije! Pustite jedan od najnovijih Picnic albuma, inače neće raditi



Komad cijevi od 15 centimetara - PVC cijev Za Vruća voda(Može se koristiti bilo koji s odgovarajućim promjerom) Unutarnji promjer ima 11,5 mm, cijev ima vanjski 11 - pogodan za homespinning



Izbušimo dvije prolazne rupe na ravnomjernoj udaljenosti od 100 mm. Gornje za fotodiode od starog miša su 3 mm. (Gledamo svoj uteg i drilamo svoju veličinu). Donje za bijele LED diode iz stare svjetiljke su 5 mm. (Opet, pogledajte naše).

Prije instalacije sam se uvjerio da LED diode i fotodiode odgovaraju jedna drugoj - zalemio sam ih na žicu, uključio u mikrofonski ulaz računala, pojačao zvuk i brzo prošao LED diodu pored fotodiode, čuo zvuk u zvučnici - sve je bilo super.



Zalijepimo svjetlo i fotodiode u odgovarajuće rupe. Na njih lemimo žice. Odmah morate odlučiti o izvoru napajanja za LED diode. Trebaju najmanje 3 volta i ne više od 20 mA. Uzeo sam jedan LiIon element sa laptopa, daje 3,7 V. U ovom slučaju, LED diode uključujemo kroz otpornik od 820 Ohma, Bilo koji će poslužiti iz raspona 470-910 Ohma.

LED diode možete napajati iz bilo koje dvije AA baterije od 1,5 V. Njihovo punjenje sigurno će trajati godinu dana. S takvim radnim vijekom preporučujem jednostavno lemljenje baterija bez gnjavaže s ležajevima, konektorima i drugim pogodnostima. Morate brzo lemiti kako ne biste pregrijali element.

Odmah nakon lemljenja osjetljivih i tankih izvoda fotodiode, napunite je pištoljem za šmrljanje. da ga slučajno ne otkine.

Lako je provjeriti rad u fazi lemljenja - kada uključite napajanje, trebalo bi doći do klika u oba stupca. Prilikom prolaska metka kroz okomito postavljenu cijev, u stupcima bi se trebala jasno čuti dva klika.

Ako nema klikova kada je kanal mikrofona uključen i pojačan

maksimalni volumen - promijenite polaritet žica na fotodiodama.



"A unutra je neonska!" Mislim da ako pukne leća svjetla ili fotodioda, neće se dogoditi ništa loše. Sve će nastaviti raditi kao i do sada.



Budući da je moja cijev bila veća od promjera cijevi - stavio sam komad termoskupljajućeg materijala na cijev i čvrsto povukao senzor - poravnanje je vidljivo sa stražnje strane sa savršeno upaljenim LED diodama.



Fotografija prikazuje sam pištolj i hvatač metaka iz kartonska kutija s papirnatim smećem unutra.

Sve je trajalo dva sata. Većinu vremena proveo sam ležerno ispijajući pivo i tražeći odgovarajuće fotodiode.

Sada možete provesti testove.



Rezultat rada vidljiv je na snimci zaslona. hitaca 117 m/s, sljedeći hici padaju na 106 m/s. Jednostavno ignoriramo umetnuti glitch od 400 m/s - iako bi bilo lijepo)))))

Podaci su dobiveni za turske ORNEK metke težine 0,42 g.



Na fotografiji su očitanja vaga za 100 kom. isključujući težinu tare.

Za pištolj koji nije nadograđen ili zapečaćen, ovo su prilično dobri brojevi. Iz bačve stalno izlazi dim.

Možete početi paničariti

Mislim da se ovaj dizajn može koristiti i za vatreno oružje, samo trebate uzeti metalna cijev mnogo većeg promjera od debla. I nemojte ga pričvrstiti na cijev, već pucajte u njega samo tako, sa stalka ili iz ruku. Plus, za točnost, povećajte duljinu na jedan metar. Ukratko, uzmite cijev za vodu promjera 100 mm i duljine 1100 mm. I sve će raditi.

Kome treba program - preuzmite http://www..rar Downloads:

Još dva izvrsna Mironova programa.

http://www..rar Preuzimanja:

U svojoj prvoj objavi želim vam ispričati kako sam u nekoliko večeri sastavio kronograf od jeftinih i pristupačnih dijelova. Kao što ste vjerojatno već pogodili iz naziva, ovaj uređaj služi za mjerenje brzine metka u zračnim (i ne baš zračnim) puškama te može biti koristan za praćenje njegovog tehničkog stanja.

1. Dijelovi i pribor

  • Kineski Digispark - 80 rubalja u trenutku kupnje
  • Prikaz segmenta na TM1637 - 90 rubalja u trenutku kupnje
  • IR LED diode i IR fototranzistori (10 pari) - 110 rubalja u trenutku kupnje, trebamo 2 para
  • Otpornici 220 Ohma (100 kom) - 70 rubalja u trenutku kupnje, trebamo samo 2 komada
Time završavaju dijelovi koje je potrebno kupiti. Ne morate naručiti otpornike; slične vrijednosti (ali ne manje!) mogu se izvući iz nepotrebne potrošačke elektronike. Dakle, ukupni troškovi su manji od 350 rubalja, što je ništa u usporedbi s cijenom novog tvorničkog kronografa (preko 1000 rubalja za najjednostavniji, koji je zapravo još primitivniji od našeg predmeta). Osim detalja, trebat će nam:
  • Žice - besplatno ih pronaći offline nije problem
  • Komad plastike cijev za vodu duži od 10 cm (promjer prema ukusu) - također je lako pronaći
  • Pribor za lemljenje
  • Multimetar (opcionalno)
Prva 3 dijela vrijedna su zasebnog razmatranja, jer imaju svoje karakteristike, pa počnimo s njihovim mini-recenzijama.

1.1. Digispark

To je jednostavna minijaturna Arduino-kompatibilna ploča s ATtiny85 na ploči. Pročitajte kako se spojiti na Arduino IDE na službenoj web stranici projekta, gdje možete pronaći i upravljačke programe za njega. Postoje dvije glavne vrste ove ploče: s microUSB i brutalniji s USB konektorom koji se nalazi izravno na ploči.

Moj kronograf nema vlastito napajanje pa sam odabrao prvu opciju ploče. Ugrađena baterija/baterija koja se može puniti uvelike će povećati cijenu bez dodavanja praktički bilo čega upotrebljivosti. Moćna banka i gotovo svi imaju kabel za punjenje telefona koji leži uokolo.

Karakteristike prirodno naslijeđen od ATtiny85, njegove mogućnosti u našem slučaju su dovoljne. Zapravo, MK u kronografu ne radi ništa osim što ispituje dva senzora i kontrolira zaslon. Za one koji se prvi put susreću s Digisparkom, sažeo sam najvažnije karakteristike u tablici:

Ovu ploču koristim kao varalicu pri razvoju raznih uređaja temeljenih na ovoj ploči. Kao što ste možda primijetili, numeriranje pinova za funkciju analogRead() je drugačije, to treba uzeti u obzir. I još jedna značajka: na trećem pinu nalazi se pull-up otpornik od 1,5 kOhm, jer koristi se u USB-u.

1.2. Zaslon temeljen na TM1637

Sljedeći važan detalj- digitalni zaslon na kojem će se prikazivati ​​informacije. Može se koristiti bilo koji zaslon; moj izbor je samo zbog niske cijene i jednostavnosti rada s njim. U principu, možete potpuno napustiti prikaz i izlaz podataka putem kabela na računalo, tada će uređaj postati još jeftiniji. Za rad će vam trebati biblioteka DigitalTube. Tema koju sam povezao na početku posta je klon Grove zaslona. Pogled sprijeda:

Razmak između znamenki je isti, pa kada je dvotočka isključena, numeričke vrijednosti se čitaju normalno. Primjer je isporučen zajedno sa standardnom bibliotekom koja radi s Digisparkom bez plesanja s tamburicom:

Sve što standardna biblioteka može učiniti je ispisati brojeve 0-9 i slova a-f, kao i promijeniti svjetlinu cijelog zaslona. Vrijednost znamenke određena je funkcijom display (int 0-3, int 0-15).

Brzi tečaj korištenja zaslona

// 1. Deklarirajte datoteku zaglavlja #include // 2. Postavite pinove #define CLK 0 #define DIO 1 // 3. Deklarirajte objekt TM1637 tm1637(CLK, DIO); // 4. Inicijalizirajte void setup() ( tm1637.init(); tm1637.set(6); // Svjetlina ) // 5. Koristite void loop() ( // Prikaz broja x int x = 1234; tm1637 .display (0, x / 1000); tm1637.display (1, x / 100 % 10); tm1637.display (2, x / 10 % );


Ako pokušate prikazati znak s kodom izvan granica, zaslon prikazuje besmislicu, koja nije statična, tako da nećete moći prevariti da prikažete posebne znakove (stupnjevi, minus) bez tamburice:

To mi nije odgovaralo, jer sam u svom kronografu želio osigurati prikaz ne samo brzine, već i energije metka (izračunate na temelju mase unaprijed upisane u skicu), te dvije vrijednosti trebaju biti prikazane uzastopno. Da biste razumjeli što zaslon prikazuje u određenom trenutku, trebate nekako vizualno razdvojiti ove dvije vrijednosti, na primjer, pomoću simbola "J". Naravno, možete glupo koristiti simbol dvotočke kao indikator zastavice, ali to nije točno i nije košer) Stoga sam otišao da razumijem biblioteku i, na temelju funkcije prikaza, napravio setSegments(byte addr, byte data) funkcija koja osvjetljava broj sa segmentima adrese broja kodiranim u podacima:

Void setSegments(byte addr, byte data) ( tm1637.start(); tm1637.writeByte(ADDR_FIXED); tm1637.stop(); tm1637.start(); tm1637.writeByte(addr|0xc0); tm1637.writeByte(data) ; tm1637.stop()); tm1637.writeByte(tm1637.DispCtrl());
Segmenti su kodirani krajnje jednostavno: najmanji bit podataka odgovoran je za najviši segment, itd. u smjeru kazaljke na satu, sedmi bit je odgovoran za središnji segment. Na primjer, znak "1" je kodiran kao 0b00000110. Osmi, najvažniji bit se koristi samo u drugoj znamenki i odgovoran je za dvotočku u svim ostalim znamenkama se zanemaruje. Kako bih si olakšao život, kao što bi svaki lijeni informatičar trebao, automatizirao sam proces dobivanja znakovnih kodova pomoću Excela:

Sada možete lako učiniti ovo:

Recimo ZDRAVO

#uključi #define CLK 0 #define DIO 1 TM1637 tm1637(CLK, DIO); void setSegments(byte addr, byte data) ( tm1637.start(); tm1637.writeByte(ADDR_FIXED); tm1637.stop(); tm1637.start(); tm1637.writeByte(addr|0xc0); tm1637.writeByte(data) tm1637.stop(); tm1637.Cmd_DispCtrl()); , 121); setSegments(2, 54); setSegments(3, 63); odgoda(500);

1.3. Senzori

Ovdje, nažalost, ne mogu reći ništa posebno, jer na stranici proizvoda nema ni riječi o karakteristikama ili barem oznake po kojoj bi se mogla iskopati datasheet. Tipično noname. Poznata je samo valna duljina od 940 nm.

Po cijeni jedne LED diode utvrdio sam da je za njih pogubna struja veća od 40mA, a napon napajanja bi trebao biti ispod 3,3V. Fototranzistor je blago proziran i reagira na svjetlost

2. Priprema dijelova i montaža

Krug je vrlo jednostavan i nekompliciran; potrebni su nam samo P0, P1 - za rad sa zaslonom, a također i P2 - za rad sa senzorima:

Kao što vidite, jedan otpornik ograničava struju na LED diodama, drugi povlači P2 na masu. Fototranzistori su spojeni u seriju, tako da prolazak metka ispred bilo kojeg optokaplera uzrokuje smanjenje napona na P2. Snimajući dva uzastopna skoka napona i mjereći vrijeme između njih, možemo odrediti brzinu metka (znajući, naravno, udaljenost između senzora). Korištenje jedne igle za mjerenje ima još jednu prednost - nema potrebnog smjera kretanja metka, možete pucati s oba kraja. Sakupit ćemo iz ove šačice dijelova:

Krenuo sam putem minijaturizacije i odlučio napraviti sendvič koristeći komad ploče za kruh:

Cijeli sendvič je ispunjen vrućim ljepilom za čvrstoću:

Sve što preostaje je postaviti senzore u cijev i lemiti žice:

Na fotografiji se vidi da sam paralelno s LED diodama stavio dodatnih 100 mKF elektrolita, kako pri napajanju power bankom ne bi bilo pulsiranja IC dioda.

Pin P2 je s razlogom odabran kao ulaz. Podsjećam vas da se P3 i P4 koriste u USB-u, tako da korištenje P2 omogućuje bljeskanje već sastavljenog uređaja. Drugo, P2 je analogni ulaz, tako da ne možete koristiti prekide, već jednostavno mjeriti razliku u ciklusu između prethodnog i Trenutna vrijednost na njemu, ako je razlika iznad određenog praga, to znači da metak prolazi između jednog od optokaplera. Ali postoji jedan softverski trik, bez kojeg se gornja shema neće pokrenuti, o tome ćemo dalje govoriti.

3. Firmware

3.1. Nekoliko riječi o predskaleru

Prescaler je frekvencijski razdjelnik, prema zadanim postavkama u pločama sličnim arduinu je 128. Maksimalna frekvencija uzorkovanja ADC-a ovisi o vrijednosti ove vrijednosti prema zadanim postavkama, za kontroler od 16 MHz ispada 16/128 = 125 kHz. Svaka digitalizacija traje 13 operacija, tako da je maksimalna frekvencija uzorkovanja pinova 9600 kHz (u teoriji, u praksi ne viša od 7 kHz). Oni. interval između mjerenja je otprilike 120 μs, što je jako, jako dugo. Metak koji leti brzinom od 300 m/s za to će vrijeme preletjeti 3,6 cm - kontroler jednostavno neće imati vremena otkriti činjenicu da metak prolazi kroz optokapler. Za normalna operacija potreban vam je interval između mjerenja od najmanje 20 µs, potrebna vrijednost razdjelnika za to je 16. Otišao sam još dalje i koristim razdjelnik od 8 u svom uređaju, to se radi na sljedeći način:

#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); ... )
Stvarna mjerenja intervala analogRead na različitim razdjelnicima:

3.2. Konačna skica

Neću detaljno opisivati ​​kod, već je dobro dokumentiran. Umjesto toga ja sam za u općim crtama Opisat ću algoritam njegovog rada. Dakle, sva logika se svodi na sljedeće korake:
  • Prvi ciklus - mjeri se razlika između trenutne i prethodne vrijednosti na pinu
  • Ako je razlika veća od zadanog praga, tada izlazimo iz petlje i pamtimo trenutno vrijeme (micros())
  • Drugi ciklus - sličan prethodnom + brojač vremena u ciklusu
  • Ako je brojač dosegao zadanu vrijednost, javlja se pogreška i prijelaz na početak. To omogućuje ciklusu da ne ide u vječnost ako metak iz nekog razloga nije primijetio drugi senzor
  • Ako se brojač nije prelio i razlika u vrijednostima je veća od praga, tada izmjerite trenutno vrijeme (micros())
  • Na temelju razlike u vremenu i udaljenosti između senzora izračunavamo brzinu i prikazujemo je na ekranu
  • Idi na početak
Ovo je vrlo pojednostavljen model; u sam kod sam dodao zviždaljku, uključujući izračun i prikaz energije metka na temelju unaprijed unesene mase metka u kod.

Zapravo, sav kod

/* * Kronograf za mjerenje brzine metka, SinuX 23.03.2016 */ #include #define CLK 1 // Prikazni pin #define DIO 0 // Prikazni pin #define START_PIN 1 // Analogni početni pin #define END_PIN 1 // Analogni završni pin #define START_LEV 50 // Početni prag okidača #define END_LEV 50 // Prag aktiviranje cilja #define TIMEOUT 10000 // Vrijeme čekanja na cilj u mikrosekundama #define BULLET_WEIGHT 0.00051 // Masa metka u kilogramima (za izračun energije) #define ENCODER_DIST 0.1 // Udaljenost između senzora u metrima (10cm = 0.1m) #define SHOW_DELAY 3000 / / Vrijeme prikaza rezultata // Za ubrzavanje analognog čitanja #ifndef cbi #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #endif #ifndef sbi #define sbi(sfr, bit) (_SFR_BYTE(sfr ) |= _BV(bit)) #endif // Servisne varijable int prevVal, curVal; nepredpisano dugo vrijeme početka, vrijeme završetka; TM1637 tm1637(CLK, DIO); /* Prerađena funkcija TM1637::display(), koja vam omogućuje osvjetljavanje pojedinačnih segmenata * Numeriranje segmenata: niski bit - visoki segment, itd. u smjeru kazaljke na satu * Središnji segment je najvažniji bit */ void setSegments(byte addr, byte data) ( tm1637.start(); tm1637.writeByte(ADDR_FIXED); tm1637.stop(); tm1637.start(); tm1637.writeByte( addr|0xc0); tm1637.writeByte(tm1637.Ctrl()); Postavi prescaler na 8 za ubrzanje analognog čitanja ); sbi(ADCSRA); // Inicijaliziraj prikaz poruke setSegments (0, 54); // Main Segments (3, 63); petlja void petlja() ( // Zaslon čekanja showReady(); // Čekanje na početak 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. Primjeri rada

Na ispravan spoj Uređaj se gotovo odmah pokazao, jedina mana koja je otkrivena je da negativno reagira na LED i fluorescentno osvjetljenje (frekvencija pulsiranja je oko 40 kHz), pa se mogu pojaviti spontane greške. Ukupno, uređaj ima 3 načina rada:

Pozdrav nakon uključivanja i prelaska u stanje pripravnosti snimanja (zaslon je ispunjen prugama):

U slučaju greške, prikazuje se "Err" i ponovno se prebacuje u stanje pripravnosti:

Pa sam sam mjerio brzinu:

Nakon hica prvo se prikazuje brzina metka (sa simbolom “n”), zatim energija (simbol “J”), a energija se izračunava s točnošću do jedne decimale (na gifu možete vidjeti da kada se pokažu džuli, dvotočka svijetli). Još nisam mogao naći ljepšu kutiju, pa sam samo sve napunio termalnim mlaznicama:

To je valjda sve za mene, nadam se da je nekome koristilo.

Kronograf je univerzalni uređaj koji može mjeriti brzinu leta malih predmeta. Najprikladnije je postaviti i testirati pneumatiku s kronografima s okvirom. Mogu detektirati kretanje metaka, samostrelnih vijaka, strijela i spajalica za praćku. Kronograf za pneumatiku možete izraditi sami ili kupiti u specijaliziranim trgovinama.

Vrste kronografa

Mjerenje početne brzine metka pomoću kronografa omogućuje određivanje snage pištolja ili puške, odabir prikladnih metaka, izračun balističkih korekcija te usporedbu brzine na početku i nakon nadogradnje oružja.

postojati Različite vrste kronografi. Model njuške zauzima malo prostora i lako stane u džep futrole, a također troši manje energije. Može zahtijevati određena vrsta oružja adapter. Ova vrsta ne ovisi o rasvjeti i prikladna je za korištenje na otvorenom. Zajedno s uređajem može se izvoditi ciljano gađanje. Ovaj model nije prikladan za CO2.

Ako imate impresivan arsenal, bolje je kupiti okvirni kronograf kako ne bi kupili veliki broj adapteri. Ovaj tip uređaja dobro radi s CO2 i ima priključak za vanjski izvor napajanja. Oklop vam omogućuje mjerenje indikatora na različitim udaljenostima bez straha od oštećenja mehanizma. Prisutnost dodatnog zaslona pomaže u brzom dobivanju rezultata.

Postoje i okvirni modeli velika veličina, proširujući broj mogućnosti. Ova je opcija prikladna za korištenje s bilo kojom vrstom oružja i prikladna je za stacionarnu vezu s mrežom. Alternativno, kronograf se može napajati s osam AA baterija. Za razliku od malog modela, veliki uređaj ima ugrađeni indikator prednjeg tipa. Po želji možete instalirati zaslon koji se može ukloniti. Pomoću USB adaptera možete prenijeti podatke mjerenja s uređaja na računalo.

Kupnja kronografa za pneumatiku

Različite vrste kronografa u Moskvi i St. Petersburgu možete kupiti u sljedećim trgovinama:

  • Airgun Store - po cijenama od 3500 do 24 tisuće rubalja;
  • Diada Arms - po cijeni od 4 tisuće do 13 tisuća rubalja;
  • Pnevmat 24 - cijena od 4 tisuće do 7 tisuća rubalja;
  • Oxotnika.net - po cijenama od 3 tisuće do 20 tisuća rubalja.

Ove trgovine također nude razne komponente i dodatke za kronograf. Na AliExpressu možete kupiti jeftiniji model po cijeni od 3 tisuće rubalja. ili kupiti rabljeno, na primjer, na portalu Guns.ru ili Avito po cijeni od 1500 rubalja.

Uradi sam kronograf s okvirom za pneumatiku

Kronograf bilježi vrijeme putovanja metka između nekoliko senzora i izračunava njegovu brzinu. Uređaj se sastoji od tri dijela:

  • radni prostor koji omogućuje prolaz metka;
  • sklop koji provodi izračune;
  • zaslon koji prikazuje izračunate rezultate.

Krugovi kronografa mogu se razlikovati po cijeni, funkcionalnosti i dizajnu. Najjednostavniji senzori čitaju svjetlost koja pada na njih, čiji se intenzitet mijenja kako se metak kreće, bacajući sjenu. Elementi osjetljivi na svjetlo dio su mnogih kronografa kućne i tvorničke izrade.

Samostalni uređaj ima nekoliko prednosti:

Uz ovo, uređaj ima i svoju mane:

  • glomazan dizajn;
  • potreba za zaštitom od ulaska prednje strane radnog područja;
  • utjecaj vremenski uvjeti i rasvjeta za rad;
  • osjetljivost optičkog kruga na značajne mehaničke udare, uključujući udarce od fragmenata metaka i rikošeta;
  • prikazivanje lažnih očitanja prilikom pojavljivanja u kameri strane predmete kao što su snijeg, insekti ili mehanički ostaci;
  • utjecaj putanje leta na snimljenu brzinu metka (dijagonalno kretanje objekta smanjuje indikator).

Komponente i materijali za montažu

Ukupan broj dijelova i njihova složenost ovise o korisnikovom dizajnu sklopa i vještini instalacije. Neke komponente su obavezna za bilo koju vrstu montaže:

  • LED za stvaranje umjetnog izvora svjetlosti;
  • lemilo s fluksom i lemom za pričvršćivanje žica i ugradnju mikro kruga;
  • optički prijemnici za očitavanje razine osvjetljenja tijekom leta metka kroz LED diode;
  • mikrokrug za određivanje vremena leta metka i izračunavanje brzine;
  • zaslon za prikaz rezultata mjerenja;
  • pravokutno šuplje tijelo, zatvoreno s četiri strane (bolje je odabrati čvrsti metalni proizvod koji će biti otporan na udarce).

Koraci instalacije kronografa

Elementi mikrokruga i senzori moraju biti zaštićeni ili smješteni na mjestima koja neće biti dostupna izravnom udaru metka. Za njih morate unaprijed pripremiti mjesto u zgradi. Unutrašnjost proizvoda premazana je tamnom bojom koja ne odsjaje kako bi se izbjeglo nepotrebno okidanje uređaja i povećala njegova osjetljivost.

Elementi osjetljivi na svjetlost i same LED diode montiraju se u unaprijed označene rupe. Fotodetektori bi trebali biti malo udubljeni, a LED diode bi trebale malo stršati u unutrašnjost kronografa. Ovaj položaj će smanjiti intenzitet vanjsko svjetlo pada na uređaj.

U sljedećoj fazi, ploča je instalirana i povezana sa senzorima, odjeljci su označeni za napajanje. Da biste sami nacrtali dijagram, možete koristiti sl. 1.

Riža. 1 kronografski čip

Kada su glavne komponente sklopljene, strujni krug će morati biti zaštićen od mehanički utjecaji i vlage. Plastična kutija za ovu svrhu prikladna je za ovaj zadatak. isprintana matična ploča, koji će imati izlaze za bateriju, zaslon i senzore.

Princip rada samostalno izrađenog kronografa

Kao izvor napajanja za uređaj mogu se koristiti baterije, punjive baterije ili napajanje spojeno na mrežu. Autonomni izvor je isplativiji i praktičniji, jer se ugađanje oružja u većini slučajeva provodi izvan kuće.

Proces mjerenja brzine prolazi kroz tri faze:

  • metak prolazi kroz os početnog senzora, resetirajući brojač vremena u mikroprocesoru;
  • nakon što metak pređe os sljedećeg senzora, vrijeme se zaustavlja i podaci se prenose za izračune;
  • mikroprocesor provodi izračune i prikazuje indikatore brzine na zaslonu.

Rad kronografa s okvirom može se jasno vidjeti na sl. 2.

Riža. 2 Dijagram rada kronografa

Da biste sami sastavili kronograf, potrebno vam je znanje i iskustvo u elektrotehnici, lemljenju i razvoju električni krugovi. Zadatak možete olakšati naručivanjem proizvodnje mikro kruga od stručnjaka za elektroniku. Kronograf koji ste sami sastavili koštat će mnogo manje od kupljene verzije.

Posjedujem zračnu pušku, oduvijek me zanimala brzina izlaska metka iz cijevi, možda će to nekome biti čudno, ali za zračne entuzijaste brzina metka je jedna od glavnih tema za artikulaciju. Nakon što sam malo guglao, pronašao sam nekoliko opcija za sklopove na različitim mikrokontrolerima, budući da sam već radio s AVR-om, bez oklijevanja sam izabrao opciju na avr-u. svi potrebne detalje Našao sam ga na Taydaelectronics.com, već spomenutom ovdje. Kupovina je prikupljena, plaćena, primljena, krenimo...

Odmah ću priložiti dijagram:


Zainteresirani mogu pogledati detaljnije na

Dakle, trebat će nam:


- 1 kom.
- 1 kom.
Par kondenzatora 330 nF i 100 nF za regulator napona
(možete napajati cijeli krug iz tri AA baterije umjesto krunice, regulator i kondenzatori neće biti potrebni)
2 kom.
1 kom.
2 kom.
2 kom.
prekidač, utičnica za mikrokontroler, utičnica za indikator, konektori za kablove, sam kabel sam koristio od starog računala. Također set otpornika.

Ponovio sam sklop u Proteusu, prilagodio ga svojim potrebama i urezao tiskanu pločicu

Nekako sam posložio komponente tako da imam okvirnu ideju kako nacrtati staze. I da, nemam printer, crtam tragove trajnim markerom)))

Prvo probam na papiru

Zatim ga prebacim u tekstolit

Mi se trujemo. Trovam u vrućoj otopini željeznog klorida, razrijeđenom s vodom otprilike 1:3. Nakon jetkanja, otopinu pohranim na balkon, djeluje i nakon sušenja, samo trebate dodati vodu. Pazite da ne dođe u dodir s metalnim površinama - počet će povećana korozija.

Čišćenje

Idemo bušiti. Bušilicu sam napravio od patrone, a motor od fastteka.

Sve komponente su zalemljene na pločicu, ostaje samo fleširati mikrokontroler

ŽIVO JE!

Nakon toga napravio sam mjernu cijev sa senzorima. Dizajn je jednostavan - na udaljenosti od 50 mm jedan od drugog nalaze se fototranzistor i LED dioda smješteni jedan nasuprot drugog, vrsta optokaplera. Kad metak proleti kroz cijev, naizmjenično blokira snop svjetlosti prema prvom i drugom tranzistoru, što oni signaliziraju mikrokontroleru koji izračunava brzinu po formuli poznatoj svima iz škole.

izvor

/*
* Firmware bez zvona i zviždaljki, udaljenost između senzora 100 mm
* zajednička anoda!
* Ažurirano: 15.12.2013
*

#define F_CPU 1000000UL

#uključi
#uključi
#uključi

#definiraj LED_PRAZNO ~0b00000000

#definiraj LED_0 ~0b00111111
#definiraj LED_1 ~0b00000110
#definiraj LED_2 ~0b01011011
#definiraj LED_3 ~0b01001111
#definiraj LED_4 ~0b01100110
#definiraj LED_5 ~0b01101101
#definiraj LED_6 ~0b01111101
#definiraj LED_7 ~0b00000111
#definiraj LED_8 ~0b01111111
#definiraj LED_9 ~0b01101111
#definiraj LED_DOT ~0b10000000

#definiraj LED_MINUS ~0b01000000
#definiraj LED_E ~0b01111001
#definiraj LED_r ~0b01010000
#definiraj LED_G ~0b00111101
#definiraj LED_o ~0b01011100

#definirajte BASE_LENGTH 1000

Typedef struct LedPanel (
int seg1;
int seg2;
int seg3;
) LedPanel;

Void renderSegmentNext() (
static int activeSegment = 0;
aktivni segment = (aktivni segment + 1) % 3;

Prebaci (activeSegment) (
slučaj 0:
PORTB = led.seg1;
PORTD = ~0b0110000;
pauza;
slučaj 1:
PORTB = led.seg2;
PORTD = ~0b1010000;
pauza;
slučaj 2:
PORTB = led.seg3;
PORTD = ~0b1100000;
pauza;
}
}

Poništi initPorts() (
//init led portovi
DDRB = 0xFF;
DDRD |= (0b111<< 4);
//priključci gumba za pokretanje
DDRD &= ~(1<< PD0);
DDRD &= ~(1<< PD1);
}

Int digitToLedValue(int digit) (
prekidač (cifra) (
slučaj 0:
povratak LED_0;
slučaj 1:
povratak LED_1;
slučaj 2:
povratak LED_2;
slučaj 3:
povratak LED_3;
slučaj 4:
povratak LED_4;
slučaj 5:
povratak LED_5;
slučaj 6:
povratak LED_6;
slučaj 7:
povratak LED_7;
slučaj 8:
povratak LED_8;
slučaj 9:
povratak LED_9;
zadano:
povratak LED_MINUS;
}
}
void setLedValue(int vrijednost) (
ako (vrijednost< 0 || value > 400){
led.seg1 = LED_MINUS;
led.seg2 = LED_MINUS;
led.seg3 = LED_MINUS;
povratak;
}

Led.seg3 = digitToLedValue(vrijednost % 10);
if (vrijednost >= 10) (
led.seg2 = digitToLedValue((vrijednost / 10) % 10);
) inače (
led.seg2 = LED_PRAZNO;
}
if (vrijednost >= 100) (
led.seg1 = digitToLedValue((vrijednost / 100) % 10);
) inače (
led.seg1 = LED_PRAZNO;
}
}

ISR(TIMER1_OVF_vect) (
//zaustavi mjerač vremena i poništi vrijednost
TCCR1B &= ~(1<< CS00);
TCNT1 = 0;
//onemogući int1
GIMSK &= ~(1<< INT1);
//postavi izlaz greške
setLedValue(-1);
}

ISR(INT0_vect) (
//resetirajte mjerač vremena i pokrenite ga
TCNT1 = 0;
TCCR1B |= (1<< CS00);
//omogući int1
GIMSK |= 1<< INT1;
}

ISR(INT1_vect) (
//zaustavi mjerač vremena
TCCR1B &= ~(1<< CS00);
//onemogući int1
GIMSK &= ~(1<< INT1);
//izračunaj brzinu
int brzina = (F_CPU / 10000L) * BASE_LENGTH / TCNT1;
setLedValue(brzina);
}

Int main() (
initPorts();

MCUCR |= (1<< ISC00);
MCUCR |= (1<< ISC01);
GIMSK |= 1<< INT0;

MCUCR |= (1<< ISC10);
MCUCR |= (1<< ISC11);
GIMSK &= ~(1<< INT1);

TIMSK |= (1<< TOIE1);

PostaviLedVrijednost(0);

Dok (1) (
renderSegmentNext();
_odgoda_ms(2);
}
}

Koristeći turpiju i ručnu ubodnu pilu, dao sam kutiji željeni oblik, nagurao sav nadjev na mjesta, učvrstio ga gdje je bilo potrebno termo mlaznicama.

Počnimo snimati:

Puška na fotografiji je Stoeger x20 sa ugrađenom plinskom oprugom. U teoriji može doseći 250 m/s.
I gotovo je iscijedio 0,68 grama metkom


Uređaj je spreman i funkcionalan.

Naravno, ne računam na njegovu točnost, nije bilo standarda u blizini, ali brzina se ne prikazuje nasumično, stabilna je. Ako trebate pratiti promjene u početnoj brzini metka ovisno o promjenama u dizajnu pneumatike, onda je to sasvim dovoljno. Analozi takvog kronometra koštaju više od 2 tisuće rubalja, ali ovaj me nije koštao više od 300 rubalja, a pružio mi je i 4 sata ugodne zabave.

U svojoj prvoj objavi želim vam ispričati kako sam u nekoliko večeri sastavio kronograf od jeftinih i pristupačnih dijelova. Kao što ste vjerojatno već pogodili iz naziva, ovaj uređaj služi za mjerenje brzine metka u zračnim (i ne baš zračnim) puškama te može biti koristan za praćenje njegovog tehničkog stanja.

1. Dijelovi i pribor

  • Kineski Digispark - 80 rubalja u trenutku kupnje
  • Prikaz segmenta na TM1637 - 90 rubalja u trenutku kupnje
  • IR LED diode i IR fototranzistori (10 pari) - 110 rubalja u trenutku kupnje, trebamo 2 para
  • Otpornici 220 Ohma (100 kom) - 70 rubalja u trenutku kupnje, trebamo samo 2 komada
Time završavaju dijelovi koje je potrebno kupiti. Ne morate naručiti otpornike; slične vrijednosti (ali ne manje!) mogu se izvući iz nepotrebne potrošačke elektronike. Dakle, ukupni troškovi su manji od 350 rubalja, što je ništa u usporedbi s cijenom novog tvorničkog kronografa (preko 1000 rubalja za najjednostavniji, koji je zapravo još primitivniji od našeg predmeta). Osim detalja, trebat će nam:
  • Žice - besplatno ih pronaći offline nije problem
  • Komad plastične cijevi za vodu dulji od 10 cm (promjer prema ukusu) - također je lako pronaći
  • Pribor za lemljenje
  • Multimetar (opcionalno)
Prva 3 dijela vrijedna su zasebnog razmatranja, jer imaju svoje karakteristike, pa počnimo s njihovim mini-recenzijama.

1.1. Digispark

To je jednostavna minijaturna Arduino-kompatibilna ploča s ATtiny85 na ploči. Pročitajte kako se spojiti na Arduino IDE na službenoj web stranici projekta, gdje možete pronaći i upravljačke programe za njega. Postoje dvije glavne vrste ove ploče: s microUSB i brutalniji s USB konektorom koji se nalazi izravno na ploči.

Moj kronograf nema vlastito napajanje pa sam odabrao prvu opciju ploče. Ugrađena baterija/baterija koja se može puniti uvelike će povećati cijenu bez dodavanja praktički bilo čega upotrebljivosti. Gotovo svatko ima power bank i kabel za punjenje telefona uokolo.

Karakteristike prirodno naslijeđen od ATtiny85, njegove mogućnosti u našem slučaju su dovoljne. Zapravo, MK u kronografu ne radi ništa osim što ispituje dva senzora i kontrolira zaslon. Za one koji se prvi put susreću s Digisparkom, sažeo sam najvažnije karakteristike u tablici:

Ovu ploču koristim kao varalicu pri razvoju raznih uređaja temeljenih na ovoj ploči. Kao što ste možda primijetili, numeriranje pinova za funkciju analogRead() je drugačije, to treba uzeti u obzir. I još jedna značajka: na trećem pinu nalazi se pull-up otpornik od 1,5 kOhm, jer koristi se u USB-u.

1.2. Zaslon temeljen na TM1637

Sljedeći važan detalj je digitalni zaslon na kojem će se prikazivati ​​informacije. Može se koristiti bilo koji zaslon; moj izbor je samo zbog niske cijene i jednostavnosti rada s njim. U principu, možete potpuno napustiti prikaz i izlaz podataka putem kabela na računalo, tada će uređaj postati još jeftiniji. Za rad će vam trebati biblioteka DigitalTube. Tema koju sam povezao na početku posta je klon Grove zaslona. Pogled sprijeda:

Razmak između znamenki je isti, pa kada je dvotočka isključena, numeričke vrijednosti se čitaju normalno. Primjer je isporučen zajedno sa standardnom bibliotekom koja radi s Digisparkom bez plesanja s tamburicom:

Sve što standardna biblioteka može učiniti je prikazati brojeve 0-9 i slova a-f, kao i promijeniti svjetlinu cijelog zaslona. Vrijednost znamenke određena je funkcijom display (int 0-3, int 0-15).

Brzi tečaj korištenja zaslona

// 1. Deklarirajte datoteku zaglavlja #include // 2. Postavite pinove #define CLK 0 #define DIO 1 // 3. Deklarirajte objekt TM1637 tm1637(CLK, DIO); // 4. Inicijalizirajte void setup() ( tm1637.init(); tm1637.set(6); // Svjetlina ) // 5. Koristite void loop() ( // Prikaz broja x int x = 1234; tm1637 .display (0, x / 1000); tm1637.display (1, x / 100 % 10); tm1637.display (2, x / 10 % );


Ako pokušate prikazati znak s kodom izvan granica, zaslon prikazuje besmislicu, koja nije statična, tako da nećete moći prevariti da prikažete posebne znakove (stupnjevi, minus) bez tamburice:

To mi nije odgovaralo, jer sam u svom kronografu želio osigurati prikaz ne samo brzine, već i energije metka (izračunate na temelju mase unaprijed upisane u skicu), te dvije vrijednosti trebaju biti prikazane uzastopno. Da biste razumjeli što zaslon prikazuje u određenom trenutku, trebate nekako vizualno razdvojiti ove dvije vrijednosti, na primjer, pomoću simbola "J". Naravno, možete glupo koristiti simbol dvotočke kao indikator zastavice, ali to nije točno i nije košer) Stoga sam otišao da razumijem biblioteku i, na temelju funkcije prikaza, napravio setSegments(byte addr, byte data) funkcija koja osvjetljava broj sa segmentima adrese broja kodiranim u podacima:

Void setSegments(byte addr, byte data) ( tm1637.start(); tm1637.writeByte(ADDR_FIXED); tm1637.stop(); tm1637.start(); tm1637.writeByte(addr|0xc0); tm1637.writeByte(data) ; tm1637.stop()); tm1637.writeByte(tm1637.DispCtrl());
Segmenti su kodirani krajnje jednostavno: najmanji bit podataka odgovoran je za najviši segment, itd. u smjeru kazaljke na satu, sedmi bit je odgovoran za središnji segment. Na primjer, znak "1" je kodiran kao 0b00000110. Osmi, najvažniji bit se koristi samo u drugoj znamenki i odgovoran je za dvotočku u svim ostalim znamenkama se zanemaruje. Kako bih si olakšao život, kao što bi svaki lijeni informatičar trebao, automatizirao sam proces dobivanja znakovnih kodova pomoću Excela:

Sada možete lako učiniti ovo:

Recimo ZDRAVO

#uključi #define CLK 0 #define DIO 1 TM1637 tm1637(CLK, DIO); void setSegments(byte addr, byte data) ( tm1637.start(); tm1637.writeByte(ADDR_FIXED); tm1637.stop(); tm1637.start(); tm1637.writeByte(addr|0xc0); tm1637.writeByte(data) tm1637.stop(); tm1637.Cmd_DispCtrl()); , 121); setSegments(2, 54); setSegments(3, 63); odgoda(500);

1.3. Senzori

Ovdje, nažalost, ne mogu reći ništa posebno, jer na stranici proizvoda nema ni riječi o karakteristikama ili barem oznake po kojoj bi se mogla iskopati datasheet. Tipično noname. Poznata je samo valna duljina od 940 nm.

Po cijeni jedne LED diode utvrdio sam da je za njih pogubna struja veća od 40mA, a napon napajanja bi trebao biti ispod 3,3V. Fototranzistor je blago proziran i reagira na svjetlost

2. Priprema dijelova i montaža

Krug je vrlo jednostavan i nekompliciran; potrebni su nam samo P0, P1 - za rad sa zaslonom, a također i P2 - za rad sa senzorima:

Kao što vidite, jedan otpornik ograničava struju na LED diodama, drugi povlači P2 na masu. Fototranzistori su spojeni u seriju, tako da prolazak metka ispred bilo kojeg optokaplera uzrokuje smanjenje napona na P2. Snimajući dva uzastopna skoka napona i mjereći vrijeme između njih, možemo odrediti brzinu metka (znajući, naravno, udaljenost između senzora). Korištenje jedne igle za mjerenje ima još jednu prednost - nema potrebnog smjera kretanja metka, možete pucati s oba kraja. Sakupit ćemo iz ove šačice dijelova:

Krenuo sam putem minijaturizacije i odlučio napraviti sendvič koristeći komad ploče za kruh:

Cijeli sendvič je ispunjen vrućim ljepilom za čvrstoću:

Sve što preostaje je postaviti senzore u cijev i lemiti žice:

Na fotografiji se vidi da sam paralelno s LED diodama stavio dodatnih 100 mKF elektrolita, kako pri napajanju power bankom ne bi bilo pulsiranja IC dioda.

Pin P2 je s razlogom odabran kao ulaz. Podsjećam vas da se P3 i P4 koriste u USB-u, tako da korištenje P2 omogućuje bljeskanje već sastavljenog uređaja. Drugo, P2 je analogni ulaz, tako da ne možete koristiti prekide, već jednostavno mjeriti razliku u ciklusu između prethodne i trenutne vrijednosti na njemu, ako je razlika iznad određenog praga, tada metak prolazi između jednog od optokaplera; . Ali postoji jedan softverski trik, bez kojeg se gornja shema neće pokrenuti, o tome ćemo dalje govoriti.

3. Firmware

3.1. Nekoliko riječi o predskaleru

Prescaler je frekvencijski razdjelnik, prema zadanim postavkama u pločama sličnim arduinu je 128. Maksimalna frekvencija uzorkovanja ADC-a ovisi o vrijednosti ove vrijednosti prema zadanim postavkama, za kontroler od 16 MHz ispada 16/128 = 125 kHz. Svaka digitalizacija traje 13 operacija, tako da je maksimalna frekvencija uzorkovanja pinova 9600 kHz (u teoriji, u praksi ne viša od 7 kHz). Oni. interval između mjerenja je otprilike 120 μs, što je jako, jako dugo. Metak koji leti brzinom od 300 m/s za to će vrijeme preletjeti 3,6 cm - kontroler jednostavno neće imati vremena otkriti činjenicu da metak prolazi kroz optokapler. Za normalan rad potreban vam je interval između mjerenja od najmanje 20 µs, potrebna vrijednost razdjelnika za to je 16. Otišao sam još dalje i koristim razdjelnik od 8 u svom uređaju, to se radi na sljedeći način:

#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); ... )
Stvarna mjerenja intervala analogRead na različitim razdjelnicima:

3.2. Konačna skica

Neću detaljno opisivati ​​kod, već je dobro dokumentiran. Umjesto toga, opisat ću općenito algoritam njegovog rada. Dakle, sva logika se svodi na sljedeće korake:
  • Prvi ciklus - mjeri se razlika između trenutne i prethodne vrijednosti na pinu
  • Ako je razlika veća od zadanog praga, tada izlazimo iz petlje i pamtimo trenutno vrijeme (micros())
  • Drugi ciklus - sličan prethodnom + brojač vremena u ciklusu
  • Ako je brojač dosegao zadanu vrijednost, javlja se pogreška i prijelaz na početak. To omogućuje ciklusu da ne ide u vječnost ako metak iz nekog razloga nije primijetio drugi senzor
  • Ako se brojač nije prelio i razlika u vrijednostima je veća od praga, tada izmjerite trenutno vrijeme (micros())
  • Na temelju razlike u vremenu i udaljenosti između senzora izračunavamo brzinu i prikazujemo je na ekranu
  • Idi na početak
Ovo je vrlo pojednostavljen model; u sam kod sam dodao zviždaljku, uključujući izračun i prikaz energije metka na temelju unaprijed unesene mase metka u kod.

Zapravo, sav kod

/* * Kronograf za mjerenje brzine metka, SinuX 23.03.2016 */ #include #define CLK 1 // Prikazni pin #define DIO 0 // Prikazni pin #define START_PIN 1 // Analogni početni pin #define END_PIN 1 // Analogni završni pin #define START_LEV 50 // Početni prag okidača #define END_LEV 50 // Prag aktiviranje cilja #define TIMEOUT 10000 // Vrijeme čekanja na cilj u mikrosekundama #define BULLET_WEIGHT 0.00051 // Masa metka u kilogramima (za izračun energije) #define ENCODER_DIST 0.1 // Udaljenost između senzora u metrima (10cm = 0.1m) #define SHOW_DELAY 3000 / / Vrijeme prikaza rezultata // Za ubrzavanje analognog čitanja #ifndef cbi #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #endif #ifndef sbi #define sbi(sfr, bit) (_SFR_BYTE(sfr ) |= _BV(bit)) #endif // Servisne varijable int prevVal, curVal; nepredpisano dugo vrijeme početka, vrijeme završetka; TM1637 tm1637(CLK, DIO); /* Prerađena funkcija TM1637::display(), koja vam omogućuje osvjetljavanje pojedinačnih segmenata * Numeriranje segmenata: niski bit - visoki segment, itd. u smjeru kazaljke na satu * Središnji segment je najvažniji bit */ void setSegments(byte addr, byte data) ( tm1637.start(); tm1637.writeByte(ADDR_FIXED); tm1637.stop(); tm1637.start(); tm1637.writeByte( addr|0xc0); tm1637.writeByte(tm1637.Ctrl()); Postavi prescaler na 8 za ubrzanje analognog čitanja ); sbi(ADCSRA); // Inicijaliziraj prikaz poruke setSegments (0, 54); // Main Segments (3, 63); petlja void petlja() ( // Zaslon čekanja showReady(); // Čekanje na početak 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. Primjeri rada

Kada je ispravno spojen, uređaj je gotovo odmah krenuo, jedina otkrivena mana je da negativno reagira na LED i fluorescentno osvjetljenje (frekvencija pulsiranja je oko 40 kHz), pa se mogu pojaviti spontane greške. Ukupno, uređaj ima 3 načina rada:

Pozdrav nakon uključivanja i prelaska u stanje pripravnosti snimanja (zaslon je ispunjen prugama):

U slučaju greške, prikazuje se "Err" i ponovno se prebacuje u stanje pripravnosti:

Pa sam sam mjerio brzinu:

Nakon hica prvo se prikazuje brzina metka (sa simbolom “n”), zatim energija (simbol “J”), a energija se izračunava s točnošću do jedne decimale (na gifu možete vidjeti da kada se pokažu džuli, dvotočka svijetli). Još nisam mogao naći ljepšu kutiju, pa sam samo sve napunio termalnim mlaznicama:

To je valjda sve za mene, nadam se da je nekome koristilo.



Učitavam...Učitavam...