Celem projektu było opracowanie autonomicznego i energooszczędnego systemu badania stężenia dymu w celu wykrywania pożaru. Wyniki pomiarów powinny być wyświetlane w sposób czytelny na wyświetlaczu typu e-Paper. Projekt obejmuje opracowanie układu wykrywania dymu bazującego na czujniku BME688, z oprogramowaniem napisanym w języku C/C++ i działającym na rdzeniu RISC-V mikrokontrolera RP2350, umieszczonego na płytce Raspberry Pi Pico 2.
W ramach projektu została zastosowana dwuwarstwowa, sztuczna sieć neuronowa, analizująca na wejściu cztery ostatnie próbki, odczytane z czujnika BME688. Sieć stwierdza, czy w pomieszczeniu wykryto pożar. Model wytrenowany został na danych pozyskanych przez ręczne umieszczenie ognia w pobliżu czujnika dymu i rejestrację jego wpływu na odczyty sensora.
Rdzeń RISC-V Hazard3
Rdzeń RISC-V Hazard3 [13] zawiera trójstopniowy procesor potokowy o architekturze obsługującej listę instrukcji RV32IMAC z dodatkowymi rozszerzeniami: Zba – instrukcje generowania adresów (indeksowania), Zbb, Zbs, Zbkb – operacje bitowe, Zcb – rozszerzony zestaw instrukcji 16-bitowych, Zcmp – push/pop i podwójne przesłania, Zicsr – dostęp do rejestrów sterujących oraz Hh3power, Xh3bextm – własne instrukcje rdzenia Hazard3. Sterownik przerwań użyty w rdzeniu ma funkcjonalność równoważną z ARM NVIC.
Płytka RPi Pico2 firmy Raspberry Pi
Nowe płytki Pico2 i Pico 2W firmy Raspberry Pi z procesorem RP2350 są zgodne pod względem elektrycznym z płytkami Pico pierwszej serii (Pico/Pico W) [7]. Na płytkach zostały zastosowane układy pamięci NOR Flash z serii W25Q (Winbond) o częstotliwości pracy do 133 MHz (przepustowość do 66 MB/s) [15]. Dokładny opis został zamieszczony w artykule „Płytka Raspberry Pi Pico 2/2W z procesorem RP2350” [17].
Płytka Pico 2 zawiera przetwornicę buck-boost, która dostarcza napięcie 3,3 V (do zasilania RP2350 i obwodów zewnętrznych) z szerokiego zakresu napięć wejściowych (od 1,8 do 5,5 V), co zapewnia znaczną elastyczność w zasilaniu urządzenia z różnych źródeł, takich jak pojedyncze ogniwo litowo-jonowe lub 3 ogniwa AA połączone szeregowo. Najprostszym sposobem zasilania Pico 2 jest skorzystanie z umieszczonego na płytce gniazdka Micro USB. W dokumentacji płytki pokazano ponadto, jak poprzez dodanie tranzystora MOS można zrealizować podtrzymanie bateryjne zasilania płytki [13].
Środowisko uruchomieniowe
Do realizacji projektu użyto środowiska uruchomieniowego bazującego na Microsoft Visual Studio Code. Po jego zainstalowaniu i uruchomieniu należy zainstalować rozszerzenie Raspberry Pi Pico. Po poprawnej instalacji w pasku bocznym pojawi się ikona Raspberry Pi Pico Project.
Wbudowane oprogramowanie płytki Pico umożliwia łatwe ładowanie kodu do pamięci mikrokontrolera. Oprogramowanie do załadowania ma postać pliku w formacie UF2.
Do debugowania oprogramowania niezbędny jest odpowiedni interfejs; można w tym celu użyć drugiej płytki Pico, ładując do niej oprogramowanie interfejsu debugowania, dostępne w postaci gotowego pliku UF2. Użycie RPi Pico do debugowania innego modułu Pico 2 wymaga wykonania połączeń zgodnie ze schematem zamieszczonym w dokumentacji [16]. Zastosowanie na płytce Pico/Pico2 diody pomiędzy szyną VBUS i VSYS umożliwia jednoczesne dołączenie kabli USB do płytki Pico2 oraz płytki pracującej jako debuger.
Mikrokontrolery serii RP235x, używane w Pico 2, umożliwiają wybór jednego z dwóch typów rdzeni procesora podczas inicjalizacji oprogramowania. Aktywacja rdzenia jest wykonywana przez wbudowane oprogramowanie mikrokontrolera, zawarte w jego pamięci stałej, na podstawie informacji odczytanej z zewnętrznej pamięci Flash. Interfejs debugowania komunikuje się wyłącznie z aktywnym rdzeniem procesora.
Aktualnie dostępne oprogramowanie narzędziowe nie umożliwia późniejszej zmiany aktywnego rdzenia w trakcie pracy modułu, np. przy użyciu interfejsu debugowania. Oznacza to, że jedyną aktualnie dostępną metodą zmiany aktywnego rdzenia (ARM Cortex-M33/RISC-V Hazard) jest załadowanie (w trybie bootowania) dowolnego pliku UF2, zawierającego oprogramowanie działające na wybranym rdzeniu. Oprogramowanie to nie musi nawet poprawnie działać, istotny jest jedynie sam fakt załadowania go do pamięci.
Aktualny wybór aktywnego rdzenia może zostać odczytany z płytki w trybie bootowania przy użyciu narzędzia picotool.
SDK (Software Development Kit) to kolekcja narzędzi i kodu źródłowego do interakcji z zasobami sprzętowymi mikrokontrolera. Jest ona instalowana przez rozszerzenie Raspberry Pi Pico. Przy tworzeniu pierwszego projektu na architekturę RISC-V następuje dosyć czasochłonna instalacja oprogramowania narzędziowego do obsługi tego rdzenia.
Po skompilowaniu projektu należy załadować go w trybie bootowania, używając ikony Run w dolnym pasku. Jest to niezbędne, jeśli uprzednio na płytce działało oprogramowanie korzystające z rdzenia Cortex-M. Tylko w ten sposób następuje aktywowanie rdzeni RISC-V, co stanowi warunek konieczny do późniejszego podłączenia debuggera do tych rdzeni. Przy kolejnych poprawkach projektu można używać funkcji debugowania, bez wprowadzania mikrokontrolera w tryb bootowania.
Debugowanie RISC-V uruchamiamy używając konfiguracji Pico Debug (Cortex-Debug).
Debugger używany przez rozszerzenie Raspberry Pi Pico nie umożliwia wyświetlania zawartości rejestrów ani deasemblacji kodu maszynowego procesora RISC-V. Jest możliwe jedynie debugowanie na poziomie kodu źródłowego C. Pełne debugowanie RISC-V wymaga zainstalowania i skonfigurowania debuggera gdb dla RISC-V.
Czujnik BME688
Czujnik BME688 firmy Bosch [9], służący do detekcji temperatury, wilgotności, ciśnienia oraz stężeń VOC i VSC, skalibrowany został w trybie forced, zgodnie z przykładami dostarczonymi przez producenta na stronie biblioteki. Biblioteka ta została użyta w celu komunikacji z czujnikiem.
Wyświetlacz E-Ink
Wyświetlacz Pico-Inky firmy Pimoroni [8] skonfigurowany został z wykorzystaniem SDK dostarczonego przez producenta [3]. Ze względu na skąpą dokumentację, w celu połączenia z mikrokontrolerem konieczne było zapoznanie się z dostarczonym przez producenta kodem źródłowym pakietu picographics [4] w języku MicroPython. Dzięki temu odkryto, że w przypadku wyświetlacza Pico-Inky konieczne jest skorzystanie ze sterownika układu UC8151 oraz interfejsu SPI. Znaleziono również informację o rozmiarze bufora ramki dla tego wyświetlacza. Opracowana metoda obsługi wyświetlacza e-Ink znajduje się w pliku src/fire_detector/logger/pico_inky_logging_resource.cpp.