Kiedy zacząłem pisać ten artykuł, plan był taki, żeby opisać tu pierwsze doświadczenia związane z uruchomieniem ESP32 i pracą nad węzłem czujników stacji pogodowej. Okazało się jednak, że będzie to sporo materiału - znacznie więcej, niż się spodziewałem. Dlatego postanowiłem podzielić ten artykuł na dwie części. Jak opisałem to w poprzednim artykule i w dokumentacji, pierwszy węzeł miał zawierać szereg czujników mierzących m.in. temperaturę, ciśnienie atmosferyczne, wilgotność oraz natężenie światła. Uruchomienie go będzie składać się z kilku etapów: 1) uruchomienie samego ESP32 i weryfikacja, czy działa, 2) krótki eksperyment z elementami dołączanymi do ESP (prosty układ z migającą diodą), 3) podłączanie poszczególnych czujników i weryfikacja, czy wszystko jest w porządku oraz czy dane z czujników schodzą poprawnie. Prototyp urządzenia jest dość delikatny, więc na początku będę monitorował dane w pomieszczeniu. W pierwszej części tego artykułu skupię się na samym uruchomieniu ESP32 z dodaniem migającej diody, a w drugiej pokażę realizację całego węzła czujników.
Kod pozwalający na uruchomienie węzła z czujnikami jest dostępny na GitHub, więc można sobie tam zaglądać w trakcie czytania oraz pobrać kod i uruchomić go na swoim sprzęcie.
Co będzie potrzebne przy uruchomieniu węzła czujników
Poniżej wymieniam listę elementów potrzebnych do uruchomienia węzła czujników.
Dwie płytki stykowe 35 x 47 mm, 170 otworów każda
ESP32-DevKitC
Czujnik ciśnienia i temperatury - Grove BMP280
Czujnik temperatury i wilgotności - DHT11
Fotorezystor
Analogowy czujnik temperatury - LM35DZ
Rezystor 4,7 kΩ
Rezystor 10 kΩ
Zielona dioda LED
Rezystor 330 Ω
Procedura podłączenia płytki ESP do komputera i wgranie pierwszego programu
Jak zaznaczyłem na początku, cały proces chciałem zacząć od uruchomienia ESP32 i sprawdzenia, czy w ogóle działa. Żeby zrobić to szybko, potrzebowałem środowiska Visual Studio Code z zainstalowaną wtyczką PlatformIO, samej płytki rozwojowej ESP32-DevKitC oraz przewodu USB ↔ micro USB do przesyłania danych.
Pierwsze uruchomienie płytki traktuję jako osobny eksperyment dostępny w projekcie, w katalogu experiments - /experiments/exp-1.0-chip-id.
Przy pierwszym uruchomieniu ESP32 chciałbym osiągnąć kilka celów:
Podłączyć zieloną diodę LED do układu i zaprogramować, by migała
Zaprogramować miganie niebieskiej diody LED na płytce rozwojowej
Wystawić na port szeregowy podstawowe informacje na temat płytki
Na początku umieszczam płytkę rozwojową ESP32-DevKitC na dwóch płytkach stykowych i dodaję rezystor 330 Ω oraz zieloną diodę LED wg opisu: dłuższa nóżka diody zostaje podłączona do pinu D4 (GPIO4) płytki rozwojowej, a krótsza z nóżką rezystora tworzy węzeł. Druga nóżka rezystora zostaje podpięta do pinu GND płytki rozwojowej.
Po umieszczeniu elementów na płytce stykowej podłączam płytkę za pomocą USB do komputera. Po podłączeniu do komputera na płytce rozwojowej zapala się czerwona dioda świadcząca o tym, że do urządzenia doprowadzono zasilanie. Następnie w menedżerze urządzeń sprawdzam, czy pojawił się nowy wpis w portach COM i LPT. W moim wypadku tak nie było. Musiałem zweryfikować, co jest nie tak. Menedżer urządzeń wskazywał wykrzyknikiem na urządzenie, które nie działa. Był to konwerter USB ↔ UART CP2102 znajdujący się na płytce rozwojowej. Próbowałem najpierw pobrać sterowniki do urządzenia ze strony producenta. Niestety, w dniu, w którym próbowałem je pobrać ze strony producenta Silicon Labs, było to niemożliwe (ale w ciągu 24 godzin problem po stronie producenta został naprawiony). Dlatego spróbowałem zaktualizować sterowniki przez usługę Windows Update. Niestety, to również skończyło się niepowodzeniem. W końcu udało mi się zaktualizować sterowniki na stronie https://catalog.update.microsoft.com/, co szczegółowo opisuję w części Brak sterowników. W końcu w menedżerze urządzeń pojawił się port COM5 do komunikacji z ESP32-DevKitC.
Po uruchomieniu VS Code utworzyłem nowy projekt z pluginem PlatformIO (New Project). W polu Board wybrałem ESP32 Dev Module i wybrałem framework Arduino. Po utworzeniu projektu PlatformIO tworzy strukturę projektu, dodając foldery i pliki. Jednym z nich jest plik platform.ini, w którym należy ustawić szybkość transmisji dla UART, żeby można było podglądać logi ESP. Do istniejącego pliku dopisałem więc zmienną monitor_speed = 115200. Całość pliku wygląda teraz tak:
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200W katalogu src jest prosty, gotowy plik main.cpp, który można od razu wgrać na urządzenie. Treść tego pliku na ten moment jest drugorzędna, ponieważ chodzi tylko o to, by uruchomić urządzenie i sprawdzić, czy mamy jakąkolwiek komunikację. Program wgrywa się do pamięci Flash strzałką na dolnym pasku (PlatformIO: Upload) lub komendą pio run -t upload na terminalu (trzeba przenieść się do katalogu \experiments\exp-1.0-chip-id, żeby ta komenda działała). W terminalu zaczynają się wyświetlać informacje związane z wgrywaniem programu do pamięci flash m.in. postęp zapisywania programu. Po poprawnym wgraniu programu na płytce od razu widzę zasadniczą zmianę - zielona i niebieska dioda LED migają tak, jak zakładałem.
Sprawdźmy, czy port szeregowy działa i czy są na nim przesyłane jakieś dane. Żeby włączyć monitor portu szeregowego, trzeba kliknąć w ikonkę wtyczki elektrycznej (z prawej strony poprzedniej ikony wgrywania programu). Można to zrobić również wpisując komendę w terminalu pio device monitor. Po uruchomieniu monitora widać podstawowe informacje o płytce:
=== Who am I? ===
Chip model: ESP32-D0WD-V3
Revision: 3
Cores: 2
CPU Frequency: 240 MHz
Flash: 4 MB
MAC (eFuse): 50676FCA4B70
SDK: v4.4.7-dirtyTe wszystkie dane dowodzą, że upload programu został wykonany poprawnie i ESP32 komunikuje się ze światem zewnętrznym przez port szeregowy - no i miga diodami.
Co tu się wydarzyło
Mamy potwierdzenie, że ESP działa i komunikuje się z komputerem. Jak to się dzieje i co to jest UART, zostanie opisane w osobnym artykule. Skupmy się na tym, co się stało po naciśnięciu przycisku Upload.
Kompilacja
Kod z main.cpp oraz framework Arduino są kompilowane do jednego pliku binarnego firmware.bin, który następnie musi zostać przesłany do ESP32. Żeby tak się stało, ESP32 musi wejść w specjalny tryb programowania.
Tryb programowania
Ten tryb uruchamia się, gdy na dwie linie sygnałowe ESP32 wprowadzimy określony stan wejść. Chodzi konkretnie o linie EN i GPIO0. W układach elektronicznych mikrokontrolerów 0 i 1 realizuje się przez odpowiednie poziomy napięcia na konkretnych liniach. Dla mikrokontrolera ESP32 jest to napięcie do ~0,8 V (logiczne zero) i napięcie powyżej ~2,5 V (logiczne 1). Strefa pomiędzy jest celowo pomijana, by zapewnić odporność na zakłócenia. Działa to podobnie na innych mikrokontrolerach, przy czym to, co jest zmienne, to poziomy napięć odpowiadające 0 i 1 (dostępne w dokumentacji poszczególnych MCU). Wracając do linii EN i GPIO0, żeby uruchomić tryb programowania, linia GPIO0 podczas resetu musi znajdować się w stanie 0. Kiedy taki stan pojawi się na ESP32, ROM bootloader (program na stałe wgrany w mikrokontrolerze) przełącza tryb pracy mikrokontrolera na przyjmowanie przesyłanych plików programu.
No dobrze, ale przy pierwszym uruchamianiu opisanym wyżej nie robiłem nic przy liniach EN i GPIO0, więc dlaczego to mimo wszystko działa? Otóż tajemnica tkwi w układzie CP2102. Steruje on m.in. liniami DTR i RTS, które z kolei dzięki układom połączonych z nimi tranzystorów wprowadzają w odpowiedni stan linie EN i GPIO0, więc nie musimy niczego na tych liniach zmieniać sami.
Przesyłanie i zapisywanie programu
Kiedy jesteśmy już w trybie programowania, esptool.py (program Pythonowy obsługujący komunikację szeregową utrzymywany przez producentów ESP32) wysyła nasz skompilowany wcześniej program i zapisuje go w odpowiednim miejscu w pamięci flash.
Reset
Po zapisaniu programu esptool.py zazwyczaj resetuje układ, ale tym razem wprowadza go już w normalny tryb pracy. Po uruchomieniu płytki wszystko powinno już działać zgodnie z programem, który został wgrany do pamięci. I tak, jak już pisałem wyżej, widzimy migające diody oraz wypisy na monitorze portu szeregowego świadczące o tym, że wszystko działa tak, jak się spodziewaliśmy.
Uruchomienie węzła czujników
Po prostych eksperymentach przyszedł wreszcie czas na uruchomienie całego węzła czujników. Jak realizowałem uruchamianie poszczególnych elementów, a w końcu całego węzła? To będzie tematem części drugiej tego artykułu, która ukaże się jako kolejny wpis.
Rozwiązywanie problemów
Ta część artykułu może być przydatna, jeśli nie uda Ci się, tak jak to było w moim przypadku, zainstalować sterowników do CP2102 i nie będzie ich na stronie producenta. Jeśli nie wystąpił u Ciebie ten problem, spokojnie możesz pominąć czytanie tej części. Jeśli jednak jesteś ciekaw, jak można sobie z takim problemem poradzić, to zapraszam do kontynuowania.
Brak sterowników
Jak wspominałem na początku, przy pierwszym uruchomieniu płytki miałem problem ze sterownikami do konwertera USB↔UART - i co ciekawe - nie mogłem ich pobrać ani ze strony producenta silabs.com, ani nie udało się automatycznie pobrać sterowników z Windows Update uruchamianym z poziomu Windows. Znalazłem jednak inną opcję - https://catalog.update.microsoft.com/. Jest to oficjalna wyszukiwarka Microsoftu udostępniająca m.in. sterowniki. Każde urządzenie ma indywidualny identyfikator, po którym możemy wyszukać tutaj najnowsze sterowniki. Identyfikator sprzętu znajdujemy po dwukrotnym kliknięciu w menedżerze urządzeń na konkretne urządzenie (otwiera się okno właściwości urządzenia), a następnie w zakładce „Szczegóły” szukamy właściwości „Identyfikator sprzętu”. Po wybraniu jej pokaże nam się identyfikator, który możemy skopiować i wyszukać sterowniki do niego w serwisie https://catalog.update.microsoft.com/. Warto zaznaczyć, że wyszukiwanie będzie zwracało wynik, gdy zapytanie ograniczymy do identyfikatora producenta (VID) i sprzętu (PID) czyli na przykład identyfikator sprzętu USB\VID_10C4&PID_EA60&REV_0100 powinniśmy ograniczyć do USB\VID_10C4&PID_EA60 .
Po pobraniu sterowników (format pliku .cab) należy je rozpakować komendą:
# Poniże nazwy katalogów są przykładowe
# mkdir tworzy nowy katalog
mkdir C:\cp210x
# Rozpakowuje skompresowany plik .cab z zachowaniem dokładnej struktury katalogów
expand -F:* "C:\Users\TwojaNazwa\Downloads\nazwa_pliku.cab" C:\cp210x
Następnie wracamy do właściwości urządzenia i przechodzimy do zakładki „Aktualizuj sterownik”, a potem wybieramy opcję „Przeglądaj mój komputer w poszukiwaniu sterowników” i wskazujemy ścieżkę do odpowiedniego katalogu (C:\cp210x z przykładu). Po wykonaniu powyższych kroków sterowniki powinny zostać poprawnie zainstalowane.
Mam nadzieję, że jeśli u kogokolwiek wystąpi problem ze sterownikiem, uda się go rozwiązać w opisany sposób. Jeśli nie, dawajcie znać w komentarzach, z jakimi jeszcze problemami się zetknęliście. Tymczasem zapraszam do lektury kolejnej części artykułu dot. uruchamiania stacji pogodowej.


