Multispektrální světelný senzor pro Arduino: prvek pro lepší rozlišení

20. 1. 2021
Doba čtení: 6 minut

Sdílet

 Autor: Depositphotos
Minule jsme měřili nanoampéry a sestrojili testovací obvod. Dnes přidáme logaritmovací prvek, který vylepší rozlišení. Funguje jako analogový počítač – matematický koprocesor, který počítá logaritmus.

Na konci obvodu se proud pustí do logaritmovacích diod vyrobených z tranzistorů. Ty fungují jako analogový počítač – matematický koprocesor, který počítá logaritmus. Jejich napětí jde do vysokoohmového ADC vstupu Arduina.

Referenční vstup Arduina kompenzuje teplotní drift

Použijeme biomimetický přístup: lidský mozek nebo tělo nepoužívá malé množství kvalitních senzorů nebo výpočetních elementů, ale větší množství levných, a jeden z nich vykompenzuje druhým.

Proto namísto, abychom konstruovali nějaký sofistikovaný obtížný logaritmovací prvek, který je nezávislý na teplotě, vezmeme dva identické, které trpí silným teplotním driftem. Závěrný proud diody IS driftuje silněji než tepelné napětí VT a to v opačném směru. Drift je tak silný a predikovatelný, že se tranzistor používá jako teploměr. Čili náš analogový výpočetní prvek je takový bizarní kombinovaný teploměr/matematický koprocesor, a podle toho, jak ho zapojíme, se chová buď jako teploměr, nebo jako matematický koprocesor, nebo jako obojí dohromady. A genialita Arduina spočívá v tom, že nám umožní externím referenčním napětím tento prvek použít jako čistý matematický koprocesor, a ještě sdílet pouze jedno referenční napětí pro všechny kanály. Takže pokud stavíme osm kanálů, potřebujeme pouze devět prvků.


Schéma zapojení jednoho optického kanálu a kanálu generátoru referenčního napětí. Když vidíme, že všechny kanály fungují, zapojíme logaritmovací diody vyrobené z tranzistorů a voltmetr nahradíme sadou voltmetrů turingovsky ekvivalentně programovatelných - analogovými vstupy Arduina.

Třítranzistorová zesilovací kaskáda bude potřebovat 3×0,7 V=2,1 V. Vstupní LED může bez problému pracovat s nulovým závěrným napětím, má to dokonce tu výhodu že přitom bude mít nulový temný proud. To by jinak musela fungovat jako jakési perpetuum mobile, že bychom jí zkratovali vývody a ona by pořád ve tmě generovala proud který by vývody cykloval dokola. Vstupní tranzistor také může pracovat, když báze a kolektor jsou na stejném potenciálu, saturace ještě nenastane. Takže nám zbývá 5 V – 2,1 V = 2,9 V na referenční napětí. Opět si z něj vezmeme 3 × 0,7 V = 2,1 V a zbylých 0,8 bude rezerva na odpor 820Ω, který zamezí zničení součástek vysokým proudem při posvícení laserem přímo do detektoru.

Na logaritmovací obvod tedy použijeme 3 diody vyrobené z tranzistorových přechodů báze-emitor. Mají nižší svodový proud než diody obyčejné, a tak budou správně logaritmovat i při nízkých proudech. Přechody báze-emitor mají vyšší dopředné napětí, z diodové rovnice plyne že budou mít nižší svodový proud než přechody báze-kolektor. Ale kolikanásobně?

Použijeme nízký proud 2 mA, aby se diody proudem neohřívaly a kalibrace se po zapnutí přístroje neposouvala. Pokud chceme extra odolnost na 3 krát silnější světlo, všechny odpory můžeme nahradit např. 3 krát menšími, zařízení ale bude více náchylné na efekt ohřívání. Všechny DIY diody také musí být na stejném místě, aby neměly rozdílnou teplotu.

Zde můžeme použít i PNP tranzistory. Spojíme B a C stejně. Jen výsledné diody zapojíme do obvodu obráceně.

