IRDetektor

Když jsem si začal hrát s rozpojovači, ukázalo se, že je důležité vědět kdy jej zvednout. Plošina sice Rosničku nenadzvedne (a už vúbec ne potom, co jsem do ní odlil olověná závaží), ale tření o podvozek je takové, že se prostě nehne z místa. *Proudový detektor* moc použít nejde, je málo přesný a každé vozidlo má jinou vzdálenost vodivého kola a konce skříně; nadto by se takový systém nedal použít na elektricky nevyzbrojené vagony.

Začal jsem experimentovat s IR reflexním dektorem. Asi rok (s letní stavební přestávkou) jsem otravoval všechny elektrotechnicky schopné kamarády, aby mi spočítali pásmový filtr. Uznávám, nemám nárok se počítat mezi slušné lidi když takovou **blbost** nedokážu sám - ale nedokážu. Pro kamarády to byla příliš malá výzva (nebo čistě prozaicky nebyl čas) - každopádně z rad jsem nic kloudného neuvařil.

Proto nakonec vznikl projekt *Optoshield* pro Arduino. Pomocí HW to neumím, ale Arduino Nano a jeho A/D převodník jsou dost rychlé na to, aby generátor pulzů a frekvenční filtr nahradil pomocí software. A navíc jde výsledky přežvykovat tak jak chci, a algoritmus se dá pilovat bez pájení.

Běhěm letní odstávky (stavba chodníku, garážové stání) mně předběhl kolega Šídlo, což mně sice mrzí, ale řešení mám malinko jiné. Aspoň něco - můžete si zvolit dle vlastního uvážení.

### Princip

Optoshield pracuje jednoduše (zhruba): Arduino generuje pulzy pro LED. Pomocí fototranzistorů připojených na analogové vstupy měří úroveň (odraženého) světla a v případě že je více než X, ohlašuje obsazenost na sběrnici S88. Zapojení vyžaduje externí zdroj **7V a více** (kvůli napěťovému regulátoru), LEDky jsou spínané všechny najednou pomocí darlingtonu - **výkon LED** **není omezený výstupním výkonem Arduina**. Ale ukázalo se, že i 20mA je dost na to, aby se úspěšně detekoval odraz od stropu tunelu. Přebytečné nožičky jsou vyvedené na 6pinový konfigurační konektor, pomocí kterého lze **nastavovat citlivost jednotlivých vstupů**. Díky způspbu zpracování měření funguje při **jakémkoliv osvětlení** (denní, žárovka, zářivka, LED), jediný problém je zahlcení fototranzistorum tzn. přímé letní sluneční světlo kolmo na snímač. 40W žárovka 30cm přímo nad snimačem nevadí.

### Zpožděné uvolnění

Při zkouškách jsem zjistil, že při přejíždění senzoru rozsochou nápravy (je-li senzor na vnejší straně kolejnice, mezi pražci), nebo osou nápravy (je-li uprostřed, mezi kolejnicemi) dochází k velkému poklesu odraženého světla až do míry, kdy není odlišitelné od úrovně osvětlení. Bohužel. Proto jsem zavedl ochranný čas pro *uvolnění obsazeného senzoru*. Během dané doby *nesmí* senzor vůbec úspěšně (tzn. několikrát po sobě sejmout korektní stav LED) přijmout odraz; pakliže přijme, zůstává stále obsazený. Dobu lze nastavovat a pokud bude uživatel nad senzorem *přejíždět*, určitě se dá Optoshield zkonfigurovat tak, aby po dostatečně dlouhou dobu pokles signálu ignoroval a mezitím rozsocha (osa) přejede kritické místo.

### Promo: porovnání s IR Šídlo

Kolega Šídlo doufám promine, ale přihřeju si polívčičku. Myslím, že obě naše řešení jsou platná, a minimálně to jeho funguje (moje také, ale zatím není dlouhodobě v provozu). Optoshield je složitější v SW a tím pádem také větší potenciální zdroj chyb. Vyberte si podle uvážení

 Spínání LED
 Rozpoznání

## Návod ke konfiguraci

Konfigurační deska má 3 tlačítka

* OK: přepíná režimy, potvrzuje, ruší
* PLUS: zvyšuje hodnotu (citlivost, prodlevu, ...)
* MINUS: snižuje hodnotu (citlivost, prodlevu, ...)

Na konfigurační desce jsou LEDky, aby se nemuselo koukat pod kolejiště na hlavní desku s Arduinem:

* STATUS: stav vybraného senzoru (svítí = obsazeno)
* ACK: potvrzení stisku tlačítek, zobrazení stavu konfigurace

Tlačítka se drží různou dobu:

* Stisk: krátký stisk
* Dlouhý stisk: mezi 0.5sec a 2sec
* Konfigurační stisk: mezi 2sec a 5sec
* Reset: déle než 5sec

Konfigurace se zahajuje a ukončuje *konfiguračním*(tzn. více než 2 sec) stiskem *OK*. Při zahájení konfigurace 3x dlouze blikne LEDka *ACK*. **Celkový reset** se provede *reset stiskem OK*. Reset a ukončení konfigurace lze provést **kdykoliv**. Během konfigurace **zhasne** integrovaná LED Arduina. LED **STATUS** na konfigurační destičce ukazuje stav právě vybraného senzoru (svítí = obsazeno, nesvítí = volno).

Postupně se:

