[PRZYKŁAD] Moduł DFRobot Fermion: AS7341 ze spektralnym czujnikiem światła
W niniejszym artykule zaprezentujemy moduł DFRobot Fermion: AS7341 ze spektralnym czujnikiem światła AS7341 firmy ams. Sensor umożliwia detekcję natężenia światła oraz prostą analizę jego widma. Pokażemy także prosty przykład obsługi sensora na platformie Arduino.
Do budowy przykładu użyjemy następujących elementów:
- Moduł DFRobot Fermion: AS7341 z 11-kanałowym czujnikiem światła,
- Płytka zgodna z Arduino UNO – taka jak Cytron Maker Uno,
- Przewody męsko-męskie,
- Płytka stykowa.
Sensor AS7341
Czujnik AS7341 produkowany przez ams to sensor umożliwiający detekcję natężenia światła. Układ pozwala na analizę widma optycznego w 11 kanałach w zakresie od 350 nm do 1000 nm. Sensor jest przeznaczony do aplikacji mobilnych umożliwiających identyfikację spektralną światła, a także dopasowanie koloru.
Sześć spośród 11 kanałów można przetwarzać równolegle za pomocą wbudowanego przetwornika analogowo-cyfrowego, natomiast pozostałe są dostępne przez multiplekser. Osiem kanałów obejmuje pełny zakres światła widzialnego, jeden mierzy bliską podczerwień, natomiast jeden to tzw. kanał czysty, mierzący natężenie w pełnym spektrum. Ostatni kanał służy do detekcji migotania sygnału świetlnego z częstotliwością 50 Hz lub 60 Hz. Silnik detekcji migotania może też przekazywać dane, co pozwala na zewnętrzne obliczenia innych częstotliwości. Układ można też synchronizować z sygnałami zewnętrznymi.
Czujnik AS7341 zawiera również filtry wbudowane w strukturę CMOS. Jest to osiągalne dzięki technologii filtrów interferencyjnych Nano-Optic. Natomiast obudowę zaprojektowano w ten sposób, aby zapewniała odpowiednią aperturę do kontroli światła wprowadzanego na matrycę czujników. Dane z czujnika oraz komendy są przesyłane za pomocą interfejsu I2C. Układ jest dostępny w obudowach OLGA-8 o wymiarach 3,1 x 2 x 1 mm.
Rys. 1. Rozkład pasm częstotliwościowych poszczególnych kanałów
Najważniejsze właściwości sensora AS7341:
- Zakres wykrywania światła widzialnego:
- F1 (405 – 425 nm),
- F2 (435 – 455 nm),
- F3 (470 – 490 nm),
- F4 (505 – 525 nm),
- F5 (545 – 565 nm),
- F6 (580 – 600 nm),
- F7 (620 – 640 nm),
- F8 (670 – 690 nm),
- Interfejs I2C,
- Adres I2C: 0x39,
- Napięcie zasilania 1,8 V,
- Zakres temperatur pracy: -30°C do 85°C,
- Zakres wilgotności roboczej: 5% RH do 85% RH
- Wymiary: 3,1 x 2 x 1 mm
Moduł DFRobot Fermion: AS7341
W przykładzie wykorzystamy moduł DFRobot Fermion: AS7341 z wbudowanym czujnikiem. Moduł ma postać niewielkiej płytki o wymiarach 18 x 14 mm. Styki sensora wyprowadzono na standardowe złącza goldpin o rastrze 2,54 mm. Po przylutowaniu dołączonego złącza szpilkowego można więc moduł umieścić w płytce stykowej lub podłączyć przy pomocy standardowych przewodów. Moduł, oprócz sensora, zawiera także dwa stabilizatory umożliwiające wygenerowanie napięć 1,8 V (do zasilania czujnika) oraz 3,3 V (jako napięcie logiczne magistrali I2C).
Moduł akceptuje zasilania z zakresu napięć 3,3 – 5 V.
Rys. 2. Moduł DFRobot Fermion: AS7341
Podłączenie modułu
Moduł z czujnikiem AS7341 komunikuje się za pomocą interfejsu I2C, toteż należy podłączyć odpowiednie wyprowadzenia do złącza Arduino. Moduł będzie zasilany napięciem 5 V, również pozyskiwanym z płytki Arduino.
Połączenie przedstawiono na poniższej tabelce, a także fotografii.
Tabela 1. Sposób podłączenia modułu DFRobot Fermion: AS7341 do Cytron Maker Uno
DFRobot Fermion: AS7341 | Cytron Maker Uno |
VDD | 5V |
GND | GND |
SDA | SDA |
SCL | SCL |
Rys. 3. Moduł DFRobot Fermion: AS7341 podłączony do płytki Cytron Maker Uno
Kod przykładu
Przykład prezentuje prosty sposób implementacji obsługi czujnika AS7341 na platformie Arduino. Odczytuje on wszystkie kanały widma światła, a następnie wypisuje ich wartość na port szeregowy, wraz z opisem koloru.
Na początku należy dołączyć bibliotekę do obsługi modułu DFRobot z sensorem AS7341. Bibliotekę można pobrać w formacie zip ze strony producenta, a także z sekcji Do pobrania pod tekstem artykułu. Następnie tworzony jest obiekt as7341, z którego można uruchomić funkcje obsługujące czujnik.
#include "DFRobot_AS7341.h" DFRobot_AS7341 as7341;
W funkcji setup inicjalizowana jest komunikacja za pomocą portu szeregowego oraz komunikacja z czujnikiem przez I2C. W przypadku, gdy mikrokontroler nie będzie w stanie nawiązać komunikacji z sensorem, na porcie szeregowym ukaże się odpowiednia informacja.
void setup(void) { Serial.begin(115200); //Test komunikacji I2C while (as7341.begin() != 0) { Serial.println("Blad komunikacji I2C, sprawdz polaczenie"); delay(1000); } }
Pętla główna programu tworzy dwa obiekty przechowujące dane. Jako, że wbudowany przetwornik ADC oferuje jedynie 6 kanałów, aby odczytać wszystkie informacje z sensora należy podzielić pracę na dwie części. Najpierw należy odczytać 4 kanały, następnie zmienić ustawienia multipleksera przekierowując do przetwornika nieodczytane wcześniej dane i odczytać pozostałe kanały.
Po wykonaniu pomiaru dane otrzymane z czujnika są wypisywane na port szeregowy. Generalnie im wyższa liczba tym większe natężenie światła w danym paśmie. Dokładne dane dotyczące wartości, a także metod kalibracji można znaleźć na stronie producenta czujnika: https://ams.com/as7341
void loop(void) { DFRobot_AS7341::sModeOneData_t data1; DFRobot_AS7341::sModeTwoData_t data2; //Rozpoczęcie pomiarów //Podłączenie kanałów 1-4, "Clear" oraz podczerwieni do ADC as7341.startMeasure(as7341.eF1F4ClearNIR); //Odczyt pierwszej partii danych data1 = as7341.readSpectralDataOne(); Serial.println(""); Serial.println("-----------------------------------------------------------------------"); Serial.println(""); Serial.print("Fiolet (405-425 nm): "); Serial.println(data1.ADF1); Serial.print("Indygo (435-455 nm): "); Serial.println(data1.ADF2); Serial.print("Niebieski (470-490 nm): "); Serial.println(data1.ADF3); Serial.print("Błękitny (505-525 nm): "); Serial.println(data1.ADF4); //Zmiana podłączenia kanałów do ADC - kanały 5-8, kanał "Clear" oraz podczerwień as7341.startMeasure(as7341.eF5F8ClearNIR); //Druga partia pomiarow data2 = as7341.readSpectralDataTwo(); Serial.print("Zielony (545-565nm): "); Serial.println(data2.ADF5); Serial.print("Żółty (580-600 nm): "); Serial.println(data2.ADF6); Serial.print("Pomarańczowy (620-640 nm): "); Serial.println(data2.ADF7); Serial.print("Czerwony (670-690 nm): "); Serial.println(data2.ADF8); Serial.print("Pełne spektrum: "); Serial.println(data2.ADCLEAR); Serial.print("Podczerwień: "); Serial.println(data2.ADNIR); delay(1000); }
Wynik pracy programu zaprezentowano na poniższym zrzucie ekranu:
Rys. 4. Wynik pracy przykładowego kodu
Pełen kod przykładu znajduje się w sekcji Do pobrania.