Firma Microchip nám zpracovala krásnou aplikační poznámku, že podobný tranzistor 2N3904 má faktor ideality 1,004, tedy prakticky 1. Minule jsme změřili na emitorových napětích multimetrem větší napětí než na kolektorových. Z Shockleyho diodové rovnice vidíme, že když přechod emitoru ukazuje při testování proudem 1 mA napětí o 29–51 mV vyšší, argument exponenciály se zvýší o 1,11–1,96 a exponenciála se zvýší e1,11-e1,96 krát čili 3–7 krát. Emitor bude mít tedy svodový (závěrný) proud 3–7 × nižší než kolektor.


Shockleyho diodová rovnice vyřešená pro IS. IS je svodový proud diody. VD je napětí na diodě, když ji měřák testuje proudem 1 mA.

Ve tmě měl senzor (zelená LED) výstupní proud 3.3 nA. Vyčištěním LED a tranzistorů lihem a vysušením jsem ho snížil na 1.8 nA. Zesílení těchto tranzistorů jsem při nízkých proudech v řádu nanoampér změřil jako zhruba 40. Odpovídá to tedy temnému vstupnímu proudu zhruba 30 fA (femtoampér je 10-15 A).

Rozlišení

Ze Shockleyho diodové rovnice plyne, že na jedné logaritmovací diodě vyrobené z tranzistoru, pokud proud stoupne e-krát (2,718… krát), napětí se zvýší o 26 mV. Referenční napětí je 3×0,7 V=2,1 V. Do toho rozsahu se vejde asi 1024 kroků ADC. Jeden krok ADC bude mít napětí 2,1 V/1024=2,05 mV. Těchto 2,05 mV se na 3 logaritmovací diody rozdělí tak, že na jednu diodu připadne 2,05 mV/3=684 μV. 684μV je 1/38 z 26 mV. Proudový krok (násobkový krok proudu) bude tak 38. odmocnina z čísla e neboli e1/38 = 1,027.

Čili zvýšení čísla 0–1023 čteného z ADC o jednotku odpovídá zvýšení světla (přicházejícího počtu fotonů za sekundu) o 2,7%. Máme-li 8-bitovou fotku se standarní gamma 2,2, rozdíl mezi hodnotami pixelu 255 a 254 je 0,9%, mezi pixelovými hodnotami 128 a 127 je 1,7% a mezi 64 a 63 je 3,5%. Takže náš senzor má o něco hrubší krok než osmibitové PNG, ale má zase obrovský dynamický rozsah. Jaký?

  • Napětí na 3 diodách je 2,1 V, napětí na odporu reference 5 V – 2,1 V = 2,9 V.
  • Proud skrz 1,5 kΩ je 2,9 V / 1,5 kΩ = 1,93 mA
  • e1024/38=5,05×1011
  • 1,93 mA / 5,05×1011=3,8 fA

Plný dynamický rozsah 10 bitů nevyužijeme, spodní hodnota proudu je daná temným výstupním proudem senzoru který je 1,8 nA. Poměr maximálního a minimálního proudu je tak 1,93 mA : 1,8 nA což je 1 072 222 : 1. Můžeme jej srovnat s dynamickým rozsahem jiných situací v tabulce:

Situace Dynamický rozsah
Lidská sítnice 100 : 1
8-bit PNG gamma 1,0 255 : 1
16-bit PNG gamma 1,0 65 535 : 1
8-bit PNG gamma 2,2 196 965 : 1
Náš senzor 1 072 222 : 1
Náš senzor bez omezovacího odporu 100 000 000 : 1
16-bit PNG gamma 2,2 39 400 000 000 : 1
Lidské oko vč. adaptace na tmu 100 000 000 000 000 : 1

ln(1 072 222)=13,89. A vynásobení základem přirozeného logaritmu e odpovídá 38 jednotek ADC takže celkový rozsah je 13,89×38=528 kroků z celkových 1024 kroků ADC. Čili využíváme efektivně pouze 9 bitů z 10.

