Przedstawię tu wszechstronny moduł ESP32-S3-POE-ETH-8DI-8RO oferujący szeroki zakres możliwości komunikacyjnych oraz sterujących. Urządzenie łączy w sobie Ethernet, Wi-Fi, Bluetooth, wejścia cyfrowe oraz wyjścia przekaźnikowe, dzięki czemu nadaje się do różnych projektów z dziedzin automatyki i IoT. Dodatkowo obsługa PoE upraszcza instalację i zasilanie w trudnodostępnych miejscach. Całość jest łatwa w programowaniu przez Visual Code i PlatformIO, co tutaj również pokażę - moje przykłady pokryją podstawową funkcjonalność urządzenia.
Tego typu moduły występują często w handlu pod nazwą "przemysłowy". Prezentowany tu model jest oznaczony kodem SKU 30838.
W zestawie jest moduł, antenka oraz mały śrubokręcik.
Z przodu mamy 8 wyjść przekaźnikowych - zarówno normalnie otwarte, jak i normalnie zamknięte, oczywiście też styk wspólny.
Z tyłu Ethernet (PoE), antena, dioda RGB (WS2812), przycisk boot, wejścia cyfrowe, zasilanie (do 36 V) i RS485.
Nie widzę tu natomiast przycisku RESET ESP, jest on widoczny dopiero po zdjęciu pokrywy.
Teraz możemy odnieść się już do dokumentacji od WaveShare. Co mamy na pokładzie:
1. ESP32-S3
Częstotliwość pracy do 240 MHz, z WiFi 2,4 GHz oraz BLE
2. Wysokiej jakości przekaźnik
Obciążalność styków na kanał: ≤10A 250V AC lub ≤10A 30V DC
3. Izolacja optoizolatora
Zapobiega zakłóceniom układu sterującego przez zewnętrzny obwód wysokiego napięcia podłączony do przekaźnika
4. Przycisk RESET
5. Port PoE
Możliwość podłączenia modułu PoE (tylko wersja z portem PoE)
6. Przycisk BOOT
7. Układ zasilania
8. Izolacja cyfrowa
Zapobiega zakłóceniom układu sterującego przez sygnał zewnętrzny
9. Izolacja zasilania
Zapewnia stabilne napięcie izolacji, nie wymaga dodatkowego zasilania dla strony izolowanej
10. Dwukierunkowa izolacja optoizolatora
11. Złącze baterii RTC
12. Buzzer (brzęczyk)
13. Interfejs wejścia cyfrowego
14. Złącze pinowe
Możliwość podłączenia innych urządzeń
15. Wskaźnik stanu pracy
PWR: wskaźnik zasilania
RXD: wskaźnik odbioru RS485
TXD: wskaźnik nadawania RS485
16. Interfejs USB Type-C
Do zasilania modułu, wgrywania firmware oraz komunikacji USB
17. Kolorowa dioda LED WS2812 RGB
Sterowana przez pin GPIO38
18. Port sieciowy
19. Gniazdo anteny zewnętrznej
Złącze SMA żeńskie, do komunikacji bezprzewodowej WiFi i Bluetooth
20. Śrubowe złącze zasilania
Obsługuje szeroki zakres napięcia 7~36V DC
21. Interfejs komunikacyjny RS485
Obsługa podłączania zewnętrznych urządzeń RS485
22. Rezystor terminujący RS485
Wbudowany rezystor 120Ω, włączany za pomocą zworki
23. Śrubowe złącze przekaźnika
Ułatwia podłączanie urządzeń
24. Wbudowany TVS (tłumik przepięć) Skutecznie tłumi napięcia udarowe oraz krótkotrwałe skoki napięcia w obwodzie
25. Układ konwersji RS485
26. MP1605GTF-Z Moduł zasilania DC-DC
27. PCF85063ATL Układ RTC do realizacji zadań czasowych
28. TCA9554PWR Rozszerza linie IO do sterowania przekaźnikami
29. W5500 Rozszerza połączenie sieciowe 10/100Mbps przez interfejs SPI
30. Gniazdo karty TF Obsługuje zewnętrzne karty TF do przechowywania obrazów i plików
Schemat ideowy:
Wymiary:
Dodatkowe zdjęcia:
Hello World LAN
Program wgrywany jest przez USB. W celu ułatwienia pracy z UART, wyjście logu skierowałem na CDC, czyli wirtualny port szeregowy.
Plik platformio.ini:
[env:esp32-s3-poe-eth-8di-8ro]
platform = https://github.com/tasmota/platform-espressif32/releases/download/2024.08.10/platform-espressif32.zip
board = esp32-s3-devkitc-1
framework = arduino
monitor_speed = 115200
upload_port = COM60
monitor_port = COM60
build_flags =
-D ARDUINO_USB_MODE=1
-D ARDUINO_USB_CDC_ON_BOOT=1
Kontroler LAN podłączony jest przez SPI. Wymaga odpowiednio zmapowanych pinów.
Kod: C / C++
Na starcie programu inicjujemy SPI i Ethernet. Reszta będzie odbywać się w tle.
Kod: C / C++
Biblioteka odpowiedzialna za połączenie automatycznie publikuje eventy, które można wykorzystać do śledzenia stanu łączności. DHCP na routerze samo nadaje IP płytce.
Kod: C / C++
Zostaje tylko serwery - my jedynie definiujemy dostępny tam zasoby i zwracaną przez nich treść wraz z typem MIME. Całą obsługę HTTP wykonuje biblioteka WebServer.
Kod: C / C++
Rezultat - serwer dostępny jest przez kabelek i działa poprawnie.
Kontrola przekaźników
Przekaźników jest osiem, ale nie są dostępne na zwykłych GPIO. Do ich kontroli służy expander pinów TCA9554 sterowany przez interfejs I2C. Pozwala to zmniejszyć liczbę wymaganych GPIO aż do tylko dwóch (SCL i SDA) oraz współdzielić magistralę z innymi urządzeniami.
Dołączamy nagłówek magistrali I2C, definiujemy jej piny, adres TCA9554 oraz adresy jego rejestrów:
Kod: C / C++
Potem potrzebna jest funkcja która wysyła wartość do danego rejestru TCA9554:
Kod: C / C++
Stan przekaźników trzymam jako bajt - poszczególne przekaźniki są jego odpowiednimi bitami. W momencie zmiany wysyłam ten bajt do ekspandera.
Kod: C / C++
Ulepszona strona HTML
Kod: C / C++
Obsługa żądania przerzucenia danego przekaźnika:
Kod: C / C++
Jeszcze brakuje by raz na starcie ustawić tryb pinów expandera:
Kod: C / C++
W ten sposób można sterować przekaźnikami. Nie jest to idealny sposób i nie nadaje się raczej do finalnej wersji produktu, bo przykładowo podwójne wysłanie komendy (np. na skutek problemu z siecią) przełączy dwukrotnie stan przekaźnika, ale do małego demka jak najbardziej się to nadaje.
Kontrola WS2812
WS2812 to indywidualnie adresowalna kolorowa LED, która tutaj ma służyć do komunikacji stanu urządzenia. Normalnie wiele WS2812 tworzy paski i różne gadżety LED, gdzie odgrywane są animacje, ale tu mamy jedną sztukę. Nie stoi to jednak na przeszkodzie, by użyć tej samej biblioteki co do pasków - przykładowo Adafruit NeoPixel.
Dodajemy ją do platformio:
lib_deps =
adafruit/Adafruit NeoPixel @ ^1.12.0
Definiujemy ilość LEDów oraz użyty pin do komunikacji, potem tworzymy obiekt reprezentujący pasek LED (piksele) w odpowiednim trybie:
Kod: C / C++
Zostaje dodać frontend - gotowy formularz wyboru koloru z HTML:
Kod: C / C++
No i połączenie - odebranie pakietu ustawiającego kolor:
Kod: C / C++
Panel:
Efekt:
Kontrola buzzer
Na koniec coś prostego, ale równie ważnego. Sygnał wizualny z WS2812 to jedno, ale przyda się też sygnał dźwiękowy. Po to na pokładzie mamy buzzer. Zdefiniujmy jego pin oraz powiązane stałe. Buzzer działa w oparciu o PWM, ponieważ pozwala to na generowanie sygnału dźwiękowego o regulowanej częstotliwości i głośności przy użyciu cyfrowego pinu mikrokontrolera. Wysyłając szybkie impulsy o określonej częstotliwości i wypełnieniu (duty cycle), buzzer wibruje w sposób ciągły, co daje wrażenie tonu, który możemy kontrolować programowo.”
Kod: C / C++
Do sterowania PWM używamy ledc. ledc w ESP32 to wbudowany moduł sprzętowy do generowania sygnału PWM na wybranych pinach
Kod: C / C++
Funkcja odtwarzająca "beep" jest blokująca, po prostu ustawia wypełnienie, odczekuje chwilkę i go czyści. Uznałem, że mogę sobie na to pozwolić w tym demku.
Kod: C / C++
Pod to jeszcze dodałem przycisk na panelu HTML.
Rezultat (proszę oglądać z dźwiękiem):
Wejścia
Zostały jeszcze wejścia cyfrowe. Co ciekawe, są one bezpośrednio na pinach ESP32 - nie ma tu expandera. Używane są GPIO 4, 5, 6, 7, 8, 9, 10, 11. Umieściłem je w tablicy, by skanować je na poczekaniu w trakcie generowania panelu WWW:
Kod: C / C++
Trzeba je wcześniej zainicjować, tak jak się to klasycznie robi z pinami w Arduino:
Kod: C / C++
A tak wygląda skanowanie - proste digitalRead:
Kod: C / C++
Rezultat:
Co grzeje się na płytce?
Na koniec jeszcze krótki test, z ciekawości. Co najbardziej się grzeje? Wygląda na to, że płytka od PoE... a dokładniej rezystor. To dla mnie dziwne, bo zasilam płytkę z portu USB.
Grzeje się jeszcze układ zasilania strony wykonawczej:
Podsumowanie
Podsumowując, to była krótka prezentacja ESP32-S3-POE-ETH-8DI-8RO. Udało się tu uruchomić podstawowe mechanizmy - komunikację przez Ethernet, wyjścia (przekaźniki, LED, buzzer) oraz wejścia (cyfrowe GPIO). Nie było to pełne omówienie sprzętu, bo zostało jeszcze RS485, RTCC czy tam karta TF, ale i tak myślę, że pewnie może komuś pomóc z rozpoczęciem przygody z tym sprzętem. Płytka wygląda na bardzo wszechstronną i przydatną, zwłaszcza, jeśli potrzebujemy PoE. W przeciwnym razie można kupić wersję bez niego - ESP32-S3-ETH-8DI-8RO, reszta jest tam podobnie.
Czy korzystacie z modułów od WaveShare, czy widzicie zastosowanie dla tej płytki z PoE?
Fajne? Ranking DIY Pomogłem? Kup mi kawę.