Okosotthon kapcsoló ESP32 alapon

Minden érdekes történet, úgy kezdődik, hogy egyszer volt…  Szóval volt egyszer (kr.u. 2000 körül) a szobámban egy teljesen átlagos villanykapcsoló, ami eltört (ne kérdezzétek hogy), és ugyan gyorsan fabrikáltan kartonlapból és egy PC tápból kiszedett kapcsolóból egy villanykapcsolót (ami azóta is remekül funkcionál), valahogy mégis felmerült az igény egy okosabb (és látványra is igényesebb) kapcsoló iránt. Egyrészt kényelmesebb este lekapcsolni az ágyból a villanyt, másrészt mily menő már… Aztán ez az ötletelés ment sokáig eredmény nélkül, utána kevés eredménnyel, és végül 3-4 verzió után eljutottam a jelenlegi (végleges,  de most tényleg) verzióig.

Az alapötlet annyi volt, hogy vezeték nélkül működjön és lehessen vele fényerőt is állítani. Akkoriban még nem nagyon lehetett olyanokról hallani, hogy okosházak. Innen indult meg a fantáziám, és ha már fényerő akkor legyen rajta valami fényerő kijelzés is.  Mint minden ember (és rovar) szeretem a fényes dolgokat, főleg a kék LED-eket. Így lett a fényerő kijelzőből egy LED-kör, és mint látjuk majd, ezt egész végig megtartottam, mint menő feature, persze ez funkcióban bővült. Erre jött még egy kis hétszegmenses kijelző is (természetesen ez is kék), egyéb információk kijelzésére, adott esetben ugyanúgy fényerőre, mint redundáns adat, más esetben pl hőmérséklet. Végül ez az ötlet forrott ki egy OLED kijelzővé. A funkcionalitások bővültek, a design finomodott, de jellegben változatlan maradt. Közben megismerkedtem az akkor divatba jövő ESP8266 modulokkal, és lassan elvetettem az ósdi (de amúgy fontos) AVR mikrovezérlőket. Nem fogom külön részletezni a régebbi verziókat, csak a felmerült hibákat (amiből nagyon sok lesz).

A felmerült funkció igények: WiFi-n tudjon csatlakozni az otthoni hálózatomra, így az egész házból tudom majd vezérelni, esetleg valami ügyes módon NAT mögül a világ másik feléről is láthatom az otthoni állapotokat. A LED-es kör maradt, csak annyival bővül, hogy most már 32 RGB LED-del menne, testre szabható színekkel és animációkkal, és nem csak mint kijelző, hanem a kezelőfelület része lenne. Tudjam fel le kapcsolni, olyan egyszerűen mint egy sima villanyt is. Ezt úgy döntöttem, hogy egyetlen érintőgombbal oldom meg az előlapon. A fényerő szabályozás sok fázison ment át. Eredetileg ezt is az előlapon érintőgombokkal vezéreltem volna, de ez megbonyolította volna mind a vezérlést, mind a kivitelt. A végső terv az, hogy a korong szélét forgatva lehet majd állítani többek között a fényerőt is, ez a korong szolgálna a gomb mellett az elsődleges felhasználói felületnek. Persze csak mint fizikai felület. Ezt telefonról és számítógépről is el lehet majd érni. És ha már nem csak “kapcsoló”, akkor legyen benne hőmérséklet mérés, páratartalom, légnyomás és majd egyszer RFID is (ezt a legutóbbi kapcsolásba nem tettem bele, de tervben volt). Remélem nem kell mondanom, hogy ezekkel mit lehet megvalósítani, mint termosztát vagy beléptetőpont.

Egyéb igényként merült fel, hogy mint termék (igen, felmerült, hogy több is kell belőle) lehessen könnyen összeszerelni. Robosztus egyszerű és letisztult legyen, a kezelése szinte magától értetődő. A régi kapcsolókkal kompatibilis legyen. Ha valaki vesz egy ilyet, akkor azt otthon magának felszerelhesse és üzembe helyezhesse. Amihez hozzátartozik, hogy hülyebiztos legyen. Ezek az igények határozták meg a formát és az alkatrészválasztást.

A konkrét implementáció a formatervvel kezdődött. Ezt papíron kezdtem, az alap koncepció után pedig 3ds Max és AutoCAD kombinációval finomítottam. Korábbi verziókat persze elég volt csak Max-szal, de amikor felvetődött, hogy mondjuk a házat CNC-zni kellene megtanultam az AutoCAD használatát. A paraméteres testeket onnan exportáltam Max-ba a látványtervekhez, mint stúdió, elsősorban a fényekhez és textúrákhoz.

