Ta strona używa ciasteczek (cookies), dzięki którym możliwe jest między innymi poprawne wyświetlanie elementów strony, zapamiętywanie sesji użytkowników. Dodatkowo na stronie znajduje się skrypt Google Analytics oraz PIWIK (statystyki oglądalności). Znajdują się również skrypty przycisków serwisów społecznościowych Facebook, Twitter i Google+ oraz YouTube, które również mogą zapisywać ciasteczka.

ESP8266 część 5

W ostatnim poradniku przedstawiłem na przykładzie NodeMCU i języka LUA, jak w dość prosty sposób można skonfigurować ESP8266 do komunikacji po protokole TCP i UDP. No właśnie, w "dość prosty". O ile gotowych do użycia przykładów kodu w LUA dla ESP nie brakuje, o tyle sam język, a dokładnie jego składnia, przysparza mi trochę problemów. Nijak nie mogę się do niej przyzwyczaić. Oczywiście nie poświęciłem czasu jaki minął od ostatniego poradnika o ESP, na zgłębianie tajników języka LUA. Gdyby tak było, to bym pewnie teraz nie pisał tego tekstu. Miniony rok to raczej zabawa z językiem SWIFT i programowaniem na system macOS i iOS. Co jakiś czas jednak nachodzi mnie ochota na zbudowanie układu z prawdziwego zdarzenia w którym bym wykorzystał ESP, a nie tylko takie testowe które można zobaczyć w filmach na moim kanale na YouTube. Zresztą wkrótce napiszę o nich coś więcej. Wracając jednak do LUA i ESP, to problem powstaje gdy chce się oprogramować jakiś większy projekt. Wychodzą wtedy moje braki w obyciu z LUA. Sklejanie różnych przykładowych kawałków kodu i brak doświadczenia w posługiwaniu się tym językiem, powoduje że kod jaki tworzę do najstabilniejszych nie należy.

Po raz kolejny więc zacząłem przeszukiwać internet szukając możliwości programowania ESP w języku C. Może nie tyle możliwości, bo takowa istnieje, ale prostszej metody używania języka C w ESP na macOS. Niestety nadal wiąże się to z samodzielnym kompilowaniem kodów źródłowych, a że bawię się ESP hobbystycznie to szukałem raczej środowiska na wzór Eclipse i tej prostoty programowania jakie ono zapewnia dla mikrokontrolerów AVR. Jedyna rzecz która się ciągle przewijała w znajdowanych tematach to Arduino. Do tej pory z góry odrzucałem takie tematy, zakładając że programowanie ESP na Arduino jest powiązane z platformą sprzętową Arduino, nie wiem czemu. Tym razem jednak postanowiłem poczytać jak to faktycznie wygląda i okazało się że nie potrzebuje Arduino jako hardware, a jedynie samego środowiska programistycznego jakim jest Arduino IDE. Nie byłem tylko pewien czy zadziała to na macOS i na zwykłych modułach ESP-01 i ESP-07. Niepewność moja nie dotyczyła strony programowej, bo Arduino IDE jest na macOS od dawna, a właśnie obsługi tych zwykłych modułów i programowania ich z użyciem konwertera FTDI232 na macOS, bowiem w większości z znalezionych tematów wykorzystywano płytki Node MCU. Po zainstalowaniu środowiska Arduino i podłączeniu modułów które posiadam okazało się że moje obawy były nie uzasadnione. A że przy okazji pojawił się niespodziewany problem, postanowiłem napisać ten poradnik.

Zacznę więc od początku.