* vybere senzor (dlouhé bliknutí *ACK*)
* nastaví citlivost (2x bliknutí *ACK*)
* nastaví prodleva uvolnění (*ACK*blikne 2x krátce, 2x dlouze)

mezi jednotivými kroky přecházíme *stiskem OK.* Hodnoty (číslo senzoru, ...) se zvyšují *stiskem* tlačítek *Plus, Minus*. *Dlouhý stik OK* obnoví původní nastavení hodnoty a ukončí práci se senorem (opět se vybírá senzor), *ACK*blikne *dlouze*. Po potvrzení prodlevy se opět volí senzor atd.

### Nastavení citlivosti

* stisk +/- mění hodnotu o 1 (*ACK* blikne krátce)
* dlouhý +/- stisk mění hodnotu o 10 (*ACK*blikne dlouze)
* *konfigurační* stisk +/- nastaví hodnotu na dolní resp. horní hranici
* *konfigurační* stisk *OK* **a zároveň** stisk dalšího tlačítka zahájí kalibraci (viz dále)

### Nastavení prodlevy

* stisk +/- mění hodnotu o 20ms (*ACK* blikne krátce)
* dlouhý +/- stisk mění hodnotu o 100ms (*ACK*blikne dlouze)
* *konfigurační* stisk +/- nastaví hodnotu na dolní resp. horní hranici

### Kalibrace

Při kalibraci se nejprve změří úroveň osvetlení bez překážky, následně s překážkou (vozidlem nad senzorem). Před zahájením kalibrace **nejprve** odstraňte vagonym **pak** stiskněte *OK* (2-4 sec) **a zároveň** krátce jedno z tlačítek +,-. LED *ACK* blikne dlouze a pak 1 krátce a následujících 10 sekund se měří úroveň "bežného" osvětlení. Na konci měření LED *ACK* blikne 1 dlouze a 2x krátce.

Nyní umístěte vagon nad senzor, stiskněte *OK*a přejíždějte jím tam a zpět, aby se změřil odraz na všech místech podvozku. Měření trvá 10 sec. Na konci měření blikne *ACK*2x dlouze a 1 krátce. Následně můžete "ručně" doladit hodnotu viz "Nastavení citlivosti" a potvrdit *OK.*

## Popis zapojení

Celá deska je postavena na **Arduino Nano**. Pozor, **nejedná se** o Arduino Pro Mini !! Součástky jsou běžně k dostání, pouze pozor na regulátor - ve schématu mám uveden špatný typ (nemám v knihovně správný). Má být **78S05**, aby utáhl všechny LED najednou. Jako IR diody jsem použil L-7104F3C (GME-511-974) nebo L-934F3C(GME 511-503), průměr 3mm (vejde se mezi pražce). Fototranzistory jsou L-93DP3BT (GME 520-068), ale doporučuji spíše LL-304PTD4B-1A, který má selektivní pouzdro.

Regulátor slouží čistě pro napájení LED, vstupní napětí by mělo být alespoň 7V. Arduino **žádnou ochranu nemá**.

#### Zapojení pinů pro konfigurační destičku (konektor CTRL)

Pin 1 je u konce desky Arduina, směrem k vstupu napájení.

 2
 3
 4
 5
 6

#### Zapojení pinů jednotlivých senzorů

 2
 3

**Pozor, konektor J8 je jinak stranově obrácený než ostatní !**

## Rozpis součástek

### Konfigurační deska

 LED1
 LED2

### Čidla

 LED
 T1-T8

Poznámka: Fototranzistory je lepší kupovat v TME, mají 3mm se selektivním pouzdrem.

### Algoritmus podrobněji

Podrobnější algoritmus je složitější. Arduino ví kdy je LED zapnutá a kdy ne. Měří se, že snímač detekuje **správně** zapnuto/vypnuto (tedy ne jen, že vezme *nějaké* světlo, ale musí to být právě to, které rozsvěcí Arduino). Chybná detekce významně snižuje celkovou váhu měření. Po několika **po sobě jdoucích** správných detekcích se snímač bere jako *obsazený*. Úroveň osvětlení se měří vždy 7ms na všech vstupech: Provede se 5 měření na jednom vstupu takovou rychlostí jak A/D převodník stíhá (a to **není**standardních 20ms); pak se změní vstup a *2 měření se zahodí* kvůli možné nestabilitě měřícího kondenzátoru. Převodníku jsem změnil hodiny na **500kHz**, takže měří skutečně rychle, po měření generuje přerušení a jeho obsluha uloží data pro zprůměrování. Drobné nepřesnosti nevadí. Měření se opakuje dokolečna v rámci přerušení; po 7ms si průměrované výsledky převezme hlavní algoritmus. Jelikož se po cca 7ms (+ režie) mění stav LED, zatímco (předpokládám napájení 230V / 50Hz) žárovka má periodu 10ms, sejdou se jen zřídka. Ve výsledku se během tech 7ms několikrát senzory objedou dokolečka, takže průměrování má i nějaký význam.

Většína konstant a nastavení, pokud nejdou konfigurovat rovnou, je ve sketchi deklarovaná jako *const int*, zejména počáteční hodnoty prahových hodnot a prodlev. Změňte je podle potřeby.

## Soubory ke stažení

Projekt má zdrojové texty, vč. eagle souborů pro jednotlivé desky na Githubu. Poslední verze ke stažení je 1.0-alpha