INTRO

Przegląd płytki: ESP32 WROOM-32

Zobaczmy teraz pełną rozpiskę pinów wraz z ich funkcjonalnością:

esp32_pinout_a1

Jak widać po lewej stronie mamy piny odpowiadające za przetwornik ADC (piny analogowe) oraz za sekcję zasilania. Pin EN służy do resetowania układu- podciągnięty do masy zasilania resetuje ESP32 (potrzebny pull-up do 5V). Dodatkowo GPIO12-15 odpowiadają za JTAG (debugowanie programu w czasie jego wykonywania przez układ). Dolna partia wyjść jest odpowiedzialna za magistralę SPI oraz jeden z portów UART (cały układ udostępnia nam 3 porty UART). Po prawej stronie układu mamy udostępnione piny głównie odpowiedzialne za programowanie układu oraz wybieranie danego stanu układu. Otóż GPIO1 i GPIO3 to są główne linie UART, którymi jest wysyłany program do układu (nie mylić z OTA). Natomiast pinem GPIO0 wybieramy tryb w jakim uruchomi się układ. Podciągnięty do masy, układ przechodzi w tryb programowania, natomiast jak podciągniemy go do zasilania to wtedy układ przechodzi do normalnego działania.
Piny GPIO mają to do siebie, że mogą przyjąć praktycznie każdą funkcję jako pin cyfrowy. Może być jako zwykły pin I/O, jako PWM, I2C, I2S itp. To wszystko jest możliwe dzięki programowaniu odpowiednich rejestrów w układzie.

Programowanie

Sposób obsługi tego układu nie różni się mocno od ESP8266 co jest dużym plusem (można by to podciągnąć wręcz pod wsteczną kompatybilność). Warto tutaj wspomnieć, że układ jest bardzo wrażliwy na napięcia wyższe niż zasilające. Pisząc to, mam na myśli kwestię programowania tego układu. Ponieważ pomimo tego, że możemy programować go najprostszym układem FT232RL to musimy zapewnić odpowiednie poziomy logiczne, to znaczy, że nie możemy wysyłać do układu sygnałów o napięciu 5V jak to w przypadku Arduino, gdzie układ był przystosowany do takiego poziomu. Niektóre moduły z FT232RL mają możliwość wyboru napięcia- 5V albo 3,3V. Musimy być zatem pewni, że wysyłamy sygnały o wartości 3,3V w stanie wysokim. Jeżeli nie mamy takiego układu co podaje sygnały na poziomie 3,3V to możemy zbudować prosty dzielnik napięcia który to podłączony do linii TxD programatora wchodzi na pin RxD ESP32. W przypadku pinu TxD układu ESP32 oraz RxD programatora to nie musimy się martwić bo ESP może maksymalnie wysłać napięcie na poziomie 3,3V, które nie zrobi nic złego programatorowi. Także może brzmi to strasznie, ale spokojnie- poniżej zamieszę schemat jak takie połączenie powinno wyglądać :)

Zasilanie

Ostatnią sprawę jaką chciałbym poruszyć to zapewnienie odpowiedniego zasilania. Ponieważ ESP32 ma duży apetyt na prąd – szczytowo do 250mA przy krytycznych momentach używania Wi-Fi (rozruch), a średnio 80mA to musimy mu zapewnić prawidłowe zasilanie. Ze względu na to, że wspomniany wcześnie emulator portu COM, służący nam jako programator – FT232RL ma bardzo niską wydajność prądową na linii 3,3V to musimy doprowadzić z zewnątrz osobne zasilanie. Może to być nawet z USB, ale musi być ono poprzedzone regulatorem napięcia np. LM1117-3,3. Wtedy rozwiążemy problem z obsługą Wi-Fi, która to zajęła mi lekko parę godzin, ponieważ podczas wczytywania danych kalibracji modułu po prostu brakowało prądu :/

To tyle odnośnie sprzętowej części przeglądu modułu ESP32, zapraszam teraz do poznania środowiska programistycznego.

2. Środowisko programistyczne

Na ten moment z najlepiej działających środowisk programistycznych mamy oddane do użytku:

  • ESP-IDF (Espressif- IoT Development Framework)
  • ESP32 Arduino Core

Najlepiej rozbudowane na ten moment jest ESP-IDF, które to jest natywnym środowiskiem dla ESP32. Wyróżnia się tym, że mamy możliwość sterowania wszystkimi funkcjami układu- tzn. możemy wybierać, z jakich modułów możemy korzystać przy danym programie, możemy wybierać tryby booatloadera (secure), pamięci flash (secure). Możemy również regulować częstotliwość taktowania układu. Mówiąc w dużym skrócie, przy pomocy ESP-IDF mamy najszersze pole modyfikacji tego układu, lecz samo środowisko może mieć dla niektórych mały minus- potrzebna znajomość C/C++ Kolejnym minusem jest żmudny proces konfiguracji środowiska. O tyle co w bash’owej wersji środowiska nie ma dużo do „przeklikania” o tyle w połączeniu z Eclipsą jest bardzo dużo pracy.  Trzeba bardzo dużo rzeczy poustawiać, oraz przy kolejnych projektach ręcznie zmieniać jego parametry. Co prawda mamy wtedy już jednolite środowisko programistyczne, ale mówię: coś-za-coś.