Na wszystkich swoich modułach miałem zainstalowany firmware NodeMCU. Nie wiedząc czy będzie to problemem podczas korzystania z Arduino IDE, postanowiłem zainstalować firmware w którym do komunikacji z modułem są wykorzystywane komendy AT, czyli niejako fabrycznym. Procedurę zmiany firmware opisałem we wcześniejszym poradniku. Przypomnę że ESP jest zasilany napięciem 3.3V i linie RX, TX nie tolerują wyższego napięcia. Podanie na te piny np 5V skończy się uszkodzeniem modułu, tak samo jak zasilenie modułu napięciem wyższym niż 3.3V. A więc wszystko podłączone jak należy, napięcie zasilania stabilne, polecenie w terminalu wpisane i zaczynam wgrywanie nowego firmware. A tu niespodzianka, pojawił się błąd: "A fatal error occurred: Invalid head of packet". Gdy wcześniej wgrywałem NodeMCU czy też nową wersję komend AT, żaden błąd nigdy nie wystąpił. Wyłączyłem więc zasilanie i jeszcze raz wszystko sprawdziłem w połączeniach. Po dokładnym ich sprawdzeniu, ponownie włączyłem zasilanie, wpisałem polecenie i znowu ten sam błąd. I tak kilka razy pod rząd. Nie mając już pomysłu co może być nie tak, zacząłem przeszukiwać internet w celu znalezienia rozwiązania. Długo nie musiałem szukać. Okazało że nie jestem jedyny któremu taki błąd się pojawił. Czytając różne posty, natrafiłem na taki w którym ktoś opisywał że wina leży po stronie adresów pamięci zapisanych w esptool.py, którego używamy do zmiany oprogramowania w ESP. Porada brzmiała żeby wyedytować plik esptool.py i w linii ESP_RAM_BLOCK=0x1800 zmienić na 0x180 a w linii  ESP_FLASH_BLOCK=0x400 na 0x40. Tak też uczyniłem. Po dokonaniu zmian zapisałem plik i ponownie wprowadziłem polecenie w Terminalu. Niestety znowu pojawił się błąd, tym razem jednak inny: "A fatal error occurred: Timed out waiting for packet header". Długo się nie zastanawiając znowu zacząłem przeczesywać internet w celu znalezienia rozwiązania tego problemu. Ku mojemu zaskoczeniu większość wpisów traktowała o podróbkach, czy też o nie do końca dobrze wykonanych konwerterach FTDI232. Zbiło mnie to trochę z tropu, ponieważ wcześniej nie miałem żadnych problemów z konwerterem którego używam. Zacząłem się zastanawiać, czy to czasem nie wina nowego systemu, macOS High Sierra. Tak dumając nad możliwymi przyczynami problemu, zauważyłem że tym razem podłączyłem konwerter FTDI nie do hub-a USB którego używałem wcześniej, ale wpiąłem go do hub-a w klawiaturze. Nie mając lepszego pomysłu, przepiąłem więc konwerter, włączyłem zasilanie ESP i po wpisaniu polecenia firmware się wgrał. Dla upewnienia się że to nie przypadek,  jeszcze z klika razy zmieniałem oprogramowanie ESP i za każdym razem wszystko było już w porządku. Nie wiem czemu hub w klawiaturze był problemem, ale być może Apple w swoich hubach stosuje jakieś zabezpieczenia, inne protokoły i stąd te problemy. Tak więc jak pojawi się problem z wgraniem firmware do ESP na macOS, to proponuję w pierwszej kolejności przepiąć konwerter do innego portu USB a jeśli to nie pomoże, to dopiero wtedy edytować plik esptool.py aby zmienić adresy pamięci. Na marginesie dodam, że jednak nie ma znaczenia jaki mamy firmware w swoim module z ESP. Zostanie on nadpisany podczas wgrywania programu do układu ESP8266.

Skoro więc udało się zmienić firmware w ESP, mogłem przejść do instalacji środowiska Arduino. Chociaż instalacja to zbyt duże słowo. Całość sprowadza się do pobrania pliku z Arduino IDE w wersji na macOS z tej strony, rozpakowania archiwum i przeniesienie otrzymanego pliku do folderu Programy na naszym domowym koncie.

Po uruchomieniu Arduino IDE oczom naszym ukaże się główne okno programu służące do pisania kodu, tak zwany szkicownik. To właśnie tu wpisuje się kod jaki później zostanie wgrany do wybranego przez nas układu. Z racji że  Arduino IDE nie posiada w standardzie zainstalowanych komponentów potrzebnych do wgrywania kodu do ESP, trzeba je doinstalować ręcznie. W tym celu z belki górnej menu programu wybieramy pozycję Arduino -> Preferences, a następnie w polu "Dodatkowe adresy URL dla menedżera płytek" (pic1), należy wkleić ten adres:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

pic1   pic2

i nacisnąć OK. Teraz z menu wybieramy Narzędzia -> Płytka -> Menedżer płytek. Pojawi się okno (pic2) w którym możemy wybrać wzory płytek jakie chcemy doinstalować. No a że nas interesuje ESP to tego szukamy na liście dostępnych komponentów do zainstalowania. Po znalezieniu szukanego komponentu należy go zaznaczyć. Pojawi się opcja wyboru wersji jaką chcemy zainstalować oraz przycisk "Instaluj".

