W znanym serwisie aukcyjnym wygrzebałem kiedyś ciekawy sensor z komunikacją I²C o oznaczeniu APDS9300. Układ zainteresował mnie na tyle, że sobie go zakupiłem z myślą o wykorzystaniu w kilku mini projektach, z uwagi na to, że „jakość” oświetlenia można przedstawić w konkretnych jednostkach – LUX. Dodatkowo interesującą możliwością jest sposób w jaki układ dokonuje pomiaru, otóż uzbrojony jest w dwa czujniki światła jeden o szerokim spektrum – światło widzialne (w odcieniu czerwieni) oraz IR λp = 640nm , i drugi pracujący tylko w IR λp = 940nm. No i pomyślałem sobie, że można by dodatkowo zbierać dane z tego czujnika IR do obserwacji w czasie, np w okresie roku. Niestety nie są to już żadne znane jednostki, a tylko odczytane wartości z przetwornika AD.

schemat widma promieniowania widzialnego zaczerpnięty z: http://www.lenalighting.pl/bank-wiedzy/widmo-promieniowania-widzialnego/
Przy okazji:
Światło jest promieniowaniem widzialnym (elektromagnetycznym) zdolnym do wywoływania u człowieka i zwierząt bezpośrednio wrażeń wzrokowych, z których wynika widzenie. Źródła światła sztucznego są przeważnie źródłami elektrycznymi, natomiast wytwarzane przez nie światło jest w zasadzie wielkością nieelektryczną, wyrażaną wielkościami i prawami fotometrycznymi.
Przyjmuje się, że promieniowanie widzialne zawiera w widmie fal elektromagnetycznych, bardzo wąski przedział od 380 do 780 nm. Taki zakres odbiera nasze oko, ale zwierzęta mogą rejestrować promieniowanie o innych długościach.
W widmie światła widzialnego istnieją przedziały o różnych długościach fal, które oko ludzkie odbiera jako wrażenie różnych barw, np.:
- przedział o długości fali od 380 nm do 436 nm – fiolet,
- przedział o długości fali od 436 nm do 495 nm – niebieski,
- przedział o długości fali od 495 nm do 566 nm – zielony,
- przedział o długości fali od 566 nm do 589 nm – żółty,
- przedział o długości fali od 589 nm do 627 nm – pomarańczowy,
- przedział o długości fali od 627 nm do 780 nm – czerwony.
Najlepiej widzimy w środku zakresu promieniowania widzialnego, a najgorzej na końcach zakresu.
Sensor jest produktem firmy AVAGO Technologies. Produkowany jest jako miniaturowy niskonapięciowy, energooszczędny, cyfrowy sensor optyczny, z bezpośrednim interfejsem I²C 400kHz. Posiada wymiary zaledwie 2,6×2,2mm przy grubości 0,55mm. Pracuje w zakresie napięcia zasilania 2,4 do 3,0V pobiera zaledwie 0,24mA dodatkowo posiada tryb Power Down (15µA). Może pracować w zakresie temperatur otocznia -30 do 85 °C. W nocie katalogowej można wyczytać o następujących właściwościach:
– orientacyjna reakcja oczu człowieka – cokolwiek to znaczy,
– precyzyjny pomiar natężenia oświetlenia na podstawie zróżnicowanych warunków oświetlenia
– programowalne funkcje przerwania
– 16-bitowe wyjście cyfrowe z I²C – obsługuje Fast-Mode na 400 kHz
– 50/60-Hz Tłumienie tętnienia oświetlenia
– niskie napięcie zasilania 2,5V i 1,8V na wyjściach cyfrowych
– niski pobór mocy w trakcie pracy (0,6mW typowo) oraz tryb Power Down
– zgodny z RoHS
Układ jest wykorzystywany we wszelkiego typu sprzętach przenośnych z ekranami, tabletach telefonach i różnych gadżetach. Ma odpowiednik innej firmy o oznaczeniu TSL2561. Oba są ze sobą zgodne pod względem funkcjonalności i oprogramowania pomiaru, ale nie wyprowadzeń. Dodatkowo ten drugi jest zdaje się jeszcze ociupinę drobniejszy.
Bardzo ciekawie prezentuje się pod mikroskopem. Posiada sześć wyprowadzeń z których to dwa służą do komunikacji z µC (SDA i SCL), jedno ADDR SEL do wyboru adresu, oraz dwa zasilające Vdd GND i jedno wyjście INT. Należy wspomnieć o tym, że jest taki popularny, iż produkują go też inni producenci pod innymi symbolami np TSL2561 firmy Taos INC (AMS). Sensory nie są zgodne wyprowadzeniami, ale są identyczne pod względem oprogramowania transmisji.
Sensor jest tak bardzo mały, że nawet nie próbowałem do niego przylutować czegokolwiek, zabrałem się za wykonanie płytki testowej, do której mogłem sobie go spokojnie przylutować. Był to też pretekst do zmierzenia się z lutowaniem za pomocą hot air, gdyż w tej dziedzinie jestem pionierem. Płytka powstała w dwóch wariantach – przy podejściu nr 1 do tematu – sam sensor z kondensatorem i miejscem na pull-up + pady na kabelki, – przy podejściu nr 2 dodatkowo z translatorem napięć I²C PCA9530 i stabilizatorkiem 2,5V TC1185 (150 mA CMOS LDO) + niezbędne elementy bierne.
Choć mam internetowego znajomego (rithien tu o Tobie), który co chwilę pokazuje co potrafi 😉 Ta znajomość jest dla mnie bardzo edukacyjna, gdyż jest profesjonalistą w tym co robi.
Sam proces komunikacji jest dobrze zobrazowany w nocie katalogowej, ale tu warto wspomnieć o kilku detalach. Po pierwsze układ na wstępie należy obudzić ze stanu standby, i jeszcze ważniejsze – aby sensor „wiedział” że przesłana dana dotyczy rejestru poleceń (command register) najstarszy bit słowa musi być ustawiony. Strona 10 w załączonej nocie. Gdy już uporamy się z nawiązaniem komunikacji i pobraniem niezbędnych danych trzeba przystąpić do wykonania żmudnych obliczeń. Biorąc pod uwagę iż model budowałem z wykorzystaniem ośmiobitowego Mega8, obliczenia są trochę „karkołomne” gdyż dotyczą np dzielenia i potęgowania na liczbach typu single i word. µC sobie z tym radzi ale jest efekt uboczny „nadmierna” obfitość wygenerowanego kodu. Co nie jest dla mnie bez znaczenia, gdyż korzystam z wersji demonstracyjnej środowiska programowania. Efekt jest taki, że z wykorzystaniem wyświetlacza LCD oraz paru dodatkowych funkcjonalności w programie np wyszukiwanie adresu sensora, kod zajął całą „udostępnioną” przestrzeń. Po uporządkowaniu i wykluczeniu zbędnych funkcjonalności będzie miejsce na dodatkowe „sprawy” np przesłanie RS-em wyników „gdzieś dalej”.
Odczyt danych i stosowne obliczenia.
Po zaadresowaniu sensora i przesłaniu odpowiedniego rozkazu do odczytu wartości z pierwszego przetwornika, łapiemy dwa bajty i sklejamy aby uzyskać prawidłową wartość z przetwornika ADC. Może to wyglądać np tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Set Led 'na czas komunikacji załączam LED I2cstart 'rozpoczynam transmisję I2cwbyte Apds9300_w 'device Adress (write) I2cwbyte &HAC 'command register odczytujemy pierwszy ADC I2cstart I2cwbyte Apds9300_r 'device Adress + 1 (read) I2crbyte C0low , Ack 'odczyt pierwszego bajtu do zmiennej I2crbyte C0high , Nack 'odczyt kolejnego bajtu z wynikiem I2cstop I2cstart 'i to samo dla drugiego ADC I2cwbyte Apds9300_w 'device Adress I2cwbyte &HAE I2cstart I2cwbyte Apds9300_r 'device Adress + 1 (read) I2crbyte C1low , Ack I2crbyte C1high , Nack I2cstop Reset Led 'wyłączam LED od komunikacji |
Nie ma tu nic strasznego, Adps9300_w oraz Adps9300_r to stałe z przypisanym adresem stosownie do wybranej konfiguracji (pin ADDR SEL). Zmienne C0low, C0high, C1low, C1high są typu byte i odzwierciedlają „kawałki” odczytanych wartości z poszczególnych ADC, natomiast Led to alias dla pinu z podłączonym LED-em.
Teraz gdy mam już odczytane wartości bazowe dotyczące intensywności oświetlenia, zabieram się za wykonanie stosownych obliczeń aby otrzymać wynik w luxach. Więc Mega8 dostanie w końcu „w dupę” 😉
1 2 |
C0 = Makeint(c0low , C0high) C1 = Makeint(c1low , C1high) |
sklejam „worda” z „bajtów” w których siedzą kawałki odczytanego z ADC wyniku.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
C = C1 / C0 If C > 0 And C <= 0.5 Then Wsp = 0.0304 Lux_1 Lux2 = C1 / C0 Lux2 = Lux2 ^ 1.4 Lux2 = Lux2 * C0 Lux2 = Lux2 * 0.062 Gosub Lux_licz Elseif C > 0.5 And C <= 0.61 Then Wsp = 0.0224 Lux_1 Wsp = 0.031 Lux_2 Gosub Lux_licz Elseif C > 0.61 And C <= 0.8 Then Wsp = 0.0128 Lux_1 Wsp = 0.0153 Lux_2 Gosub Lux_licz Elseif C > 0.8 And C <= 1.3 Then Wsp = 0.00146 Lux_1 Wsp = 0.00112 Lux_2 Gosub Lux_licz Else Lux = 0 End If |
Tutaj nic innego tylko algorytm z noty katalogowej + kilka uproszczeń, wynik ląduje w zmiennej Lux, przy deklaracji użytych zmiennych należy dobrać stosowne ich typy, dwu lub czterobajtowe. Po pierwsze wyliczam stosunek wartości ADC1 do ADC0, na tej podstawie jest kilka dróg dalszego postępowania dla obliczenia końcowej wartości. Kolejnie kosmetyka dla poprawności analizy kodu.
1 2 3 4 5 6 7 8 9 10 11 |
Sub Lux_1 Lux1 = Wsp * C0 End Sub Sub Lux_2 Lux2 = Wsp * C1 End Sub Lux_licz: Lux = Lux1 - Lux2 Return |
„treść” podprogramów.
1 2 |
Declare Sub Lux_1 'Pierwsza część obliczeń lux Declare Sub Lux_2 'Druga część obliczeń lux |
Deklaracja użytych podprogramów.
Końcowy efekt funkcjonowania sensora APDS9300 na testowym układzie można obejrzeć tutaj. Junior coś cicho mikrofon nastawił ;-p
AD 2013-11-03 Z ostatniej chwili – rithien sprawdził i ADPS9300 oraz TSL2562CL, TSL2563CL mają identyczne obudowy i układ wyprowadzeń.
Nota katalogowa
ADPS-9300.pdf (1487 pobrań)
Nota katalogowa
TSL2560-61.pdf (1588 pobrań)
Nota katalogowa
TSL2562-63cl.pdf (3118 pobrań)
Nota katalogowa
TSL2562-63.pdf (2111 pobrań)
Eagle libs
APDS-9300.lbr.zip (17 pobrań)
plik dostępny po zalogowaniu 😛
Tutaj opis jak sensor podłączyć do systemu µC zasilanego napięciem 5V. Opisane podzespoły można zakupić tu w bardzo atrakcyjnych cenach.