ESP8266, IoT – praktyczny przykład cz. 3

ESP8266 na płytce
ESP8266 na płytce – wersja prawie finalna

Mamy gotowy układ na płytkach stykowych. Działa, ale trudno coś takiego włożyć do obudowy i stosować do sterowania urządzeniami (np pompą CWU). Pokażę Wam, jak w prosty sposób można zmienić nasz układ w formę znacznie trwalszą, z lutowanymi połączeniami.

Idealnie byłoby zaprojektować i wykonać płytkę drukowaną. Taką płytę można oczywiście zrobić domowymi metodami. Nie jest to takie trudne, jak się może wydawać. O tym jak to zrobić, to innym razem. Są gotowe półprodukty, które ułatwiają zrobienie trwałego układu. Pewnie większość z Was widziała tak zwanego perfboarda – płytkę uniwersalną. Posiadają one otwory w rastrze 2.54 mm. Otwory z jednej strony są pokryte miedzią. Można przewlec tam elementy i przylutować. Zamiast ścieżek używać przewodów. Daje radę, ale nie jest to zbyt wygodne. Szczególnie łączenie wszystkich połączeń przewodami. Czego można użyć zamiast perfboarda?

Stripboard, czyli szybkie przenoszenie układu na połączenia lutowane

StripBoardMam wrażenie, że o ile perfboarda prawie każdy widział w projektach DIY, to nie każdy spotkał się z tzw stripboardem. Co to jest? Stripboard jest bardzo podobny do perfboardów czy tzw płytek uniwersalnych. Prostokątna płytka z otworami w rastrze 2.54, pokrytymi z jednej strony miedzią. Więc gdzie jest różnica? Otóż stripboard jak nazwa wskazuje (stripe ang. – pasek) ma połączone otwory miedzią w długie paski. Czyli  można wsadzać różne stanadardowe elementy, przylutować. Jednak znacznie się upraszcza prowadzenie przewodów. Połączenie sąsiednich otworów w długie paski redukuje ilość przewodów którymi musisz mostkować otwory. Jednocześnie wystarczy ostry nóż (np nożyk do tapet lub modelarski) by przeciąć ten pasek. Jeżeli potrzebujesz przerwać połączenie by nie było niepożądanego zwarcia – wystarczą dwa ruchy nożem :) Musisz wręcz uważać, by nie przeciąć sąsiedniego paska, bo naprawdę robi się to łatwo. Idea ta jest zbliżona nieco do zasady budowy płytki stykowej, jednak tutaj masz większy wpływ jak dzielisz poszczególne paski. Na płytce stykowej masz po 5 otworów połączonych ze sobą. Tutaj może to być więcej jeśli tego potrzebujesz.

Dostarczamy zasilanie

OK, w takim razie przejdźmy do czynów. Nasz poprzedni układ przeniesiemy na striboarda. Ma on rozmiar ok 5 cm x 9 cm, czyniąc go mniejszym niż płytka stykowa, ale wystarczy nam miejsca aż nadto.

Wyposażając cały układ w regulatory napięcia 5V oraz regulator 3.3V  nie potrzebne nam będzie już będzie Arduino UNO. Wystarczy dowolny zasilacz, który zapewni co najmniej 6V by nasz ESP8266 i przekaźniki miały zasilanie. Dla ułatwienia podłączenia zasilania użyjemy standardowego gniazda zasilającego 5.5/2.1. Zaczniemy od tego ostatniego. Niestety ale wyprowadzenia tego gniazda nie pasują do otworów w płytkach (mają wyprowadzenia w formie szerokich blaszek zamiast wąskich pinów), ale chwilę kombinując uda się nam bez problemu przylutować do płytki.

Złącze zasilania krok 1
Złącze zasilania krok 1

Zaczniemy od tylnego wyprowadzenia, jest ono podłączone do bolca wewnątrz gniazda. Zazwyczaj wtyczka zasilacza na ten bolec poda napięcie wyjściowe, czyli to jest nasze źródło napięcia dla stabilizatorów. Uwaga, podłączając zasilanie upewnij się, że tak jest. Zasilacze z wymiennymi końcówkami (jak np ten zasilacz) mają zwykle możliwość zmiany jakie napięcie jest podawane na „tip” (bolec).

Blaszkę odginamy pod katem 90 stopni i korzystając z jakiejś odciętej nóżki rezystora, czy kawałka drutu lutujemy go do płytki (najpierw wlutuj nóżkę rezystora, potem nałóż blaszkę i zlutuj całość). Zwróć uwagę, że miedź na płytce jest z drugiej strony. Boczną blaszkę na gnieździe zasilającym też wygnij pod kątem 90 stopni (jak na zdjęciu) i zostaw wolną.

Jeżeli zastanawiasz się po co ta blaszka jest, to w momencie gdy nie ma wsadzonego wtyku zasilającego do gniazda, jest ona zwarta z trzecią blaszką (tą od masy). Jeżeli wsadzisz wtyk zasilający, mechanicznie zostanie ona rozłączona od masy. Czyli może zostać ona wykorzystana do wykrycia czy jest wsadzona wtyczka zasilacza (ale nie czy jest napięcie, tylko czy jest wsadzona wtyczka).

