_@¡ použijte menu „FILTROVAT TÉMA...“ pro výběr

Časomíra pro hobby horse...

 Časomíra pro závody (stop-watch)

Zadání

Měřit přesně čas závodu. Závodník může vyběhnou, kdy sám chce, 

časomíra začne počítat, až doběhne do cíle, časovač se zastaví.


časy v sekundách a milisekundách např. 10,567 sec


Základ: měřit závod typu člunkový běh, tedy start a cíl jsou v jednom místě.

Celé by to mělo fungovat z baterie v interiéru i venku na přímém slunečním světle.


Detekce


? Tlačítko, které si závodník třeba nohou zmáčkne, jak vybíhá?

? Tenzometr - nášlapná plocha, která snímá váhu - jak na ni závodník šlápne, spustí odpočet.

?

Kdyby to byla optická brána, tak musíme řešit druhou stranu - přijímač / vysílač - třeba laser.

Chceme mít jenom jednu stranu, která měří do určité vzdálenosti. 

START =  CÍL

Třeba detekce na 80-100cm maximálně.

Použijeme dva druhy detekce - ultrazvuk a světlo.

KISS rulez!

Je to jednoduché, pochopitelné a pro nás reálně využitelné.


Zkratka přístupu KISS pana Kell Johnsona se rozepisuje jako:

- Keep it simple sir

- Keep it simple and simple

- Keep it simple and straightforward

a to obvyklé nemám rád, je příliš vulgární Keep it simple, Stupid!


podrobně popsáno

https://cs.wikipedia.org/wiki/KISS


  • Rozdělit problém na spoustu menších problémů a vyřešit je zvlášť.

  • Vyřešit tyto malé úkoly nesmí trvat déle než 4–12 hodin.

  • Nejdřív si to rozmysli a pak to nakóduj.

  • Snaž se udržet řešení co nejjednodušší

(ANO) Ultrazvukový senzor (HC-SR04)

https://www.handsontec.com/dataspecs/HC-SR04-Ultrasonic.pdf

na Trig pošleme 10uS puls, to způsobí odeslání sekvence, na pinu Echo měříme dobu změny stavu. 

Rychlost zvuku známe, vypočítáme vzdálenost - nezapomout vyslaný pulz letí k překážce, odrazí se a zase letí zpět do detektoru.

Detekce není na 100% protože oblečení = členitý povrch závodníka může ovlivnit detekci. 


(ANO) Infračervené měření vzdálenosti (GP2Y0A02YK0F)

funguje i venku na přímém slunečním světle

přesnost 1mm


https://www.sparkfun.com/datasheets/Sensors/Infrared/gp2y0a02yk_e.pdf

Je to analogový senzor - analogový výstup dává napětí, které odpovídá vzdálenosti.

Nás to zajímá někde od 500mV do maxima.

(NE) Laserový senzor doby letu (VL53L0X)

ToF Time of Fly senzor. Rozhraní I2C.

Přesnost 1mm.

Sluneční světlo ovlivňuje měření. Venku nefunguje.

https://www.st.com/resource/en/datasheet/vl53l0x.pdf


Senzor reálně mám, je funkční, ale není vhodný pro tuto konkrétní  aplikaci. Kdybyste si chtěli pohrát, rád zapůjčím.

(NE) Laserová detekce překážek (PT1301)

funguje venku na zhruba 20cm, což je pro nás málo, ale hlavně už to je to příliš drahý modul (15€).

https://www.waveshare.com/wiki/Laser_Sensor


Senzor reálně mám, je funkční, ale není vhodný pro tuto konkrétní  aplikaci. Kdybyste si chtěli pohrát, rád zapůjčím.

Displej

potřebujeme zobrazit 

min - sec - miliseconds

malý segmentový displej řízený MAX7219

Pro malinké řešení


velký maticový displej řízený MAX7219 

Velký displej, bude mít 8 částí = 64x8 pixelů

pro velké řešení


budeme používat tento velký displej?

Cena takového displeje je asi 2×140 korun.


Dodržujeme KISS přístup !!

Odladíme to pro segmentový malý displej a vyvedeme možnost připojení externího zobrazovacího zařízení. Jen displej a procesor, který zobrazí READY nebo aktuální čas a v cílový čas. Řízený hlavní časomírou. Tím nemusíme ladit dva programy časomíry s různými dispeleji.

Realizace

Loni jsme to testovali a bylo to tak na 70% úspěšné. Tři z deseti závodníků to nerozpoznalo. Byl pouze ultrazvuk a detekce někdy neproběhla. Chyba byla v pomalém měření (běželo to asi na 7Hz), ukázalo se že 7 měření za vteřinu bylo málo.


