Czujnik AMG88xx o handlowej nazwie Grid-EYE jest 64. punktową matrycą do pomiaru temperatury poprzez rejestrację promieniowania podczerwonego IR. AMG88xx przypomina układ scalony z metalowym korpusem, w którym umieszczono na górnej powierzchni kwadratową soczewkę. Wygląd czujnika zamontowanego na płytce modułu pokazano na fotografii 1.
Schemat blokowy czujnika zamieszczono na rysunku 2.
Matryca 64 fotodiod czułych na światło podczerwone oznaczona jest jako sensor IR. W czasie cyklu pomiarowego blok selektora dołącza wyjścia sygnałowe kolejnych diod do wzmacniacza i przetwornika ADC. Numeracja fotodiod w obrębie matrycy pokazana została na rysunku 3.
Zamontowany wewnątrz czujnika termistor przesuwa napięcie odniesienia przetwornika proporcjonalnie do temperatury obudowy. Ma to skompensować wpływ temperatury otoczenia na wynik pomiaru. Otrzymane z przetwornika dane kierowane są do układów wewnętrznej logiki i dalej do bloku nadzorującego magistralę I2C. Poziom napięcia podanego na wejście AD_SELECT wybiera jeden z dwu adresów, na który czujnik będzie reagował w obrębie magistrali I2C. Wyjście INT można zaprogramować do sygnalizacji przekroczenia ustawionego poziomu temperatury.
Warianty wykonania czujnika AMG88xx
Czujnik AMG88xx dostępny jest w kilku wariantach wykonania, których parametry określają 2 ostatnie cyfry oznaczenia. Wszystkie czujniki wyposażone są w 64-punktową matrycę, różnią się natomiast napięciem zasilania, dokładnością i zakresem pomiarowym:
- AMG883x oznacza czujnik pracujący z zasilaniem 3,3 V,
- AMG885x oznacza czujnik potrzebujący do zasilania napięcia 5 V,
- AMG88x1 i AMG88x3 oznaczają czujniki typu High gain, przy czym drugie oznaczenie dotyczy wykonania High performance,
- AMG88x2 i AMG88x4 odnoszą się do czujników Low gain, przy czym drugi czujnik jest w wykonaniu High performance.
Najważniejsze parametry czujników AMG88xx:
- 64-punktowa matryca IR do pomiaru temperatury,
- dokładność pomiaru: ±2,5°C dla wykonania High gain i ±3,0°C dla wykonania Low gain,
- zakres pomiarowy: 0...80°C dla wykonania High gain i -20...+100°C dla wykonania Low gain,
- rozdzielczość pomiaru: 0,25°C,
- czas pomiaru: 1 sekunda lub 0,1 sekundy,
- zakres detekcji ciepłoty ludzkiego ciała na neutralnym tle: do 5 m lub do 7 m dla wykonania High performance,
- pobór prądu w czasie normalnej pracy: 4,5 mA,
- możliwość przydzielenia w obrębie magistrali I2C jednego z dwu adresów: 0x68 lub 0x69
- możliwość zaprogramowania przerwania sprzętowego, które zmieni poziom na wyjściu INT po przekroczeniu progu temperatury w jednym lub wielu punktach matrycy.
Płytka modułu czujnika
Obudowa czujnika AMG88xx jest przystosowana do montażu powierzchniowego. Żeby ułatwić posługiwanie się czujnikiem, została zaprojektowana specjalna płytka modułu, której schemat ideowy pokazano na rysunku 4.
Oprócz miejsca do przylutowania czujnika, na płytce znajdują się elementy niezbędne do jego pracy. Są tam kondensatory filtrujące oraz oporniki podciągające linie I2C do napięcia zasilającego, a także opornik ustalający domniemany adres magistrali. Wyboru drugiego adresu dokonuje się poprzez zwarcie zwory SJ1. Złącze szpilkowe SV1 ułatwia podłączenie wyprowadzeń sygnałowych i zasilających czujnika. Funkcje przypisane do jego kolejnych styków są następujące:
- SV1-1 masa,
- SV1-2 podłączenie napięcia zasilania. Zależnie od typu czujnika 3,3 V albo 5 V,
- SV1-3 wyprowadzenie SDA (dane) magistrali I2C,
- SV1-4 wyprowadzenie SCL (zegar) magistrali I2C,
- SV1-5 wyjście sygnału INT przerwania.
Jeżeli będzie używane wyprowadzenie przerwania INT, powinno być podciągnięte do napięcia zasilania przez zewnętrzny opornik.
Komunikacja poprzez I2C
Cała komunikacja z czujnikiem i jego sterowanie odbywa się poprzez 2-przewodową magistralę I2C. Czujnik reaguje na jeden z dwu adresów slave zależnie od poziomu napięcia podanego na wyprowadzenie AD_SELECT. Dla stanu niskiego na tym wyprowadzeniu adresem czujnika będzie 0x68. Dla stanu wysokiego adresem slave będzie 0x69. Adresy podane są w 7-bitowej notacji (dodawany najmłodszy bit adresu używany jest do określenia kierunku transmisji: zapisu lub odczytu). Dla czujnika zamontowanego na płytce modułu domyślnym adresem jest 0x69.
Odczyt temperatur z kolejnych pikseli matrycy
Po włączeniu zasilania czujnik AMG88xx jest gotów do pracy i automatycznie przechodzi do trybu pomiarów. Dane temperatury zmierzonej przez kolejny sensor matrycy są zapisywane w odpowiedniej parze rejestrów. Dla sensora o numerze 1 adres rejestrów to 0x80 dla młodszych bitów i 0x81 dla starszych. Kolejne dwa adresy są przeznaczone na dane temperatury z sensora numer 2 itd. aż do adresu 0xFE i 0xFF zawierających temperaturę zmierzoną przez sensor numer 64. Pozycję sensora (pikseli) w matrycy IR pokazuje rysunek 3.
Dane temperatury zajmują 12 bitów w dwu rejestrach, b7...0 w rejestrze młodszych bitów i b3...0 w rejestrze starszych. Temperatura zapisywana jest z rozdzielczością 0,25°C z zapisem w kodzie uzupełnienia do 2. W tym systemie reprezentacja bitowa 3 kolejnych temperatur będzie wyglądała tak:
- +0,25°C (b11-0) 0000_0000_0001 HEX = 0x001
- 0°C (b11-0) 0000_0000_0000 HEX = 0x000
- -0,25°C (b11-0) 1111_1111_1111 HEX = 0xFFF
Dostęp do wartości przechowywanych w rejestrach jest możliwy poprzez odczyt magistralą I2C. Należy podać adres slave czujnika i adres rejestru, następnie w trybie odczytu czujnik prześle wartość rejestru. Dane temperatury w rejestrach są odświeżane z częstotliwością zależną od ustawionego okresu pomiarowego. Okres można zmienić, modyfikując zawartość rejestru FPSC o adresie 0x02. Do rejestru można wpisać wartość 0x00, co ustawi szybkość odświeżania pomiarów na 0,1 s, lub wartość 0x01 ustawiającą czas odświeżania pomiarów na 1 s. Po włączeniu zasilania w rejestrze zapisana jest wartość 0x00 odpowiadającą okresowi pomiarowemu równemu 0,1 s.
Odczyt temperatury wewnętrznego termistora
Wartość temperatury zmierzonej przez wewnętrzny termistor czujnika jest zapisywana w 2 rejestrach. TOOL o adresie 0x0E zawiera 8 młodszych bitów temperatury, a TOOH 4 starsze bity. Temperatura termistora zapisana jest z rozdzielczością 0,0625°C jako wartość absolutna ze znakiem przechowywanym w b11 (bit ustawiony oznacza temperaturę ujemną). Reprezentacja 3 temperatur wygląda tak:
- +0,25°C (b11-0) 0000_0000_0100 HEX = 0x004
- 0°C (b11-0) 0000_0000_0000 HEX = 0x000
- -0,25°C (b11-0) 1000_0000_0100 HEX = 0x804
Przykład procedury odczytu danych temperatury z matrycy AMG88xx
Przykładowa procedura przeznaczona jest dla dowolnego kontrolera z rodziny STM32. Pokazuje, jak odczytać z rejestrów czujnika AMG88xx dane temperatury z kolejnych pikseli matrycy. W procedurze wykorzystuje się do komunikacji z czujnikiem interfejs I2C1 kontrolera, który został zainicjowany kodem wygenerowanym np. przez narzędzie STM32CubeMX. Po inicjacji został utworzony uchwyt I2C_HandleTypeDef hi2c1 dla interfejsu I2C1. Na listingu 1 pokazane są standardowe procedury odczytu i zapisu interfejsem I2C1 kontrolera wykorzystujące procedury HAL.
Listing 1. Standardowe procedury odczytu i zapisu interfejsem I2C1 kontrolera korzystające z procedur HAL
extern I2C_HandleTypeDef hi2c1;
//procedura odczytu bloku danych magistralą I2C
char I2C_OdczytBloku(unsigned char slave_adr, unsigned int adres_int,
unsigned char ile_bajtow_danych, char *p_bufor)
//wy: TRUE -sukces, FALSE -błąd
{
HAL_StatusTypeDef status;
status = HAL_I2C_Mem_Read(&hi2c1,(uint16_t)slave_adr,(uint16_t)adres_int,I2C_MEMADD_SIZE_8BIT,
(uint8_t *)p_bufor,(uint16_t)ile_bajtow_danych,1000);
if (status !=HAL_OK) return FALSE;
else return TRUE;
}
//procedura zapisu bloku danych magistralą I2C
char I2C_ZapisBloku(unsigned char slave_adr, unsigned int adres_int,
unsigned char ile_bajtow_danych, char *p_bufor)
{
HAL_StatusTypeDef status;
status =HAL_I2C_Mem_Write(&hi2c1,(uint16_t)slave_adr,(uint16_t)adres_int,I2C_MEMADD_SIZE_8BIT,
(uint8_t *)p_bufor,(uint16_t)ile_bajtow_danych,1000);
if (status !=HAL_OK) return FALSE;
else return TRUE;
}
Główna procedura odczytu danych temperatury z rejestrów kolejnych pikseli jest pokazana na listingu 2. Na początku zdefiniowane są takie stałe jak adres slave czujnika, adres rejestru bazowego, którym jest rejestr młodszych bitów piksela 1, rozmiary matrycy w pionie i poziomie. Parametrem procedury jest wskaźnik do bufora, w którym mają zostać umieszczone odczytane temperatury wszystkich 64 pikseli matrycy. Następnie wykorzystując dwie pętle dla odliczania pozycji w pionie i poziomie kolejnego piksela, następuje odczyt odpowiadających mu rejestrów zawierających dane pomiarowe. Po odczycie następuje konwersja wartości binarnej zapisanej w formacie uzupełnienia do 2 na zmiennoprzecinkową wartość temperatury typu float. Otrzymana wartość zostaje zapisana do bufora i procedura kontynuuje odczyt kolejnych rejestrów następnego piksela matrycy.
Listing 2. Główna procedura odczytu danych temperatury z rejestrów kolejnych pikseli
#define AMG88XX_SLAVE_ADR7B 0x69
#define MATRYCA_ADR_T01L 0x80
#define ILE_PIX_X 8 //ilość pikseli X
#define ILE_PIX_Y 8 //ilość pikseli Y
//odczyt temperatury matrycy AMG88xx
uint8_t OdczytAMG88xx_matryca(float *p_bufor_temperatur_matrycy)
{
static uint8_t piksel_rej_adr,status=FALSE,bufor;
uint16_t matryca_temp;
float matryca;
piksel_rej_adr=MATRYCA_ADR_T01L;//adres rejestru 1 piksela matrycy
for (uint8_t y=0; y<ILE_PIX_Y; y++){
for (uint8_t x=0; x<ILE_PIX_X; x++){
//odczyt L bitów temperatury piksela matrycy
status =I2C_OdczytBloku((AMG88XX_SLAVE_ADR7B<<1), piksel_rej_adr,
1, (char *)&bufor);
if (status ==FALSE) return FALSE;
piksel_rej_adr++;
matryca_temp =bufor;
//odczyt H bitów temperatury piksela matrycy
status =I2C_OdczytBloku((AMG88XX_SLAVE_ADR7B<<1), piksel_rej_adr,
1, (char *)&bufor);
if (status ==FALSE) return FALSE;
piksel_rej_adr++;
matryca_temp =matryca_temp +(bufor <<8);
//konwersja wartości binarnej na zmiennoprzecinkową
if ((0x800 &matryca_temp) !=0) {
//temperatura ujemna
matryca_temp =(~matryca_temp) & 0xFFF;
matryca_temp =matryca_temp +1;
matryca =matryca_temp * 0.25;
matryca =0 -matryca;
} else {
matryca =matryca_temp * 0.25;
}
uint8_t numer_pix =(y*ILE_PIX_Y)+x;
*(p_bufor_temperatur_matrycy+numer_pix) =matryca;
}
}
return TRUE;
}
Aplikacja „kamery IR”
Mając wiedzę o sposobie działania czujnika i procedury do jego obsługi, można napisać aplikację wizualizującą odczytane dane w formie mapy rozkładu temperatur badanego obiektu. Na fotografii tytułowej pokazano płytę STM32F746G-DISCO z podłączoną płytką modułu i uruchomioną jedną z wersji aplikacji.
Do połączenia płytki czujnika z STM32F746G-DISCO użyto złączy „arduinowych” na dolnej stronie płyty. Połączenia zebrano w tabeli 1.
Przy budowie części graficznej aplikacji wykorzystano bibliotekę STemWin, darmowe narzędzie udostępniane przez firmę ST do projektów z kontrolerami STM32. Biblioteka pozwala tworzyć własne GUI, napisana została w C, w działaniu używa systemu operacyjnego czasu rzeczywistego. Szkielet aplikacji został wygenerowany przez STM32CubeMX, którego ustawienia uwzględniają użycie biblioteki STemWin oraz FREERTOS darmowego systemu operacyjnego czasu rzeczywistego. Wygenerowany kod został wczytany do edytora pakietu programistycznego ST4STM32-System Workbench i uzupełniony procedurami obsługi czujnika AMG88xx.
Ekran graficzny aplikacji składa się z kilku elementów do zobrazowania danych odczytanych z czujnika i do zmiany niektórych ustawień. Na szachownicy o wymiarach 8×8 wyświetlane są kwadraty, których kolor odpowiada temperaturom odczytanym z pikseli matrycy IR. Kwadrat w lewym dolnym rogu wyświetla temperaturę piksela 1 matrycy IR i dalej kolejno aż do piksela 64, któremu odpowiada kwadrat w prawym górnym rogu szachownicy. Wyświetlanie dopasowane jest do ustawienia płytki modułu złączem SV1 do góry.
Na belce na dole wyświetlacza pokazano, jaki kolor odpowiada odczytanej temperaturze.
Na liście z prawej strony szachownicy wyświetlane są temperatury w °C wybranych przez użytkownika 8 pikseli matrycy. Wyboru dokonuje się przez dotknięcie kwadratu na szachownicy, który zostaje oznaczony ramką z przypisanym numerem punktu. Powtórne dotknięcie usuwa zaznaczenie i odczyt z listy punktów.
Klawisze z prawej strony wyświetlacza służą do zmiany niektórych ustawień aplikacji:
- Odczyt szybki/wolny przełącza pomiędzy wyborem szybkiego lub wolnego okresu odczytu temperatur z czujnika.
- Kolory liniowo/kontrastowo pozwala wybrać pomiędzy zwykłą prezentacją kolorów temperatur a kolorami uwypuklającymi temperatury w środku zakresu pomiarowego.
- Tryb normalny/testowy przełącza pomiędzy normalną pracą a symulacją liniowego odczytu temperatur w całym zakresie pomiarowym rosnąco o 2°C dla kolejnego piksela.
Wnioski końcowe
Czujnik AMG88xx sprawdza się doskonale w wizualizacji rozkładu gradientu temperatur dla typowego „domowego” zakresu pomiarowego. Może być użyty w pasywnych czujkach wykrywających obecność człowieka z odległości do kilku metrów. Im bliżej powierzchni badanego obiektu czujnik się znajduje, tym dokładniejszy jest odczyt temperatury. Przy pomiarze chłodnych obiektów trzeba zadbać, aby temperatura samego czujnika sygnalizowana przez wewnętrzny termistor był niska.
Dosyć szeroki, bo 60°, kąt widzenia czujnika sprawia, że może rejestrować oprócz promieniowania ze źródła także promieniowanie odbite od pobliskich płaszczyzn.
Ryszard Szymaniak
- R1: 20 Ω SMD 0805
- R2, R3, R4: 10 kΩ SMD 0805
- C1: 1 μF SMD 0805
- C2: 2,2 μF SMD 0805
- C3: 10 μF SMD 0805
- U1: AMG88xx
- SV1: goldpiny 1×5