Álljon itt egy kis evolúciós betekintés, pár kép, tényleg rengetek kép volna…
Első sor: Első terv, a fali rész még csak egy kijelző + érintőpanel.
Második sor: Itt már egy ATMEGA32 + ESP8266-03 modul nem üzemelt, senkit ne tévesszen meg a világító LED 😀
Harmadik sor: Kínában legyártottam ugyanazt a NYÁK-ot, és így már ment minden, a WiFi kommunikáció is, bár voltak hibák a szöveg->parancs átalakításban, mint mintaillesztés. Itt már el sem készült a tapipad panel.

 

Végül a végleges (féle) formaterv és látványterv a következő:

Miután a formaterv megvolt következett az alkatrészválasztás, a kapcsolási rajz és nyáktervek készítése. Mondjuk ez így szép és jó, azért én sem rajzoltam hozzá PERT diagramot, de maradjuk az ideálisnál, ha tehetnem most így csinálnám. Akkoriban még gondolkoztam, hogy tényleg kell-e külön mikrovezérlő, mikor egy ESP8266 a maga 80MHz-ével és 4MB flash memóriájával messze lehagyja a sima ATMEGA-kat, és persze a helyet is foglalja. Akkor jött ki az ESP32 és megnézve az adatlapot, a specifikációkat egyből mellette döntöttem. Igaz még sehol sem lehetett kapni, és persze a gyártó nem állt le nekem leszállítani 4 darabot mutatóba (pedig megpróbáltam), nem volt semmi példakód, csak egy tesztmodul kapcsolása. Ha nem néznétek utána: 2 processzormag, 240MHz, 16MB flash támogatás, 32bites architektúra, 4 SPI, 2 UART, WiFi, BT, ADC és DAC, touch sensor, ethernet vezérlő (phy nélkül), CAN, I2C és I2S és hardveres titkosítás és véletlenszám generátor, ami fontos lehet autentikációnál és csomagtitkosításnál. Ehhez néztem LED-eket, amik lehetőleg oldalra világítanak, és ehhez egy egyszerű vezérlőt. A választás a TLC5971-re esett, amin 4×3(RGB) csatorna van, csatornánként 16bit színmélységgel (nem mintha ide kellene). Flash-nek kinéztem egy IC-t, de mint kiderült nem igazán működőképes az adott software-rel (biztos az lenne, csak sok munka lenne vele), így egy bontott ESP-modulról műtöttem le egyet. A lényeg hogy nagyjából minden flash jó, ami QSPI kompatibilis és a standard lábkiosztása van. Néztem még légnyomásmérőt is, olcsón, kínából (LPS25HB) és páratartalom-mérőt (SI7021), de végül letettem ezekről a típusokról, és nem is építettem be (igazából meg se rendeltem), mert egyrészt nem volt akkor éppen rá pénz, másrészről azóta hallottam jobbat is, ahol ez a kettő egyben van.  A kijelző egy sima 128×128 pixeles OLED. Fontos volt, hogy ne legyen nagyon drága, színes legyen és legyen utánpótlás, ha kiégne (achievement unlocked) és dokumentáció hozzá, főleg a vezérlő IC-ről (SSD1353). A többi kis cucc lényegtelen, majd lesz a listában.

Recept, alapanyagok:

ESP32-D0WDQ6 (ha lehet rev. 1-es, hardveres hibák javítva)
TLC5971 (QFN tokozás, 8db)
40MHz kvarc (3.2×2.5mm tokozás)
SC4503 (vagy olcsóbb és lábkompatibilis, most ez lesz benne)
PMEG3030EP (vagy hasonló shottky dióda, kapcsüzemhez)
RGB led (020 tokozás, ez is kínából, mert csak ott kapni)
OLED (viszonylag olcsó, kínából)
néhány pogo pin (itt még változnak a méretek)

A többi nem fontos, úgysem azt tettem bele, és nem végleges ez még.
Kondikat, tekercseket, ellenállásokat ízlés szerint adjunk hozzá és úgy jó lesz (vagy nem).

Innentől fogva adottak a peremfeltételek, jöhet a megoldás, vagyis a kapcsolási rajz.
(ebben vannak hibák, csak afféle útmutatásként szolgál)
hxsw_main_core
hxsw_main_disp
hxsw_main_leds

hxsw_main_power
hxsw_main_sensors

