Kamera termiczna oparta na Raspberry Pi

Kamera termiczna oparta na Raspberry Pi

Obserwacja świata w podczerwieni to fascynująca sprawa. Niestety nasze oczy nie rejestrują tego fragmentu pasma promieniowania elektromagnetycznego, więc skazani jesteśmy na wykorzystywanie specjalnych kamer. Urządzenia te są zazwyczaj dosyć drogie, dlatego też studenci z politechniki w Michigan postanowili skonstruować własne, otwarte urządzenie tego typu. Grupa kierowana przez dr. Joshue Pearce'a opracowała otwarty projekt kamery termalnej, wykorzystującej komputer jednopłytkowy Raspberry Pi i moduł kamery podczerwonej FLIR Lepton.

Obrazowanie rozkładu temperatury - termografia - ma wiele zastosowań w różnych dziedzinach: przemyśle, nauce czy medycynie. Termografia polega na obrazowaniu w zakresie średniej podczerwieni, to jest od 9 do 14 mm. Każde ciało emituje promieniowanie elektromagnetyczne, najczęściej w zakresie podczerwieni, o długości fali odwrotnie proporcjonalnej do jego temperatury. Emisja z maksimum przypadającym na zakres średniej podczerwieni odpowiada temperaturom najczęściej spotykanym w naszym otoczeniu.

Urządzenia do obrazowania w podczerwieni są zazwyczaj bardzo drogie. Aby jednak skorzystać z tej technologii na uczelni, zespół dr. Pearce'a skonstruował własną kamerę termiczną na bazie modułu kamery podczerwonej Lepton firmy FLIR. Jest to ekonomiczny moduł do zastosowań w sprzęcie przenośnym i konsumenckim.

Elementy składowe układu

Autorzy użyli pierwszej generacji komputerka Raspberry Pi - wersji B+, do budowy opisanego urządzenia. Jednak każda inna wersja Raspberry będzie odpowiednia do tej kamery i napisanego oprogramowania, wymagając jedynie minimalnych poprawek. Wszystkie elementy składowe zebrano w tabeli 1.

Przygotowywanie karty SD

Na początek musimy przygotować odpowiednio kartę SD dla komputera Raspberry Pi, aby mógł poprawnie działać. Do tego potrzebny będzie nam zwykły komputer PC, wyposażony w czytnik kart SD. W pierwszej kolejności musimy sformatować kartę i umieścić na niej instalator systemu operacyjnego dla Raspberry Pi. Do formatowania karty możemy użyć jednego z dedykowanych do tego celu programów. Autor konstrukcji wskazuje program Formatter for Windows i opis w artykule dotyczy tego programu.

Po pobraniu i zainstalowaniu programu możemy w komputerze umieścić kartę SD i uruchomić zainstalowany program. Następnie wybieramy opcję FORMAT SIZE ADJUSTMENT, czyli formatowanie z dostosowaniem wielkości karty SD. Jeśli opcja jest zaznaczona, to możemy kliknąć OK i przejść dalej. W polu „Drive” wybieramy literę dysku skojarzoną z naszą kartą SD. Jeśli w komputerze zainstalowany mamy tylko jeden czytnik kart, z jedną kartą, to oprogramowanie automatycznie wykryje literę dysku, pod którą znajduje się karta. Po ustawieniu wszystkich parametrów możemy nacisnąć przycisk Format i potwierdzić to, naciskając OK w kolejnych okienkach, które będą się pojawiać. Po chwili oczekiwania karta microSD zostanie sformatowana.

Kolejnym krokiem jest instalacja systemu operacyjnego z wykorzystaniem pakietu NOOBS. Należy pobrać najnowszą wersję pakietu w postaci pliku ZIP (w chwili pisania artykułu jest to 3.0.1). NOOBS najprościej pobrać z oficjalnej witryny www.raspberrypi.org. Po pobraniu paczki zawartość musimy wypakować na czystą kartę microSD, którą sformatowaliśmy w poprzednim kroku. Możemy teraz włożyć kartę microSD do Raspberry Pi, podłączyć myszkę i klawiaturę oraz ekran (np. telewizor poprzez port HDMI). Po uruchomieniu systemu postępujemy zgodnie z poleceniami na ekranie, instalując system operacyjny Raspbian.