zrzut-ekranu-15
zrzut-ekranu-16
zrzut-ekranu-17

Kolejnym środowiskiem bardzo znanym z poprzedniej wersji modułu, jest Arduino Core dla ESP32. Tutaj nie doszło dużo zmian względem obsługi ESP32 z poziomu Arduino IDE, z tą różnicą, że troszkę jest pozmieniana obsługa WiFi (co było podyktowane nowszą technologią). Twórca „rdzenia” dla ESP32 informuje, że na ten moment działa:

  • pinMode
  • digitalRead/digitalWrite
  • attachInterrupt/detachInterrupt
  • analogRead/touchRead/touchAttachInterrupt
  • ledcWrite/sdWrite/dacWrite
  • Serial (global Serial is attached to pins 1 and 3 by default, there are another 2 serials that you can attach to any pin)
  • SPI (global SPI is attached to VSPI pins by default and HSPI can be attached to any pins)
  • Wire (global Wire is attached to pins 21 and 22 by default and there is another I2C bus that you can attach to any pins)
  • WiFi (about 99% the same as ESP8266)

Czyli praktycznie ponad połowa możliwość układu. Bo jak na razie to nie widać obsługi dla Bluetooth, PWM, Ethernet itd. Nie mniej jednak prosta obsługa tego środowiska może spowodować przyrost fanów tego modułu. Lecz na ten moment obsługa ESP32 z poziomu Arduino jest bardzo podstawowa z grubym podkreśleniem na bardzo. Podczas programowania modułu, mamy do wyboru tylko rodzaj płytki, prędkość programowania. Brakuje między innymi zmiany częstotliwości taktowania układu. Lecz sam układ jest świeży więc na bieżąco są dodawane nowe funkcjonalności. Myślę, że jeszcze parę miesięcy będzie trzeba poczekać zanim biblioteki zostaną rozbudowane. Ale z tego co widzę to wszystko idzie w dobrym kierunku- średnio co tydzień biblioteki dla Arduino Core są aktualizowane. Jeszcze jedna, taka „mini-wada” jaka nasuwa mi się na myśl to żeby uruchomić ESP32 z poziomu Arduino IDE to trzeba zbudować te biblioteki bezpośrednio z repo GitHubowego. Do czego potrzebujemy z kolei programów python oraz Git-scm. Lecz autor dodaje sposób instalacji rdzenia także nie ma tragedii :)

  • Przemek Michalak

    Napisałeś „Możemy tu gołym okiem stwierdzić, że podwojona ilość rdzeni pozytywnie wpływa na moc obliczeniową układu.” a w jaki sposób aplikacja wykorzystuje te 2 rdzenie w tym przykładzie? Ten drugi dodatkowy nie jest przeznaczony na obsługę wifi itp?

    • Cześć,
      jest właśnie tak jak piszesz :) drugi rdzeń zajmuje się obsługą między innymi Wi-Fi, ale jak na to popatrzymy w porównaniu do ESP8266, gdzie miałeś jeden rdzeń na wszystko, to to jednak w ESP32 wpływa pozytywnie na działanie :)

      • Przemek Michalak

        Tak, ale w tym przykładzie 2 rdzeń nie jest używany. A może jakiś przykład tego typu, ale jeszcze serwer? Tylko wtedy efekt będzie pewnie taki, ze ESP8266 będzie się wieszał po stronie serwera, a ESP32, będzie stabilnie pracował i średnio będzie można to porównać.

        Swoją drogą poza tą stabilnością połączenia to raczej mało kto ma hobbystyczne projekty, które musiałyby mieć aż taką wielką moc obliczeniową

        • Zapewne chodzi ci o test obliczania liczby pi. Było on nastawiany bezpośrednio na test wydajności modułów. Możnaby spróbować dodać serwer, ale test raczej nie byłby miarodajny. Co do wykorzystania hobbystycznego to kuszącym może być sprzętowa akceleracja kryptograficzna

  • Mscichu

    A jak z zasięgiem tych modułów i może wiecie czym się różni moduł z końcówką S?

    • Zasięgu nie sprawdzałem ale sądząc po wbudowanej antenie to będzie porównywalny z ESP-12. Moduł ESP-32S od zwykłego ESP-32 myślę że może się różnić tylko płytką i ewt. wielkością pamięci FLASH, bo innego układu niż ESP3212 w niej nie ma :)

      • Mscichu

        Raczej zastanawiałem się czy zasięg jest poprawiony, bo były moduły ESP8266 z dodatkowym wzmacniaczem antenowym. Będzie więcej artykułów o modułach bezprzewodowych?

        • Mam taką nadzieje, że będą bo w dziedzinie IoT jest szerokie spektrum możliwości :)

  • Mscichu

    Jeszcze zastanawiam się, bo piszesz o ESP-WROOM-2, a wszędzie gdzie znajduję to jest na ESP8266. Na necie i na zdjęciach jest ESP-WROOM-32. Literówka?