MCU, displej, ultrazvukový modul, infra měření vzdálenosti

a tlačítko pro nové měření - píše READY


Pokud jeden senzor vyhodnotí detekci, spustí odpočet.

tlačítko 

řešit debouncing - něco víc o tlačítku a zákmitech

alespoň INPUT_PULLUP a kondenzátor 100nF


(Wire) ATmega328P

Arduino Nano R3 stojí cca 150 korun.

Důležité

Celá smyčka loop() se musí zopakovat, co nejrychleji - víc opakování udělá víc měření! Tedy každý věc, která zbytečně zdržuje je problém

kompletní program

online k náhledu i kompilaci

https://app.arduino.cc/sketches/c61f1bb9-2ddb-4a6e-8519-bb72a3b730a5?view-mode=preview

záloha na google drive

pomalý digitalWrite | digitalRead

Umíme nejméně 10× rychlejší přístup na piny.

Na některé aplikace bude digitalWrite, tak jak je zapsaný v arduino.h knihovně prostě pomalý. Řešení je v přímém zápisu do registrů procesoru, což je poněkud nepřehledné. Proto použijeme knihovnu

#include <digitalWriteFast.h> https://github.com/ArminJo/digitalWriteFast

Více o tom, jak zrychlit digitalWrite | digitalRead viz ATmega328P a rychlý digitalWrite|digitalRead. 

Segmentový displej řízený MAX7219

MAX7219 komunikuje po SPI. Něco víc a podrobněji o SPI.

Realizace

Komunikace SPI s využitím vnitřní periferie MCU (hardwarové SPI). 

Pozor! Návod třeba na dratek.cz je pouze orientační. Je třeba číst dataheet.


Program, ovládání a test viz modul segmentový displej s MAX7219.

Problémy, které bylo potřeba vyřešit

vlastní implementace SPI komunikace

Knihovna #include <LedControl.h> https://github.com/wayoda/LedControl je implementace softwarového SPI; může fungovat na různých pinech, ale vždy bude pomalá 

Proto budeme komunikovat s MAX7219 po SPI přímo (případně si můžeme vytvořit vlastní rychlou knihovnu).

podrobněji  o modulu segmentový displej s MAX7219 a vlastní knihovna pro ovládání.

parazitní kapacita vedení

Snadno se stane, že komunikace někdy proběhne, někdy neproběhne nebo se chová na první dojem nedeterministicky - příčinou je mnohdy špatná hrana komunikačního signálu. Vedení má nějakou nezanedbatelnou kapacitu. Proto dochází k překmitu (overshoot)  hrany signálu.


rychlost komunikace 16MHz, zda např. délka pulsu 120ns

krásně se to dá řešit rezistorem v sérii se signálovou linkou - rezistor + kapacita vedení se chová jako dolní propust (low--pass filter). A protože víme, že obdélníkový signál je nekonečným součtem lichých harmonických, tak náběžná hrana je tvořena právě harmonickými s nejvyšší frekvencí. A ty nám low-pass filter nepustí.


Rezistor 100Ω v sérii zpomalí náběžnou hranu a ořeže překmit.


SPI.beginTransaction(SPISettings(16000000, MSBFIRST, SPI_MODE0));

rychlost 16MHz je zbytečně moc, standard je ¼ hodinové frekvence - pro ATmega328P = 16/4 = 4MHz


u SPI může nastat problém se šumem MISO, který může vzniknout, když budou všechna slave zařízení v z-stavu vysoké impedance (odpojená od sběrnice) - řesí se pull-up rezistorem na MISO (4k7 - 10k)

pro prevenci rušení a problémů dáváme pull-up rezistory 10k na všechny komunikační linky SPI, které používáme (MOSI / SCK / CS)

Ultrazvukový senzor

Realizace

Tento text nebudu dál plevelit a dám se pouze finální výstupy.

Podrobnější dokumentaci nechám zvlášť viz dokument HC-SR04

Problémy, které bylo potřeba vyřešit

Senzor má vysílač a přijímač. Běžně se tento senzor používá tak, že vysílač na pinu TRIG pošle 10μs a čeká se, než se puls vrátí do přijímače na pine ECHO.

Rychlost zvuku - je asi 340ms, rychlost našeho ultrazvuku je asi 350 m/s.. 

Na první pohled je docela rychlý 1260 km/s = 350 m/s jenže to je

