ESP32 i MicroPython na pokładzie!

ESP32? IoT? O co właściwie chodzi?

No właśnie. IoT, czyli Internet of Things stało się jakiś czas temu dość popularnym zagadnieniem. Internet rzeczy, a dokładniej danych polegać ma na zbieraniu informacji z różnych czujek i zapisywaniu w bazach danych do późniejszej analizy. Brzmi strasznie, bo może nam się przypomnieć Rok 1984 George’a Orwell’a (chociaż to już się i tak dzieje i to właściwie bez niczyjego przymusu dzielimy się naszym życiem na portalach społecznościowych), niemniej jednak przykładem mogą być inteligentne systemy sygnalizacji świetlnej reagującej na natężenie ruchu, więc wszystko zależy od zastosowania. IoT w domowym zastosowaniu najczęściej wykorzystywane są do tworzenia stacji pogodowych – ot taki moduł z czujką wilgotności i temperatury, łączący się poprzez WiFi z domowym routerem i następnie wysyłający dane o zebranych parametrach w chmurze aby je wyświetlić np. na telefonie – to był pierwszy przykład jaki znalazłem w zastosowaniach ESP8266 (poprzednik tytułowego 32).

Też chcę swojego IoT’a!

Generalnie nie ma nic prostszego. Do zbudowania własnego modułu do zbierania danych (albo generalnie elementy automatyzacji domu i zagrody) wystarczy kilka złotych i odrobina wolnego czasu. Generalnie jeżeli trafiłeś tutaj, bo zaczynasz swoją przygodę z ESP32 to postaram się w skrócie pokazać Tobie jak zacząć programować wyżej wymieniony moduł w MicroPythonie (specjalnie zmodyfikowany Python na potrzeby mikrokontrolerów).

Na początek potrzebujesz:

  • mikrokontroler, ja na swój pierwszy wybrałem ESP8266, następnie kupiłem ESP32, generalnie oba podzespoły są bardzo zbliżone do siebie, różnią się ilością pamięci, taktowaniem CPU, czy możliwością połączeń bezprzewodowych (drugi posiada dodatkowo Bluetooth LE)
  • płytka prototypowa
  • przewody do płytki
  • diody LED
  • rezystory

Z powyższej listy najdroższa będzie pierwsza pozycja, ale to generalnie i tak niewiele bo to wydatek około 40zł (na allegro najlepiej szukać pod hasłem ESP32 WROOM-32). Warto tutaj zaznaczyć, że DevKit będzie służył głównie do pracy nad projektem, a docelowo będzie można zoptymalizować wyjściowy produkt do polutowania jedynie gotowych komponentów, więc koszt będzie mógł być niższy.

MicroPython na pokładzie!

Standardowo ESP (mowa o wersjach DevKit) posiada wgrany NodeMCU, czyli środowisko developerskie – SDK, opartym o język programowania eLUA. Stworzone zostało to specjalnie na potrzeby chipsetów Espressif. Swój pierwszy program (obsługa silnika krokowego) napisałem właśnie w eLUA, ponieważ bardzo łatwo się go nauczyć – wystarczyło mi raptem kilka dni, natomiast nie do końca odpowiadało mi wsparcie (piszę z poziomu użytkownika macOS, gdzie liczba narzędzi jest mocno ograniczona).

Problematyczne było kodowanie, ot chociażby przez brak przyjemnego edytora, który podpowiadałby składnię i wyłapywał błędy na bieżąco, a nie dopiero po wgraniu kodu na kontroler. Dodatkowo samo wgrywanie było dość problematyczne z poziomu ESPlorer‚a.

Powyższe problemy zmusiły mnie do poszukania czegoś innego i znalazłem – projekt MicroPython. W przypadku ESP8266 jest rozwiązanie praktycznie z pudełka, większy problem miałem w przypadku ESP32, ponieważ jest to nieco nowszy chip, więc nie wszystko jeszcze jest oficjalne, natomiast po dwóch godzinach walki (głównie przez małe błędy z mojej strony) udało się ugotować firmware, który po wgraniu na ESP32 działa wyśmienicie.

Zanim opiszę jak najprościej przygotować działające środowisko, zaznaczam, że MicroPython posiada interaktywną konsolę i po podłączeniu kontrolera do komputera możemy na żywo wykonywać kod i w ten sposób sprawdzać jego działanie! Dla mnie jest to świetne rozwiązanie.

Odrobina czarnej magii – budowanie firmware’u…