Ezekből elkészült (egy primitív, de működőképes bizonyos átkötésekkel) nyákterv, amit természetesen kínában, a DirtyPCB-nél gyártattam le. Innen már “csak” a beforrasztás volt hátra. Számításba véve, hogy eddig nagyjából kétszer forrasztottam QFN tokozást (inkább kevesebb mint több sikerrel), így nem most akartam megölni a (valahogy) mégsem olyan olcsó alkatrészeimet. Szerencsére ebben segített nekem Mexy, aki az ETT-n dolgozik és ebben elég nagy tapasztalata van. Vágott hozzá lézerrel stencilt és utána már csak rá kellett pakolni a cuccot be a sütőbe és kész a cucc, nagyon leegyszerűsítve. Miután kész, a biztonság kedvéért még megnéztük (kétszer is) röntgennel. Ez úton itt is köszönöm a segítséget Mexy-nek!!

Az eredmények beszéljenek magukért:

 

És akkor azt hittem, hogy megvagyok, pedig még sok álmatlan éjszaka előtt álltam. Hol is kezdjük? Mondjuk mentegetőzéssel: én sem vagyok tökéletes, és a terv sem lett az, enyhén szólva. Csak 17 átkötés van rajta, mondjuk nem feltűnő, mert ebben sajnos van gyakorlatom. És emellett két átvágás is van. De akkor menjünk sorban a hibákon, mert van bőven. Avagy mire kellene figyelni.