Podłączenie FLIR Lepton do Raspberry Pi

Rysunek 1. Moduł FLIR Lepton na płytce z wyprowadzeniami wszystkich sygnałów

Kolejnym krokiem jest podłączenie do komputera modułu kamery FLIR Lepton. Warto kupić moduł Lepton w postaci modułu deweloperskiego - od razu przylutowanego do płytki drukowanej, z wyprowadzonymi wszystkimi potrzebnymi sygnałami na złączach szpilkowych. W ten sposób możemy połączyć moduł kamery z komputerem przy użyciu płytki stykowej lub zworek. Moduł z kamerą FLIR Lepton pokazano na rysunku 1. Moduł z kamerą potrzebuje do komunikacji dwóch interfejsów szeregowych - SPI do przesyłania danych oraz I2C do przesyłania informacji kontrolnych. Komputer Raspberry Pi wyposażony jest w oba te interfejsy oraz duże wsparcie programistyczne do tworzenia oprogramowania w postaci gotowych bibliotek do języków takich jak C i Python.

Rysunek 2. Schemat wyprowadzeń 40-pinowego złącza Raspberry Pi. Oznaczono piny, które trzeba podłączyć do modułu kamery

Raspberry Pi ma 40-pinowe złącze, na którym wyprowadzono m.in. linie interfejsów SPI oraz I2C, a także zasilanie i masę. Na rysunku 2 pokazano, gdzie znajdziemy poszczególne sygnały SPI (MOSI, MISO, CLK i CS) oraz I2C (SDA i SCL). Łączymy je w wybrany przez siebie sposób z odpowiadającymi sygnałami po stronie modułu z kamerą termowizyjną. Pamiętajmy, aby dołączać moduł do kamery po odłączeniu zasilacza od Raspberry Pi. Na rysunku 3 pokazano podłączony moduł z kamerą na płytce stykowej. Po podłączeniu wszystkiego do komputera Raspberry Pi możemy ponownie uruchomić komputer (podłączyć zasilanie do portu microUSB) i przejść do konfiguracji.

W pierwszej kolejności musimy podłączyć Internet - poprzez kabel (Ethernet) lub Wi-Fi. W zależności od tego, w jaki sposób podłączamy nasz moduł Raspberry Pi do Internetu, sposób konfiguracji będzie inny. Po podłączeniu do sieci musimy zaktualizować wszystkie komponenty systemu. W tym celu należy uruchomić terminal i po kolei wpisać komendy:

sudo apt-get update
sudo apt-get dist-upgrade

Pozwoli to zaktualizować informację na temat najnowszych wersji pakietów w programie APT, który służy do instalacji oprogramowania na systemie Raspbian, a następnie zaktualizować wszystkie pakiety w naszym systemie operacyjnym do najaktualniejszych wersji. Dla zachowania bezpieczeństwa systemu powinniśmy co jakiś czas taką czynność powtarzać.

Fotografia 3. Moduł FLIR Lepton na płytce stykowej, połączony z Raspberry Pi

Rysunek 4. a) Opcja SPI w raspi-config, b) okno potwierdzenia uruchomienia interfejsu SPI, c) okno z informacją o uruchomieniu SPI

Kolejnym krokiem, po aktualizacji systemu, jest konfiguracja sprzętowych portów Raspberry Pi - SPI oraz I2C. Domyślnie, po instalacji świeżej kopii systemu operacyjnego interfejsy te są wyłączone. Aby je uruchomić, w terminalu wpisujemy:

sudo raspi-config