Złącze zasilające krok 2
Złącze zasilające krok 2

Następnie odwróć płytkę, trzecią blaszkę, na którą normalnie jest wyprowadzona masa podawana z zasilacza, zegnij i owiń o brzeg płytki. Przylutuj ją do skrajnego pola miedzi na płytce.

Teraz czas by trochę pogłówkować. Jak już się domyślasz 3 pasek miedzi (licząc od krawędzi, pomijając skrajny bez otworów) będzie pod napięciem (takim jak dostarczone przez zasilacz). Jeśli przyjrzysz się karcie katalogowej LD33V to prawa skrajna nóżka to właśnie napięcie wejściowe, środkowa to napięcie wyjściowe 3.3V, a lewa służy do podłączenia masy. Czyli jeżeli wsadzimy regulator tak by prawa nóżka była w trzecim rzędzie otworów, to zasilanie już będzie podłączone.

LD33V w stripboardzie
LD33V w stripboardzie
LD33V podłączenie
LD33V podłączenie

Wystarczy wtedy zmostkować przewodem masę do 5 rzędu otworów i gotowe – LD33V podłączony do zasilania. W tym układzie nie podłączyłem żadnego kondensatora ani na wejściu ani na wyjściu. W zasadzie powinien być 10 µF na wyjściu, ale to jest na razie szybkie proto. Podłączam i jeśli układ pracuje poprawnie, tzn stabilizator nie grzeje się a zasilany układ działa bez problemów, to rezygnuję z kondensatora. Jednak – jeżeli cokolwiek niepokojącego zaczyna się dziać – jakieś nieprzewidziane zachowania – to zanim zaczynam jakieś głębsze diagnozowanie zawsze dodaję brakujący kondensator. Tu kolejna zaleta stripboardu – wystarczy wlutować kondensator w otwory w rzędach 4 oraz 5 by domknąć układ – nie trzeba żadnych przewodów by mostkować, co byłoby konieczne na perfboardzie. Zobaczcie na zdjęciu jak to zostało podłączone. Drugie zdjęcie ma dorysowane „przewody” symbolizujące jak zasilanie jest doprowadzone do LD33V. Do doprowadzenia masy użyłem wygodnego w lutowaniu Kynaru 28AWG – czarnego i później czerwonego.

Mocowanie ESP8266 na płytce

ESP8266 i gniazda przygotowane do wlutowania
ESP8266 i gniazda przygotowane do wlutowania

Mamy zasilanie 3.3V to czas pomyśleć o ESP8266. Można wlutować je (z adapterem) bezpośrednio do stripboarda. Jednak nie jest to dobry pomysł – jeżeli ulegnie uszkodzeniu, trudno będzie go wymienić. Dlatego bierzemy złącze 1×40 żeńskie i przycinamy je na długość, zakładamy na ESP i wsadzamy do naszej płytki. Lutujemy je razem z ESP, dzięki temu będą równolegle do siebie i łatwo można będzie ESP włożyć i wyjąć. Wybierając miejsce na ESP pamiętaj aby zostawić odstęp od strony zasilania (parę rzędów) bo jeszcze będziemy regulator zasilania 5V wstawiać w płytkę.

Ktoś uważny może powiedzieć teraz: Hola! Przecież płytka ma poziome paski miedzi, czyli teraz zwarliśmy lewą stronę ESP z prawą. Jaki to ma sens?

Rozcięte połączenia
Rozcięte połączenia

No, jeśli tak to zostawimy to niewielki, ale… bierzemy ostry nóż (np do tapet lub modelarskie ostrze) i zapewniamy rozłączność między lewą a prawą stroną… Teraz tylko doprowadzić przewodami zasilanie i masę i ESP gotowy do pracy.

By ułatwić sobie później różne prace, warto jeszcze dodać drugi rząd gniazd żeńskich, tak by można do każdego pinu adaptera ESP podłączyć się przewodem na szybko. Ale to tylko w celach testów jakiś. Do stałych podłączeń takie rozwiązanie się nie nadaje. Co w takim razie? Złącze terminalowe (śrubowe) o rozstawie 5mm. Dzięki rozstawowi wchodzi w co drugi rząd na stripboardzie. Piny złącza są naprawdę grube i musisz użyć siły (albo większego młotka :) ) by wsadzić w płytkę. Nic naprawdę trudnego :)

Złacze terminalowe na stripboard
Złacze terminalowe na stripboard