-hidegítő kondik: Minél közelebb az IC-khez, pl az ESP-nél lehetnének közelebb is
-kapcsüzemű tápegységnél: figyelni kell a kondenzátorok maximális feszültségére, az ESR-re, és úgy általában megfogadni a gyártó ajánlását az elrendezésben. Lehetett volna sokkal kisebb tekercs is, mivel csak ~80mA kell az OLED-nek. A végéről nem kellene lehagyni a műterhelést, mert terhelés nélkül elszáll a cucc, és nem igazán lehet üresben kimérni. Végül, ha van olyan lehetőség, hogy soft-start, akkor illene kihasználni.
-a ledvezérlőknél: A TLC5971 alapvetően 5V-ról üzemelne, ha nem mondjuk neki, hogy mégis 3.3V. Nem figyeltem és nem kötöttem be mindkét tápbemenetére (az adatlap szerint) a tápfeszültséget, és nem is ment (mind, érdekes módon van amelyik így is elindult valahogy). Ez +8 átkötés volt.
-az ESP-nél: szó szerint hetekig kerestem, hogy miért lehet programozni a cuccot, és mégsem akar lefutni, pedig a modulokon mégis fut a program. Mindig újraindul… Talán hardveres hiba, van valami ilyesmi az adatlapban, mint hardveres hiba (rev. 0 chipek estén, rev. 1-ben javítva). Vettem új IC-ket, azokkal sem ment, de közben megtanultam QFN-t forrasztani, mivel vagy nyolcszor forrasztottam le, forrasztottam vissza, ne megy, akkor gondolkodás és kezdjük előlről. Lecseréltem a flash memóriát is, hátha az a hiba (tény, hogy az is hiba volt), de nem az volt ezért a felelős. De azt majd később. Ez ment hetekig eredménytelenül. Ekkor vetemedtem odáig, hogy megmérjem a táplábakon a feszültséget. (Nagy feketepont.) Az egyik (nagyon fontos) lábon valahogy nem igazán volt meg a kellő potenciálkülönbség. Megnéztem a gerbereket. Tényleg nincs összekötve a tápfeszültséggel. A kutyafáját, ez már a harmadik majdnem bekötés (a másik az alján a PWM_B kimenet és a tetején a rotary encoder R18 ellenállása és az ESP között), ne már… csak egy mm kellett volna. Kijavítottam, +1 átkötés és minden (is) ment, mint a karikacsapás.
-a flash memóriánál: Mint kiderült, az ESP előnyben részesíti a QSPI kompatibilis memóriákat, annyira hogy gyári bootloaderrel el sem indul anélkül. Nyilván meg lehetne írni, hogy menjen, de egy ilyen memória sokkal gyorsabb. Gondoltam, hogy ez is hiba lehet, így egy ESP-modulról leszedtem a flash-t és átraktam az enyémre. Hatalmas mázli, hogy a lábkiosztás az ilyen memóriákon megegyezik, és hogy pont olyat terveztem bele, ami még a lábtávolságokban is egyezik (ez tök véletlen, én MLP8-at tettem be, ez pedig SOIC8). További hiba, amit csak másik modulok kapcsolásából tűnt fel, hogy a VDD_SDIO tápláb az mégsem bemenet, hanem inkább ezen keresztül kap a flash tápellátást, 1.8 vagy 3.3V-ot, attól függően hogy indítjuk el az ESP-t. Itt is volt olyan szerencsém, hogy úgy van összekötve, hogy egy vezetéket elvágok, és pont úgy van akkor huzalozva, ahogy kell.
-az OLED-nél: Ez tulajdonképpen nem is hiba. 3 lábas (de mégsem fazék) SPI-t választottam, hogy spóroljak a GPIO-kkal, de nem jött be. Adatlap szerint 3 lábas SPI módban 9bites csomagokkal kommunikál a dolog, amiből egy bit a D/C lábat váltja ki. Mint mikor boltba megyek: 8 bites SPI-t szeretnék. 9 lett maradhat? Hát nem, nagyon nem. És miért? Nem mintha nem működött volna, tök jól ment így is, de rendezgetni minden byte-ot, azután kiküldeni egyenként… Zabálja a CPU időt, és nem hatékony. Addig csinálhatna hasznosabbat is, és a forgalmat kezelné a DMA. Így jött az ötlet: akkor kössük át 4 lábas SPI-ra. Ha megnézzük, ahhoz “csak” egy lábat földelni kell, azt általában könnyű. A nagyobbik gond ott realizálódott elmémben, mikor ráeszméltem, hogy viszont a gyönyörűen földelt D/C láb a szalagcsati alatt van földelve. Semmi kedvem nem volt leszedni azt onnan, örülök hogy sikerült rátenni. Átfúrni a lapot, nem játszik, nem tudom hol kell… Aztán jöttek a vicces emberek, és mondták, hogy égessem el. Ez nem is rossz ötlet. Elvégre csak egy kis 10mil-es vezetőszakasz, ami egy 100mil-es GND ágba folyik. Csak elég amper kell, és elfüstöl a mocsok. Sajnos a labortáp csak 10A-t bírt, ami nem olvasztotta el azonnal, sőt nem is igen melegítette. Akkor mit lehet tenni? Vannak nekünk fajin pákatrafóink, kedvesen doromboló 48V-al, az majd bedurrantja. Így is történt, egy durranás, nagy szikra, és mérem és végtelen ohm. Kész ez megvan mondom, probléma megoldva, volt földelés, nincs földelés. Csak cserébe meg az ESP ellenállása konvergált meglehetősen gyorsan a 0 ohm-hoz. De legalább abból van elég pótdarab, és már elég gyakorlott vagyok azok cserélgetésében. Úgyhogy +1 átkötés (FreePad1->OLED D/C# láb) és működött a kijelző, az áhított 8 bittel, DMA-val mindennel, olyan 50Hz-es képfrissítéssel, és még a CPU-t sem terhelte.

A működő csodáról pár kép:
(bocs a rossz minőségért, banánnal készült)
A forráskódokat csatoltam: hxsw_v4_src

Csak ínyencségnek: Közben volt (lett volna) egy másik lapra is elegendő alkatrész. Mindent megoldottam, beforrasztottam, még a LED-eket is (pechemre, RIP LED-ek) és akkor mehet a sütőbe. Emelkedik a hőfok, melegszik a melegszendvics sütő. Már csak a drámai zene hiányzott, így utólag. Behelyezem a tálcát, hogy újraömlesszem a pasztát, amit hőlégfúvóval elrontottam (közel sem vagyok profi, a célszerszám meg még halott). Az lett a vége, hogy melegszik a panel, felhívnak és közben bőven letelik a 90 másodperc. Utána mint mindenhol, itt is kezd szenesedni a kenyér széle… Szegény panel nem bírta a meleget, és megolvadtak rajta a LED-ek mint a sajt, a felszíne felhólyagosodott és bánatomra elvesztette szerkezeti integritását, eltávozott lelkéből a füst, és holtan feküdt a tálcán, mintegy koporsóban.

A cikk hamarosan folytatódik, hogy hogyan írtam rá egyedi bootloader-t, amivel WiFi-n keresztül tudom frissíteni a firmware-t a kapcsolón, mivel meghalt az USB UART átalakítóm, és mert úgyis meg akartam csinálni. Remélem hamarosan a többi rész is készen lesz. Amint meggyógyul a SEM-ben a CNC nekiállunk kimarni a dobozt is, és a javított verzió is készül közben 🙂