Uruchomi się narzędzie do konfiguracji naszego komputera. Wybieramy „Advanced Options” a tam wybieramy SPI, potwierdzamy, naciskając YES i klikamy w kolejnym oknie OK (patrz rysunek 4). Następnie potwierdzamy chęć automatycznego ładowania modułu jądra ze sterownikiem interfejsu SPI i potwierdzamy nasz wybór (patrz rysunek 5). Analogicznie postępujemy z ustawieniami dla I2C. Teraz w menu głównym konfiguratora wybieramy opcję finish i resetujemy komputer (konfigurator zapyta nas, czy chcemy go ponownie uruchomić).

Instalacja potrzebnego oprogramowania

Po skonfigurowaniu komputera możemy przystąpić do instalacji potrzebnego oprogramowania. W pierwszej kolejności musimy zainstalować bibliotekę Qt wraz z zestawem narzędzi deweloperskich do tworzenia graficznego interfejsu użytkownika. Aby zainstalować pakiet narzędzi deweloperskich, w terminalu wpisujemy komendę:

sudo apt-get install qt4-dev-tools

Podczas instalacji zostaniemy zapytani, czy chcemy ją kontynuować. Potwierdzamy, naciskając klawisz „y”, co pozwoli APT pobrać i następnie zainstalować ten pakiet wraz z wszystkimi jego zależnościami i wymaganymi bibliotekami. Kolejnym krokiem jest pobranie oprogramowania kamery, któremu przyjrzymy się dokładniej w dalszej części artykułu. Oprogramowanie, w postaci pliku .zip możemy pobrać z repozytorium na GitHubie. Archiwum należy wypakować, by uzyskać dostęp do plików. W tym celu, w folderze, w którym chcemy trzymać pliki tego projektu, wprowadzamy w terminalu następujące komendy:

wget https://github.com/groupgets/LeptonModule/archive/master.zip
unzip master.zip

Możemy także skorzystać z wbudowanego w system klienta gita i sklonować repozytorium na Raspberry Pi, wpisując w docelowym folderze w terminalu komendę:

git clone https://github.com/groupgets/LeptonModule.git

Następnie możemy przejść do folderu master/raspberrypi_video/leptonSDKEmb32PUB i skompilować gotowy program, wpisując w terminalu po kolei:

make
cd /home/pi/master/raspberrypi_video
qmake && make
sudo ./raspberrypi_video

gdzie /home/pi/master/raspberrypi_video to folder, w którym znajduje się pobrane przez nas wcześniej repozytorium. W ten sposób skompilowaliśmy i uruchomiliśmy oprogramowanie dedykowane do obsługi kamery FLIR Lepton. Jednakże, jako profesjonaliści, musimy zajrzeć do środka kodu i przeanalizować najważniejsze jego bloki, aby zrozumieć, jak działa ten software.

Kod programu do obsługi kamery FLIR Lepton

Rysunek 5. a) Okno z pytaniem o uruchamianie modułu jądra z obsługą SPI przy starcie systemu, b) potwierdzenie domyślnego ładowania modułu

Rysunek 6. a) Obraz o wysokiej jednorodności (normalny), b) obraz ziarnisty (szum o dużej częstotliwości przestrzennej), c) obraz plamisty (szum o małej częstotliwości przestrzennej)

Pierwszym plikiem, jakiemu warto się przyjrzeć, jest main.cpp, zaprezentowany na listingu 1. Program korzysta z dwóch plików nagłówkowych LeptonThread.h oraz MyLabel.h, oprócz oczywiście plików nagłówkowych samego Qt. W pierwszym z nich znajduje się kod obsługujący kamerę Lepton - definicja wątku pobierającego dane z kamery, a także funkcje, pozwalające na wydawanie urządzeniu komend, takich jak wykonanie FFC. W drugim pliku natomiast znajduje się definicja etykiety Qt z obrazem, co umożliwia jego prezentację, jednakże analiza tego pliku nie jest tutaj niezbędna, gdyż to, co nas najbardziej interesuje, to komunikacja z kamerą - framework i sposób prezentacji danych, to kwestia wtórna.