Po zakończeniu instalacji wzorów płytek dla ESP, zamykamy okno menedżera płytek. Jak teraz z menu wybierzemy Narzędzia -> Płytka, to zobaczymy w menu które się rozwinie, sporą ilość dodanych wzorów płytek dla ESP8266. Osobiście nie testowałem innego wzoru jak "Generic ESP8266 Module". Założyłem że będzie to wzór uniwersalny i że poradzi sobie z wgraniem oprogramowania do modułu ESP-01.

Po wybraniu wzoru płytki należy ponownie wejść w menu Narzędzia w celu ustawienia parametrów naszego modułu z ESP8266, takich jak ilość pamięci, prędkość tej pamięci i jeszcze parę innych. Ewentualnych zmian należy dokonać na podstawie dokumentacji technicznej modułu który posiadamy. Jedną z rzeczy którą koniecznie musimy ustawić, to port przez który będziemy ten układ programowali, pamiętając oczywiście aby konwerter FTDI był wpięty do portu USB komputera. macOS na bieżąco uaktualnia dostępne porty i nie daje możliwości wyboru na zasadzie, teraz wybiorę port a później podepnę konwerter.

Po skonfigurowaniu wzoru płytki, można przejść do programowania. Na szczęście wraz ze wzorami płytek zostały również dograne do Arduino IDE przykładowe kody które możemy wgrać do ESP. W tym celu z menu wybieramy Plik -> Przykłady gdzie na końcu menu zobaczymy listę przykładów dla wzoru płytki jaki wybraliśmy. Żeby nie skakać od razu na głęboką wodę, to na początek wybierzmy Plik -> Przykłady -> ESP8266 -> Blink. Jak można przeczytać w komentarzu do kodu który wybraliśmy, po wgraniu go do modułu ESP-01 dioda wbudowana w moduł będzie migała z częstotliwością wynikającą z wartości podanych w milisekundach w poleceniu "delay". 

Zanim wgramy program do naszego modułu, ważna uwaga. Kod do ESP8266 z poziomu Arduino IDE wgrywa się tak jak firmware, to znaczy że pin GPIO0 trzeba zewrzeć do masy. Tak więc jeśli mamy wszystko poprawnie podłączone, można wgrać kod do ESP. W tym celu w oknie ze szkicem naszego programu klikamy na ikonę "Wgraj". Program się skompiluje i jeśli nie popełniliśmy nigdzie błędu w połączeniach zostanie wgrany do ESP. Po chwili zobaczymy że niebieska dioda która jest wbudowana w moduł zacznie migać z ustaloną częstotliwością. Wgrany program będzie działał pomimo zwartego do masy pinu GPIO0. Jeżeli chciałoby się teraz wgrać inny przykład, to należy wyłączyć a następnie włączyć moduł z ESP8266 aby znowu ustawić układ w tryb programowania firmware. Jeżeli natomiast po wyłączeniu zasilania i ponownym włączeniu będziemy chcieli aby uruchomił się wgrany do ESP program, pin GPIO0 należy odłączyć od masy.

Jak widać moje obawy co do macOS i programowania ESP8266 z poziomu Arduino IDE były bez podstawne. Bardzo mnie to cieszy, bo łatwiej mi analizować przykłady z Arduino, w końcu to też C, aniżeli kody napisane w języku LUA. Dodatkową zaletą programowania poprzez Arduino IDE jest też to, że do ESP jest wgrywany tylko kod jaki napisaliśmy. Gdzie np firmware NodeMCU zapisuje w ESP wszystkie biblioteki jakie zawiera dana dystrybucja.

Pod tym linkiem można znaleźć dokumentację do ESP8266 dla Arduino IDE. Opisane są w niej biblioteki jakie wchodzą w skład całego środowiska programistycznego dla ESP jak i też przykłady zastosowań niektórych bibliotek.

Na koniec jeszcze napiszę że popełniłem program do wgrywania firmware do ESP8266. Program jest okienkowy, a więc nie trzeba nic wpisywać w terminalu. Tak naprawdę jest to graficzna nakładka na esptool.py. Na razie nie udostępniam go powszechnie bo jest jeszcze w fazie testów, ale jeśli ktoś chciałby przyłączyć się do testowania to poproszę o informację na maila lub w komentarzu, a go podeślę. Oczywiście program jest tylko w wersji na macOS.

Tags: ESP8266

E-mail

Dodaj komentarz


Kod antyspamowy
Odśwież