=  35 000 cm/s, což bude za 1ms pouze 35cm ! Pokud chci měřit ultrazvukem vzdálenost třeba 105cm. Tak ultrazvuk poletí 3ms tam a 3ms zpět. To je 6ms než můžeme detekovat překážku ve vzdálenosti 105cm.

Program nemůže poslat 10μs = 0,01ms a pak stát a čekat 600× déle jestli se mu nevrátí puls zpět.

Takže řešení je poslat puls a v programu pokračovat dál.

ECHO pin je připojený na pin D2, kde je nastaveno přerušení, které číhá na změnu hrany signálu (CHANGE).

Program tedy může běžet dál a pokud je detekován v přijímači signál, tak přerušení nastaví stavovou proměnnou, že bylo naměřeno. 

A náš program tedy běží tak, že pošle puls a běží dál - jen občas zkontroluje, zda nebylo již naměřeno něco ultrazvukem a pokud ano, odečte vzdálenost.


Měříme ultrazvukem celkem 3× a měření průměrujeme, abychom se vyhnuli náhodným falešným detekcím.

Frekvence měření včetně průměrování ze tří měření je 23Hz. Tedy 23× za vteřinu zkontrolujeme, zda není něco blíž než jeden metr od senzoru.


Úvaha – limitní případ

Nejrychlejší člověk na světě běžel rychlostí 42,7km/h = 11,861 m/s = 1186,1 cm/s = 1,1861 cm/ms. Takže asi 1,2cm/ms. Detekujeme se vzorkovací frekvencí 23Hz, tj 43.4ms na jedno měření. To se nám nejrychlejší člověk posune o 51,6cm. Měříme na vzdálenost jednoho metru senzorem, který má podle datasheetu detekční úhel 30°


Detekujeme na vzdálenost jednoho metru. Úhel detekce je 30°.

Jakou maximální délku detekčně vykryjeme?


Pevně věřím, že tohle je tak easy spočítat, že byste se na tom nezasekli. Matematika konce základní školy. Součet úhlú v trojúhelníku je 180°. Známe tedy tři úhly a délku jedné strany.


Spočteme.




Takže detekujeme maximální délku 115,5 cm (2× délku c)

Nejrychlejší běžec světa nám to proběhne za 115,5 / 1,1861 = 97,37ms. Za tu dobu ho s jistotou nejméně 1× změříme. Neunikne! Tedy pokud bude třeba v kožichu a ultrazvuk se odrazí špatně, tak se detekce nepovede.

A proto máme další senzor.

Infra měření vzdálenosti

Realizace

Výstup GP2Y0A02YK0F je připojen na analogový pin A0. Senzor vrací napětí 0 – 2.3V podle vzdálenosti objektu.

Potřebujeme vědět, alespoň rámcově, jak funguje analogRead() a proč ADC převodník potřebuje nějaký přesný zdroj známého napětí - říkáme, že potřebuje napěťovou referenci.


Nastavíme VREF na 1.1V

analogReference(INTERNAL);  //1.1V

Někde kolem 512 je objekt ve vzdálenosti 100cm až 1023 … jak se přibližuje.


Proč měnit VREF 1.1V?

Má to dva důvody. 


ad 1) V základu je VREF nastaveno na 5V. analogRead() vrátí 0 pro 0V a 1023 pro 5V. Potřebujeme detekovat někde od 1 do 2.3V, tím bychom si hodně ztížili detekci a přesnost. Snížením na 1.1V máme rozsah 0 pro 0V a 1023 pro >= 1.1V


ad 2) VREF na 5V může hodně plavat s napájecím napětím… chybí jakákoli přesná reference. Můžeme použít externí napěťovou referenci nebo interní, která přesná a má 1.1V


víc o přesnosti VREF a další měření

vliv teploty na stabilitu napěťové reference 

např. velmi přesná reference je TL431 z roku 1977 – chová jako nastavitelná zenerova dioda – ale je to docela drahá součástka (THT za 8Kč, SMD za 6Kč)


Analogový napěťový signál je zatížen zvlněním a nepřesnostmi, řešením bude průměrovat výsledek třeba z deseti měření.

Problémy, které bylo potřeba vyřešit

7× rychlejší analogRead viz zrychlení čtení analogového pinu 


Při rychlém analogRead a průměrováním z deseti měření máme měření se vzorkovací frekvencí 1kHz. Takže nám neuteče nic – tedy v případě, že se paprsek správně odrazí. Což se může stát, když místo dokonale odrazivých krabic nám tam budou běhat vlající členité objekty.

(Python) RP2040

