Dobrá zpráva: Vzdálenost změříš tak, že vyšleš signál a změříš, za jak dlouho dojde. Tento rozdíl časů poděliš rychlostí signálu a máš vzdálenost.
Špatná zpráva: signály chodí dost rychle, takže musíš přesně změřit hodně krátké časy.
Buď musíš mít
přesně synchronizovaný čas, což asi není jednoduše a levně realizovatelné, nebo se musí vysílač s přijímači dohodnout, kdy ten signál vyšle.
Máš dvě možnosti:
- přijímač pošle žádost a vysílač s definovanou a zaručenou dobou odezvy odpoví
- vysílač pošle upozornění jedním kanálem a signál druhým kanálem, přijímač změří rozdíl doby a vzdálenost dopočte - ty kanály musí mít různou rychlost, protože se to počítá z rozdílu těch rychlostí
Čím pomalejší signál, tím větší přesnost, protože stejná chyba v času znamená menší chybu ve vzdálenosti. Takže nejpomalejší rozumný signál je zvuk.
Druhý kanál (pokud je použit) zase je třeba co nejrychlejší, protože čím bude rychlejší, tím bude větší rozdíl doby přijetí a zase stejná chyba v čase znamená menší chybu ve vzdálenosti. Ideální je elektřina po drátě (rychlost světla a použití interruptu pro příjem), nebo světelný záblesk (kde musíš pořešit rušení), nebo wifi či jiné rádio, kde máš často netriviální dobu zpracování informace.
Takže pokud si to můžeš dovolit, tak drát a zvuk, pokud ne, tak světlo či radio a zvuk.
Drát a zvuk - kablík, ideálně známé a konstantní délky (např. těch max 10m) se dvěma vodiči - společná zem a signál, signál přivedeš na pin 2 (který umí generovat přerušení, nebo na jiný s touto schopností), u vysílače reproduktor/piezzo, u přijímače mikrofon.
Vysílač vyšle signál do drátu a s danou pauzou (aby to přijímač stíhal) signál do repráčku.
Přijímač dostane interrupt, v něm nastaví měření na pinu od mikrofonu a zapne čítač (to je ta doba, co mu vysílač musí poskytnout na "vzpamatování se") Jakmile zachytí signál, uloží si čas, odečte případnou konstantu, vydělí čas rychlostí a uloží do volatile proměnné. Nastaví do další volatile proměnné příznak, že bylo změřeno. Hlavní smyčka když uvidí příznak přečte ihned vzdálenost a příznak smaže. (ještě lepší varianta - interrupt místo dálky zapíše jen čas, hlavní smyčka bude plácat cykly na odčítání a dělení - nebude tak dlouho zablokovaný výpočet a ostatní interrupty).
Reverzní situace: přijímač nastaví měření, pošle signál po drátě, vysílač v interruptu jen pošle signál do reproduktoru a opustí interrupt, přijímač přečte odezvu, odečte od ní všechna konstantní zpoždění a vydělí rychlostí.
Problémy: Rozeznat zvuk - ideální je asi hlasité, krátké lupnutí následované ještě několika dalšíma s definovanými různými odstupy, po přijetí prvního signálu se počká ješte na druhý, třetí ... a poměří se odstupy, pokud přibližně sedí, byl signál zachycen, pokud nesedí, je v místnosti rušení (hluk, ozvěny, ..) a je potřeba nové měření. Mikrofon musí mít nastavené správné zesílení, aby signál slyšel, ale pokud možno neslyšel hluk.
Hyper vychytávka: navzorkovat údaje od mikrofonu, poté vzorek odečíst a hledat signál ve výsledku (sází se na to, že za tak krátkou dobu se hlasité jevy nezmění, 10m zvukem ~ 1/30 sec, většina tónů zní déle a netrefíš se do hrany.
Hyper vychytávka 2: Odeslat sérii lupnutí s danou frekvencí, číst se 4 násobkem té frekvence a odčítáním vyfiltrovat tento signál
http://petr-kubac.blog.cz/1212/sonary-1 ... ne-nedelat
http://petr-kubac.blog.cz/1212/sonary-2 ... le-spravne
U světla a rádia je potřeba nejdřív "navázat spojení", tedy ujistit se, že přijímač rozpoznal návěst od hluku a teprve pak poslat ten signál. Opět jde uplatnit Hyper vychytávka 2 a počítat čas od skončení návěsti (protože nevím, kolik té návěsti jsem promeškal, než jsem začal reagovat).
Konstanty pro zpoždění lze spočíst z taktů procesoru a počtu instrukcí (a získat přesné hodnoty), nebo prostě provést sérii měření na různě vzdálenosti, výsledky proložit přímku a z jejích hodnot zpětně ty konstanty pro zpoždění a rychlost dopočíst (čímž se kompenzuje špatná frekvence krystalu a podobné poruchy, výsledek je přibližný, ale postup je jednoduchý a rozumná přesnost se dosáhne snadno taky)
Pokud je přijímačů málo a měření není moc časté (vhledem k délce procesu) je lepší, když si přijímače říkají o vyslání signálu a v případě potřeby / kolize měření opakují. Interval s jakým to činí by měl být náhodný (aby se pořád nepotkávaly) a měly by být ošetřeny kolize (když si dva přijímače "řeknou" skoro naráz, tak ten druhý čte odezvu na toho prvního a je rázem "někde nedefinovatelně blíž zdroji" (neb ten začal odpovídat ještě před dotazem).
Takže ideálně udělat baterii třeba 6 měření s náhodnými odstupy (řádově (2..4)*(počet přijímačů)*(celková doba měření i s návestím a vším okolo)), vyřadit měření zjevně vybočující z řady a zbylá zprůměrovat, nebo vybrat z nich to s prostřední hodnotou.
Taky vyřadit zjevně nesmyslné hodnoty (záporné vzdálenosti a vzdálenosti větší než tělesová úhlopříčka pokoje).
Přeji spoustu zajímavé zábavy pro dlouhé zimní večery ...