forked from Akcelerometry_drgania_WMT/PI_mikrokontroler
4.0 KiB
4.0 KiB
Prezentacja Projektu: Moduł Mikrokontrolera ESP32 (Akwizycja Danych z ADXL345)
1. Technologia
W mojej części aplikacji (firmware mikrokontrolera) wykorzystane zostały następujące technologie i narzędzia:
- Sprzęt: Płytka rozwojowa Freenove ESP32-S3 WROOM, zewnętrzny czujnik przyspieszenia/drgań ADXL345 (komunikacja przez szynę SPI), karta SD do lokalnego przechowywania danych.
- Środowisko i Język: PlatformIO (C++ dla środowiska Arduino).
- System operacyjny czasu rzeczywistego (RTOS): FreeRTOS wbudowany w ESP32 – wykorzystany do wielowątkowości i podziału zadań pomiędzy rdzenie (Core 0 i Core 1).
- Komunikacja Sieciowa i API:
- Wi-Fi (konfiguracja sieci wczytywana bezpośrednio z pliku
wifi.txtzapisanego na karcie SD). - Klient HTTP (REST API) implementujący uwierzytelnianie (Basic Auth) i przesyłanie plików.
- Wi-Fi (konfiguracja sieci wczytywana bezpośrednio z pliku
- Formatowanie danych:
ArduinoJsondo parsowania ustawień konfiguracyjnych oraz tworzenia ładunków dla API.
2. Prezentacja działania
Moduł stanowi serce układu akwizycji pomiarowej. Poniżej główne założenia jego działania:
- Tryb Konfiguracji: Podczas uruchamiania, urządzenie wczytuje poświadczenia docelowej sieci Wi-Fi bezpośrednio z pliku konfiguracyjnego
wifi.txtumieszczonego na karcie SD. Pozwala to na szybką zmianę sieci bez konieczności rekonfiguracji przez webowy interfejs. - Zbieranie danych z czujnika: Na głównym rdzeniu działa precyzyjna pętla (Task), która ze zdefiniowaną częstotliwością odpytuje czujnik ADXL345 przez szynę SPI, gromadząc surowe dane na temat drgań.
- Zapis na nośnik nielotny: Zebrane pakiety danych są zrzucane w zoptymalizowany sposób (zapobiegając blokowaniu odczytów) do binarnych plików z rozszerzeniem
.wmtna kartę pamięci SD. - Zarządzanie Uploadem w tle: Niezależne zadanie we FreeRTOS (
UploadManagerna Core 0) monitoruje kartę SD. Jeśli znajdzie zamknięte i gotowe pliki, nawiązuje autoryzowane połączenie z zewnętrznym serwerem FastAPI i sekwencyjnie wysyła te pliki. Jeśli wystąpi błąd (np. brak sieci), pliki pozostają bezpieczne na karcie SD i proces powtarza się później.
3. Problemy
Podczas realizacji tej części systemu napotkałem i musiałem rozwiązać szereg problemów:
- Kolidowanie czasu rzeczywistego z operacjami dyskowymi: Zapis plików na kartę SD bywa blokujący i powodował "wypadanie" próbek ze strumienia danych z akcelerometru. Rozwiązaniem było dokładne rozdzielenie wątków, zastosowanie buforów i unikanie przerw dzięki FreeRTOS.
- Watchdog Timeouts (WDT): Ciężkie i przedłużające się operacje sieciowe lub plikowe powodowały restart mikrokontrolera ze strony sprzętowego watchdoga. Wymagało to strojenia czasów pętli we FreeRTOS oraz dodawania instrukcji yield/delay uwalniających zasoby.
- Autoryzacja (401 Unauthorized) z serwerem i bezpieczeństwo API: Skonfigurowanie płynnego logowania i autoryzacji sprzętu, tak aby backend poprawnie weryfikował zgłaszający się po WiFi mikrokontroler przed odbiorem plików pomiarowych.
- Problemy z odczytem konfiguracji z karty SD: Konieczność zapewnienia poprawnego i niezawodnego odczytu oraz parsowania pliku
wifi.txtw początkowej fazie rozruchu mikrokontrolera (zanim wystartują główne wątki sieciowe).
4. Do zrobienia
- Implementacja pełnego szyfrowania (HTTPS/SSL): Zabezpieczenie ruchu do REST API z wykorzystaniem zaufanych lub wbudowanych certyfikatów na ESP32 (obecnie wymaga to odpowiednich optymalizacji pamięci).
- Testy stresowe (długodystansowe): Uruchomienie układu w warunkach symulujących środowisko docelowe bez przerwy przez klika tygodni, by zbadać zachowanie alokacji pamięci masowej na karcie SD w przypadku pełnego zapełnienia.
- Dokładna synchronizacja czasu (RTC / NTP): Integracja dokładnego mechanizmu czasu z siecią tak, by tworzone na karcie SD pliki miały zawsze poprawny i bardzo precyzyjny stempel czasowy, niezależnie od tego czy mikrokontroler miał pełny restet z odłączeniem baterii.