Raspberry Pi Pico 119Kč bez WIFI, za 139 je i s WIFI. A to by se pak daly dělat věci.

pro Raspberry Pi Pico - procesor je dvoujádrový, mohli bychom využít obě jádra

(Céčko) CH32V003

do nějaké produkční verze bych zkusil tento procesor od firmy jejíž jméno neumím přečíst – Nanjing Qinheng Microelectronics. Stojí pár centů a mohl by nám výrazně snížit náklady.

  • procesor za 2,50 Kč

  • kompletní hotová vývojová deska s USB-C a krystalem je asi za 50Kč (podobná třeba Arduino Nano)

Jednoznačně bych osadil na desku přímo procesor. Má v sobě RC oscilátor. Dá se připojit krystal. Změříme přesnost, uvidíme.

Tohle by bylo velmi NICE TO HAVE a asi tím i začnu, aspoň budu mít, co kódit pro tento procesůrek.

PCB – deska plošného spoje

Napájení z baterie (nebo alespoň z powerbanky /  z mobilu).

Schéma a návrh plošného spoje

Použitý program Circuit maker = Altium 365 (zdarma pro hobby použití)

online - schéma, plošný spoj, 3D náhled

https://365.altium.com/files/40D47AC6-CB21-46BA-AF72-644B0FDF0A74


pouze schéma

https://drive.google.com/file/d/1yCf8i7ncHCmBze6s1Aw_X1NGRE6QpzW0/view?usp=sharing


předloha pro osvit

https://drive.google.com/file/d/1_yztDxfOLKfjVs5c4uPe2QnfAoadx_CG/view?usp=sharing


výroba plošného spoje - nahřátí UV lampy 12min - osvit 12min

vyvolání předlohy - 10g hydroxidu sodného (NaOH) na 400ml vody - možno otírat jemný štetcem

leptání v chloridu železitém (FeCl3) - příště použijeme persíran sodný (Na2S2O8)



Krabička 3D tisk

Aby to i nějak vypadalo

Test v reálném prostředí


Výstupy z testu

Jedním slovem – úspěch.


Senzory musí vidět, co největší část závodníka - umístění senzoru ve výši kolen nebylo zcela spolehlivé. Umístění ve výši hrudníku mělo 100% záchytů. Většinu spuštění udělal infrasenzor, výjimečně něco zachytil i ultrazvukový senzor. Je tedy nezbytné, používat oba senzory. 

A co dál? 

Komunitní sdílení

Všechny výstupy zveřejníme, ať si to třeba může postavit i někdo jiný.

Nabídneme to školám a kroužků, když to nebude stát nesmysl na běžný člunkový běh by to mohlo posloužit dobře.

Vypustil bych to ven komplet ve stavu, ať si to každý, kdo může vyrobí sám.

Rozpočet na verzi s baterií

materiál 618 korun

Arduino Nano R3  ………………… 150

displej segmentový MAX7219  ….. 44

infra senzor GP2Y0A02YK0F ……. 99

ultrazvukový senzor HC-SR04 …… 38

součástky

(rezistory, kondezátor, 

tlačítko, vypínač) …………………… 20

fotocitlivá deska (100×75mm) ……. 49

tištěná kompletní krabička ………… 60

baterie 18650 + uložení baterie 

na plošný spoj ……………………… 120

nabíječka baterie TP4056 USB-C … 14

step-up měnič MT3608 ……………. 24

desky vyleptáme, vyvrtáme, osadíme, oživíme

pokud by se toho mělo dělat 200 kusů, tak bychom si desky nechali vyrobit


Nice to have

  • Záznam na SD kartě všech měření - jestli oba senzory detekovaly. Mohlo by posloužit do budoucna, že by třeba zůstal pouze jeden senzor. Sbírat data.

  • Zobrazení stavu baterie při zapnutí. Displej máme, tak ho používejme.

  • Možnost spárovat dvě zařízení, aby jeno bylo START a druhé CÍL. Bezdrátově propojeno - na 433MHz nebo 868MHz. 

    • Nastaveno tak, aby mohlo být až 10 zařízení ve startu a v cíli a vysílače se nerušily se navzájem =jednoduchý komunikační protokol mezi zařízeními.

    • Totéž propojeno po internetu bez ohledu na vzdálenost - třeba přespolní běh.

  • Místní webserver na WIFI, přístupný z mobilu. Závodníci se identifikují číslem nebo pípnou RFID kartu. Vyhodnocení výsledků v reálném čase. Velká TV, na které běží výsledky závodu. Lidi se mohou sami dívat v mobilu…

a další a další kravinky.