Okay, zakasamy rękawy i zabieramy się za stworzenie środowiska do dalszej pracy. Generalnie o ile na potrzeby ESP8266 jest w sieci przygotowany specjalny Vagrant z ubuntu i wszystkimi narzędziami koniecznymi do zbudowania firmware, to dla ESP32 miałem problemy (zapewne wynikające z konfliktów, spowodowanych wcześniejszymi ustawieniami pod 8266), postanowiłem zatem zrobić wszystko od podstaw lokalnie.

Najważniejsze źródło wiedzy to oficjalna dokumentacja ESP-IDF jak skonfigurować toolchain (podlinkowany na macOS, natomiast są również instrukcje na Linuxa i Windows).

Generalnie w telegraficznym skrócie (zakładam, że katalog docelowy to ~/esp32 )

Jeżeli wszystko poszło dobrze (a powinno 🙂 ) to w katalogu ~/esp32/micropython/ports/esp32/build  znajdziemy plik binarki firmware.bin , który jest gotowy do wgrania na ESP!

Firmware wejdź do ESP, już!

Binarka jest, trzeba ją jeszcze jakoś wgrać na nasze urządzenie. Do tego celu potrzebne jest jeszcze narzędzie esptool, które można zainstalować za pomocą Python Package Index (pip), w moim wypadku jest to pip3 dla Pythona w wersji trzeciej:

Jeżeli esptool zainstaluje się prawidłowo to możemy najpierw wyczyścić flash i następnie wgrać nowy, natomiast w tym momencie możemy jeszcze nie mieć takiej możliwości, bo macOS nie będzie widział naszego urządzenia, potrzebne są jeszcze sterowniki do UART (portu szeregowego, którym wymieniane są dane między komputerem, a kontrolerem). Sterowniki można pobrać ze strony Silicon Labs.

Od teraz nasze urządzenie po podłączeniu do portu USB będzie widoczne w /dev/cu.SLAB_USBtoUART , pora więc wgrać firmware – w końcu!

Pierwsze uruchomienie

Brawo, firmware na pokładzie, na kontrolerze mruga niebieska dioda! Jest sukces, ale co z tego, co to właściwie robi?

Na chwilę obecną nic szczególnego, uruchamia sieć WiFi, do której możemy się podłączyć i nic poza tym, pora więc zaprogramować coś 🙂

Jak wspomniałem wcześniej MicroPython posiada interaktywną konsolę, więc możemy od razu bez dodatkowych narzędzi rozpocząć zabawę, do której potrzebujemy diodę LED, rezystor 100 Ohm i dwa kabelki. Całość podłączamy jak niżej (nie sugerujcie się kolorem rezystora – specjalnie mocniejszy, żeby aż tak mocno dioda nie świeciła, bo psuje ekspozycję zdjęć):

Dla wyjaśnienia, zielony przewód podłączony jest z masą (GND), natomiast czerwony do pinu 23 na płytce. Wybranym pinem możemy sterować programowo, zadając mu wartość 0 lub 1 co oznacza, że albo prąd ma płynąć lub nie, a tym samym możemy nakazać diodzie świecenie.

Uruchamiamy konsolę i wchodzimy na ESP:

Jeżeli mamy czarny ekran wciśnijmy kilka razy Enter, aż ukażą się trzy strzałki >>> , możemy teraz zapalić diodę, wpisując kolejno:

Po tym dioda automatycznie się zapali, ponieważ wskazanie pinu w trybie OUT spowoduje przestawienie jej wartości na 1, możemy to oczywiście zmienić wpisując:

It’s alive!!!

Niby nic, a tyle radości. Fakt, podobny efekt mielibyśmy podłączając LED do baterii, prawda? No to pora na nieco bardziej skomplikowany przykład. Trzy diody!

Tutaj też przydać się może sztuczka do wklejania wielolinijkowych bloków kodu w REPL (wspomniana interaktywna konsola). Aby tego dokonać wciskamy Ctrl+E, wklejamy kod (pamiętając, aby na końcu dać jeden enter po kodzie) i zatwierdzamy to poprzez Ctrl+D.

 

I jak wrażenia?

Tak wyglądają całkowite podstawy, ale już mamy ogrom możliwości do wykorzystania tego, a tylko od naszej wyobraźni zależy to jak wykorzystamy możliwości ESP32. Warto poczytać o tym do czego służą poszczególne piny, ponieważ poza tym, że większość to GPIO (input/output), to niektóre z nich mają specjalne zastosowania – np. odczyt sygnału analogowego.

A wy jakie macie pomysły na zastosowanie modułu wyposażonego w WiFI?

Niedługo kolejna część poświęcona tytułowemu mikrokontrolerowi z innymi przykładami, a docelowo poradnik jak zbudować własny slider photo/video.