NodeMCU – Minimalny obwód dla gołego ESP8266
Podczas tworzenia jakiegoś urządzenia najpierw robimy jego prototyp. Jeżeli wykorzystujemy do tego procesor ESP8266 to najprawdopodobniej najlepszym wyborem do prototypowania będzie płytka developerska NodeMCU. Po tym jak uznamy, że na breadboardzie wszystko śmiga jak w zegarku projektujemy płytkę drukowanę, lutujemy procesor ESP i… nie działa. W dzisiejszym artykule zaprezentuję jak należy w minimalnym stopniu zaprojektować układ wykorzystujący ESP8266, aby wszystko działało tak jak należy.
Po pierwsze zasilanie
Pierwszą rzeczą o jaką należy zadbać jest poprawne zasilanie układu. W tym przypadku możemy wybrać pomiędzy zasilaniem bateryjnym + układem LDO do obniżenia napięcia do 3.3V lub zasilaniem np. z USB (w tym przypadku należy zastosować stabilizator 3.3V). Pierwszej opcji raczej nie polecam, gdyż jeżeli nie opanujemy dobrze zarządzania energią to ESP szybko baterię nam zje.
Do stabilizacji napięcia z 5V osobiście mogę z czystym sumieniem polecić układ AMS1117. Jest on bardzo tani oraz występuje w kilku wersjach. Nas interesuje oczywiście wersja 3.3V lub w ostateczności ADJ (napięcie na wyjściu stabilizatora ustala użytkownik). Mimo wszystko jednak najbezpieczniejszym wyjściem będzie zakup wersji 3.3V.
Filtrowanie
Zailając stabilizator i mikrokontroler ważne jest odpowiednie przefiltrowanie napięcia. Zakładając, że mamy w miarę stabilne 5V z dobrej ładowarki to powinien wystarczyć nam jeden kondensator 100 nF na wejściu stabilizatora, taki sam na wyjściu i jeszcze jeden tuż przy procesorze. W przypadku trochę mniej stabilnego napięcia zasilania warto zainteresować się też dołożeniem kondensatora elektrolitycznego o wartości np. 470 uF na wejściu stabilizatora.
Odpowiednie stany GPIO
Programowanie ESP8266 odbywa się nieco inaczej niż w zwykłych procesorach np. Atmela. Tutaj poza pinem RESET ważną rolę grają także piny, które normalnie są używane jako GPIO oraz pin CH_PD.
Aby nasz procesor poprawnie się uruchomił należy zadbać o następujące rzeczy:
- Rezystorem o wartości 10K podciągnąć pin CH_PD do napięcia zasilania (3.3V)
- Kolejnym rezystorem 10K podciągnąć pin RESET również do napięcia zasilania (aby uniknąć stanu nieustalonego i w konsekwencji losowych resetów procesora)
- Pin GPIO15 podciągnąć do masy (równie rezystorem 10K)
- Upewnić się, że nic nie ściągnie pinu GPIO2 do masy podczas uruchamiania
- Pin GPIO0 podciągnąć do napięcia zasilania rezystorem 10K oraz do masy przez rezystor o niższej wartości (np. 220 Ohm) w połączeniu szeregowym z przyciskiem lub zworką.
Dodatkowy przycisk zwierający do masy możemy podłączyć również do pinu RESET. Jego wciśnięcie spowoduje reboot procesora. Przycisk lub zwora podłączona do GPIO0 w przypadku zwarcia i rebootu procesora wprowadzi go w tryb programowania.
Poza pinami GPIO0, GPIO2 oraz GPIO15 wszystkie inne piny możemy używać dowolnie. Nie oznacza to, że tych nie da się wykorzystać. Da się – trzeba tylko uważać, aby podczas rozruchu miały odpowiedni stan (GPIO0 oraz 2 wysoki, a GPIO15 niski).
Minimalny schemat połączeń
Absolutne minimum połączeń przy projektowaniu PCB prezentuje poniższy schemat:
Znajdziemy tutaj część zasilającą (stabilizator AMS1117), Zworę BOOT_MODE do wyboru trybu uruchomienia (normalny w przypadku zwarcia 1 i 2 lub raku zwarcia / programowanie w przypadku zwarcia 2 i 3) oraz złącze 4 goldpinów z wyprowadzoną masą oraz pinami RESET, TXD i RXD do programowania układu.
Programowanie takiego układu
Do programowania możemy użyć dowolnego konwertera USB-TTL np. FT232.
W celu wgrania nowego programu należy podłączyć pin TX konwerera z pinem RX procesora, RX konwertera z TX procesora oraz masy obu urządzeń. Przed wgraniem programu ustawiamy zworę BOOT_MODE w tryb programowania (zwarte piny 2 i 3), a następnie kiedy program w Arduino IDE jest już skompilowany i zobaczymy napis Wgrywanie… wciskamy na krótką chwilę przycisk RESET (jeżeli go nie mamy to zwieramy pin RESET do masy), po czym procesor powinien skomunikować się z komputerem i bez problemu zaprogramować się :)
„jeszcze jeden tuż przy procesorze”
Kondensator przy procesorze zwykle już jest, chyba, że lutujemy gołego chipa ESP8266, flash i robimy własną antenę :)
Więcej kondensatorów oczywiście nie zaszkodzi.
„Pin GPIO2 podciągnąć do napięcia zasilania rezystorem 10K oraz do masy przez rezystor o niższej wartości (np. 220 Ohm) w połączeniu szeregowym z przyciskiem lub zworką.”
Tu miało być chyba GPIO-0.
„Przycisk lub zwora podłączona do GPIO2 w przypadku zwarcia i rebootu procesora wprowadzi go w tryb programowania.”
Tu też.
Pomijając to, artykuł ok :)
Czy był mierzony pobór prądu tego „minimalnego obwodu” w trybie deep sleep?
Artykuł pisany o 4 rano i juz mi się na oczy rzuciło :) Dzięki za zgłoszenie. Niestety nie robiłem pomiarów prądu, a układ już rozbudowałem i na jakiś czas musi taki rozbudowany zostać :P Jak go zdemontuję to postaram się pomierzyć prądy w różnych trybach.
Szkoda, bo to dość ważna rzecz dla układów zasilanych baterią. Niestety, jak się źle podłączy, to będzie duży (jak na baterię) prąd płynął nawet w stanie uśpienia. Większe rezystory pomagają, ale miewałem problemy z 10k, na które pomagało zmniejszenie konkretnego rezystora, niestety kosztem poboru prądu.
Polecam do rozważenia, czy nie zapisywać GPIO w formacie z myślnikiem.
Według mnie,
„GPIO-0”
jest dużo czytelniejsze niż
„GPIO0”.
Pomaga odpowiednia czcionka. Standardowy OpenSans/Arial, ustawiony w tym artykule ma niestety bardzo podobne „O” i „0”. Do technicznych wpisów może warto wybrać czcionkę zaznaczającą „0”, np. kropką w środku?
Jak dla mnie AMS1117 to kiepski wybór. Wiem, że wszyscy go pchają do układów bo jest tani. Ale oszczędny to on nie jest.
A jaką alternatywę dla AMS1117 proponujesz?
MCP1700
To jest LDO i jest tak oszczędny jak projekt układu zasilania.
Jeśli dobrze zaprojektujesz układ to będzie oszczędny. A jeśli nie to zawsze można dołożyć zasilacz. Nie będzie mniejszy, nie będzie oszczędniejszy (względem poprawnego układu), ale względem kiepskiego pewnie będzie.