Pokud by maximálnímu proudu odpovídal přímý svit slunce do senzoru (což mi přijde že zhruba odpovídá), minimální proud by odpovídal 100 000 lx / 1 072 222 = 0,093 lx, což je slabší svit úplňku.

Multispektrální zapojení

Obvodů vyrobíme několik, s různými LED. Budou mít vlastní omezovací odpory, ale referenční větev bude jen jedna. Že některé barvy LED budou dávat výrazně nižší proudy je normální, je to dané rozdílnou chemií LED.

Arduino má 6 analogových vstupů, verze s ATmega328P SMD a ATmega168 SMD mají 8 vstupů. Můžeme mít tedy podstatně více spektrálních kanálů než běžná kamera, která má pouze 3 – R, G, B. Teoreticky bychom měli být schopni rozeznávat povrchy, které lidskému oku přijdou, že mají stejnou barvu, ale ve skutečnosti mají jiné spektrum (metamerizmus).

Po zapojení a otestování multimetrem můžeme Arduinem do PC zalogovat množství ukázkových dat. Navzorkujeme rozmanitá data z různých zdrojů světel, nebo z různých povrchů osvícených nejlépe obyčejnou nebo halogenovou žárovkou, denním světlem nebo sluncem. Tyto zdroje světla mají kvalitní spojité spektrum. Uložíme ve formátu CSV – textové sloupce přirozených čísel přímo z ADC oddělené tabulátory. Nasnímáme také stejný předmět při různých silách osvětlení (např. posuvem světelného zdroje dál nebo blíž), aby byla rozmanitější data pro analýzu hlavních komponent. Rozdíly citlivostí LED a zesílení tranzistorů se budou v ideálním případě projevovat pouze jako napěťové posuvy v signálech, analýza je tedy snadno odstraní.

Data můžeme zpracovat v GNU R funkcemi princomp nebo prcomp. První hlavní komponenta bude pravděpodobně součet všech kanálů – jas. Druhá bude pravděpodobně říkat zda se jedná o chladné barvy (světlo dominované vysokofrekvenčními složkami, spektrum posunuté do modrého směru) nebo teplé barvy (světlo dominované nízkofrekvenčními složkami, spektrum posunuté směrem do červeného směru). Důležité je, aby před analýzou byly kanály normalizované, což je u těchto funkcí v GNU R volitelné. Normalizace eliminuje posuv z kanálů, a kanály kde se hodnoty pohybují v menším rozsahu zesílí. Teoreticky by se ale hodnoty ve všech kanálech měly pohybovat ve stejném rozsahu, protože červené LED ve všech kanálech by měly logaritmovat se stejnou jednotkou danou diodovodu rovnicí.

bitcoin_skoleni

Idea pro zlepšení: zalitím do pryskyřice nebo nalakováním dobře izolujícím lakem bychom měli být schopni zvýšit odolnost proti vlhkosti a prachu a zamezit tak svodovým proudům, které by mohly ovlivnit náš sběr dat. Kombinací osvětlení měřeného povrchu různými vysokojasovými LED se budou spektra zdroje a kanálů našeho senzoru násobit. Kombinace budou vytvářet velké množství kanálů. Osvětlovací LED můžeme přepínat digitálními výstupy Arduina. Tak by mělo být možné měřit povrchy s ještě detailnější spektrální informací.

Historka na závěr: kombinací fotodiody SFH203 z Ronji (které je dnes už 22 let) a tranzistoru BC 549 jsem získal detektor nebývale citlivý. Byl schopen detekovat osvětlení, které ve zhasnuté koupelně vytvářela škvíra pode dveřmi.

Autor článku

Karel Kulhavý vystudoval operační systémy, sítě a překladače na MFF UK a je autorem optického pojítka Twibright Ronja a spoluautorem textového a grafického webového prohlížeče Twibright Links.