Co nam pozostało? Zasilanie dla modułów przekaźnika, czyli 5V. 7805, stabilizator napięcia 5V ma takie wyprowadzenia, że za dużo wspólnego z LD33V nie uda się znaleźć. Dlatego, obracamy go o 180 stopni w stosunku do LD33V, i środkowa nóżka która w 7805 to masa jest we wspólnym rzędzie ze skrajną nogą LD33V (tą na której jest właśnie masa). Ponieważ wówczas wejście zasilające 7805 jest w rzędzie 4 (razem z wyjściem 3.3V z LD33V), rozcinamy ten pasek pomiędzy 7805 a LD33V. Zasilanie do 7805 doprowadzamy przez mostek (akurat z goldpina) z rzędu 3 (w niego jest podłączone przecież tylne wyjście z gniazda zasilającego). Wyjście 5V z 7805 jest w rzędzie 6, tak więc nie koliduje z niczym. Złącze terminalowe wpinamy w rzędy 6 i 8, do 8 doprowadzamy masę i wyjście zasilające 5V jest gotowe.

Co nam zostało? Podłączenie modułu przekaźników. Mamy wyprowadzone na złączu terminalowym zasilanie do modułu przekaźników, ale zostało nam jeszcze sterowanie. Użyjemy do tego znowu złącza terminalowego, ale… ponieważ raster jest 5 mm to wpada w co drugi rząd, zgadza się? Dlatego GPIO4 i 5, które są użyte w poprzednim przykładzie się nie nadają. Tzn można zrobić mostek i przeciąć jedną ścieżkę by wyprowadzić sygnały na krawędź płytki. Ale zamiast tego możemy trochę poprawić kod naszego przykładu by skorzystał z innych GPIO. Tym razem mój wybór padł na GPIO 12 i 16.

Wersja finalna

Nim przejdziemy do zmian w sever.lua popatrzmy na finalną wersję płytki:

ESP8266 na stripboardzie - wersja finala
ESP8266 na stripboardzie – wersja finalna

Kolorowymi kreskami uzupełniłem połączenia. I tak – czerwony to zasilanie 3.3V i 5V. Żółty to napięcie z zasilacza. Zwróć uwagę, że żółty przechodzi przez z linii 3 do 4 pod spodem jest mostek), a ścieżka jest rozcięta w 4 linii, tak by żółty z czerwonym się nie zwarły. Zielonym kolorem zaznaczyłem wyjście sterujące przekaźnikami. Czarny to tradycyjnie masa. Z prawej strony z resztki złącza żeńskiego 1×40 dolutowałem sobie złącze na GND – jak do czegoś innego chce się użyć potem płytki, to przydaje się dodatkowe GND.

OK, to jeszcze jak wygląda bez dorysowanych połączeń:

ESP8266 na płytce
ESP8266 na płytce (zwróć uwagę na dodatkowe gniazda wzdłuż ESP, by można podłączyć się do każdego GPIO)

Zmiany w kodzie LUA

No to teraz kod. Po pierwsze zaglądamy do dokumentacji NodeMCU – moduł gpio. GPIO12 i 16 to numer 6 i 0 dla funkcji modułu gpio. Pierwsza zmiana jest trywialna, ustawiamy te GPIO w tryb pracy wyjścia.

gpio.mode(0, gpio.OUTPUT)
gpio.mode(6, gpio.OUTPUT)

Ale, możemy zostawić kod jak jest, tylko HTML trzeba będzie poprawić, bo teraz trzeba będzie się odwołać do http://ADRES_IP/0/off oraz http://ADRES_IP/6/off itp. Ale to mało intuicyjne, lepiej mówić o przekaźniku 1 i 2, dlatego zrobimy tablicę tłumaczącą numer używane w URL na numery GPIO:

gpios = {}
gpios[1] = 0
gpios[2] = 6

Teraz if nieco się komplikuje:

    id,parsed_request = Parser.parse(payload)
    id= tonumber(id)
    if id ~= nil and id < 3 and id > 0 then
        if parsed_request == 'on' then gpio.write(gpios[id], gpio.LOW) end
        if parsed_request == 'off' then gpio.write(gpios[id], gpio.HIGH) end
    end

Po pierwsze – zmiana stanu przekaźnika będzie możliwa tylko dla ID równego 1 lub 2. Funkcja tonumber zmienia łańcuch na liczbę by porównanie mogło zadziałać. Jeśli id jest nil (strona główna) to tonumber(nil) zwraca też nil, dlatego jest sprawdzenie najpierw czy id jest różne od nil (LUA używa symbolu ~= tam gdzie w Arduino napiszesz !=).

Całość do pobrania: ESP866 IoT – tablica GPIO.

Co można poprawić?

Po pierwsze, zamiast „na pałę” ustawiać tryb pracy portu GPIO można by użyć tablicy gpios do tego celu. Dwa, skoro już sprawdzamy czy id jest w zakresie liczb nam pasujących to może i zamiast HTTP 200, odpowiedzieć jakimś błędem, by przekazać informację o złym numerze przekaźnika.

Co zostało użyte?

Lista części, poza ESP i przekaźnikami o których była mowa w poprzednich wpisach:

Szczerze polecam takie płytki – pozwalają w prosty i szybki sposób przenieść układ z płytki stykowej na coś trwałego. Mam nadzieję, że ten wpis zachęci Was do eksperymentów. Dodajmy, że użycie złącz pozwala taką zlutowaną płytkę bez problemu użyć z innym ESP8266 w nowym projekcie.