Przesył danych z kamery odbywa się poprzez interfejs SPI. W pliku LeptonThread.cpp znajduje się m.in. definicja metody run() z obiektu wątku do obsługi kamery Lepton. Definicję tej funkcji pokazano na listingu 2. Metoda run() po uruchomieniu inicjalizuje interfejs SPI, a następnie odczytuje pewną liczbę pakietów (PACKETS_PER_FRAME zdefiniowane w pliku jako 60). W przypadku wystąpienia tzw. drop packet, informującego o zatrzymaniu lub braku transmisji, licznik pakietów zostaje zresetowany do zera. 750 takich resetów powoduje reset całego systemu, włącznie z ponowną inicjalizacją portu SPI w układzie. Po poprawnym odebraniu wszystkich pakietów ramki wektor results przekazywany jest do dalszej funkcji, która ustawia każdy piksel obrazka myImage metodą setPixel(kolumna, rząd, kolor). Jednocześnie obrazek jest normalizowany tak, aby optymalnie pokryć całą przestrzeń barwną. Iterując po wszystkich pikselach, algorytm odnajduje najmniejszą i największą wartość z kamery (odpowiednio minValuemaxValue). Na podstawie tych wartości wyznaczana jest rozpiętość temperatury (diff = maxValue - minValue), która po podzieleniu przez nią liczby 255 (liczba kolorów w obrazie) daje nam skalę (scale = 255/diff) użytą do normalizacji (wartość tego piksela:

value = (frameBuffer[i] - minValue) * scale

gdzie frameBuffer to bufor całej ramki obrazu). Gdy już cały obraz zostanie znormalizowany i załadowany do myImage, wyemitowany zostaje sygnał dla interfejsu Qt, informujący o tym, że obraz wyświetlany na ekranie może zostać zaktualizowany.

LeptonThread.cpp znajdziemy także odwołanie do funkcji lepton_perform_ffc(). Służy ona do uruchomienia funkcji FFC - rekalibracji sensora, mającej na celu poprawienie jednorodności jego pracy. FFC uruchamiać należy w momencie, gdy obraz, jaki widzimy, przypomina środkowy lub prawy obraz, pokazany na rysunku 6. Implementacja funkcji lepton_perform_ffc() znajduje się w pliku Lepton_I2C.cpp, który pokazany jest na listingu 3. Funkcja lepton_perform_ffc() uruchamia jedynie połączenie z kamerą Lepton (poprzez interfejs I2C) i wykorzystuje funkcję z SDK, które dostarcza FLIR, wraz z samą kamerą. W pliku Lepton_I2C.cpp oraz Lepton_I2C.h zaimplementować można oczywiście i inne funkcje, jakie dostępne są w SDK.

Podsumowanie

W powyższym artykule przedstawiliśmy ciekawy projekt amatorskiej kamery termowizyjnej, opartej na sensorze FLIR Lepton. Sensor ten nie jest tanim elementem - w zależności od wersji i tego, czy jest zainstalowany na gotowej płytce PCB, kosztuje od kilkuset, do nawet 1,5 tysiąca złotych - to i tak jest o wiele tańsze rozwiązanie, niż dedykowana kamera termowizyjna. Dodatkowo, dzięki standardowym interfejsom - SPI oraz I2C - moduł ten z łatwością może zostać podłączony do dowolnego mikrokontrolera, płytki rozwojowej czy komputera jednopłytkowego. Ogromna elastyczność modułu i łatwość jego oprogramowania, dzięki dedykowanemu SDK, jest jego ogromną zaletą.

Nikodem Czechowski

Źródła:

 

  • http://bit.ly/2YIg7FN
  • http://bit.ly/32gyrIg

 

Artykuł ukazał się w
Elektronika Praktyczna
sierpień 2019
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik marzec 2020

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio kwiecień 2020

Świat Radio

Magazyn użytkowników eteru

APA - Automatyka Podzespoły Aplikacje marzec 2020

APA - Automatyka Podzespoły Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna marzec 2020

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Praktyczny Kurs Elektroniki 2018

Praktyczny Kurs Elektroniki

24 pasjonujące projekty elektroniczne

Elektronika dla Wszystkich kwiecień 2020

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów