Régóta megvan a lehetőség rá, hogy az eredetileg WiFi-s ESP32-t vezetékes hálózaton használjuk, ám mivel nem nagyon volt eddig rá szükségem - és az ESPEasy sem nagyon támogatta mostanáig - nem különösebben foglalkoztam vele.
Mindenesetre érdekességképpen vásároltam egy LAN8720 modult. A megoldásról azt kell tudni, hogy az ESP32 rendelkezik beépített LAN vezérlővel, ám helytakarékosságból nem tartalmaz pár hardver komponenst. A hiányzó rész egy fizikai átvivő (RMII PHY) és persze maga az RJ45 befogadására képes LAN csatlakozó, ez lehet például egy nem túl drága LAN8720, amit össze kell kábeleznünk az ESP32-vel.
Íme a prototípus:
Látható, hogy egy egyszerű egyoldalas protolapot használtam, amivel a két komponenst összehoztam:

Van azonban az ESP32-nek egy gyenge pontja, melyben osztozik elődjével, az ESP8266-al: bizonyos lábaknak induláskor speciális funkciói vannak, például a GPIO-0 is ilyen. Ezért a LAN8720 modulon szükséges máris némi módosítást tennünk, mielőtt bekötnénk egy ESP32 elé, különben könnyen előfordulhat, hogy az ESP32 nem tud elindulni!
A LAN modul NC feliratú lábát rákötjük az 50Mhz-es oszcillátor ENABLE lábára, ezzel megakadályozva, hogy a GPIO0 lábra jeleket adjon ki az ESP32 indulásakor. Ezt a lábat a későbbiekben fixen GND-re húzzuk egy ellenállással, és majd szükség szerint engedélyezi a LAN drivere inicializáláskor. (POWER)
Forrás: Frank Sautter blogja
Bekötés:
ESP32 | LAN8720 board |
---|---|
GPIO05 - PHY_POWER | NC - Oszcillátor ENABLE 4k7 lehúzó ellenállással (POWER) |
GPIO22 - EMAC_TXD1 | TX1 |
GPIO19 - EMAC_TXD0 | TX0 |
GPIO21 - EMAC_TX_EN | TX_EN |
GPIO26 - EMAC_RXD1 | RX1 |
GPIO25 - EMAC_RXD0 | RX0 |
GPIO27 - EMAC_RX_DV | CRS |
GPIO00 - EMAC_TX_CLK | nINT/REFCLK (50MHz) (felhúzó ellenállással, ha nincs az ESP lapon) |
GPIO23 - SMI_MDC | MDC |
GPIO18 - SMI_MDIO | MDIO |
GND | GND |
3V3 | VCC |
A fenti GPIO kiosztás nagy része fix bekötés a gyártói ESP-IDF szerint, három kivétel van, amit szabadon lehet állítani, és a forgalomban levő különböző modellek különbözőképpen definiálják őket, ezek az: MDC, MDIO és a POWER lábak. (a Power nem is szerepel minden megvalósításban)
Bekötési rajz:

Nem tudom mennyire nyilvánvaló a rajzból, de kevés használható szabad láb marad a művelet végén, azt se felejtsük el, hogy a 32 feletti számú lábak kizárólag bemenetként használhatóak. (nincs beépített fel-lehúzó ellenállás sem ezeken) Mivel WROVER chipet használtam, a 16 és 17 eleve nem használható, nincs is kivezetve. Nagyjából a 4,12,13,14 lábak maradnak azok, amiket különösebb gond nélkül bármire használhatunk ebben a konfigurációban.
Csak érdekességképpen: ez az összeállítás 5V 0.18A fogyasztást produkált bekapcsolt LAN modullal és WiFi-vel egyidőben. A WROVER pedig önmagában 5V 0.08A-t fogyaszt.
És akkor térjünk át a szoftver kérdéskörre!
A Tasmota32 egy kísérleti jellegű Tasmota változat, ami fut ESP32-n. (Ahogy azt blog olvasói már tudják, az alap Tasmota ESP8266 chipekre készült)
És még a béta kísérleti bináris firmware-ek között _sem_ szerepel az Ethernet támogatás, hanem vagy forrásból fordítjuk magunknak, vagy letöltjük egy külső, nem hivatalos bináris tárolóból:
https://github.com/Jason2866/Merge/blob/firmware/firmware/tasmota32/other/tasmota32-ethernet.bin
Emlékeztetőként: github-ról történő letöltéskor a "View raw"-ra kattintva tudunk eljutni egy bináris állomány letöltéséig, ez visszatérő probléma.
Ám ez még kevés a boldogsághoz, első alkalommal több egyéb fájlra is szükség van az ESP32 flasheléséhez, amik innen tölthetőek le:
https://github.com/arendst/Tasmota/tree/firmware/firmware/tasmota32/ESP32_needed_files
Név szerint ezek a bootloader_dout_40m.bin, a partitions.bin, illetve a boot_app0.bin, ezek a felhasználói program betöltéséért felelős, illetve a partíciók méretét tároló programrészek. A későbbiekben a tasmota32-ethernet.bin OTA (On-The-Air) módon frissíthető - ami igazából vezetékes lesz, nem vezetéknélküli, ahogy a neve sugallja - mindenesetre nem kell az USB kábelen keresztül programozni, hanem az első feltöltést követően már webes felületről frissíthető a firmware.
Ha minden fájl megvan, első alkalommal a szokásos esptool segédprogrammal tudjuk az USB-n csatlakoztatott ESP32 modulra feltölteni a Tasmota32 binárist: (az alábbi parancs egysoros!)
esptool.py --chip esp32 --port /dev/ttyUSB0 --before default_reset --after hard_reset write_flash -z --flash_mode dout --flash_freq 40m --flash_size detect 0x1000 bootloader_dout_40m.bin 0x8000 partitions.bin 0xe000 boot_app0.bin 0x10000 tasmota32-ethernet.bin
A sikeres flashelést követően indítsuk újra az ESP32-t, ami nyit egy tasmota_xxx nevű jelszó nélküli AP-t, amire csatlakozva hotspot módban rá tudjuk állítani a saját WiFi hálózatunkra. (ha hotspotként nem érhető el azonnal a beállítófelület, böngészővel a 192.168.4.1 címen lehet elérni AP módban)
A LAN8720 modul beállítása többlépcsős, első körben vagy a "Configure Other -> Templates" menüpontban adjuk meg az alábbi sablont:
{"NAME":"LAN8720","GPIO":[0,1,1,1,1,5536,0,0,1,0,1,1,0,0,5600,0,0,0,0,5568,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,1],"FLAG":0,"BASE":1}
Vagy a "Configure Template" menüpontban állítsuk be az ETH POWER, ETH MDIO és ETH MDC GPIO-kat a megfelelőre, a bekötési rajz felett megadott lábak szerint.
Amennyiben ez még kevésnek bizonyulna, az alábbi 4 parancsot kell bepötyögnünk a Tasmota Console-ba, ami beállítja az Ethernet modul típusát és engedélyezi azt:
Ethernet 1
EthType 0
EthClockMode 0
EthAddress 1
Ha mindent jól csináltunk és csatlakoztatva van egy élő LAN kábel, akkor az utolsó újraindítás után zölden fog világítani a LAN8720 LED-je és a Tasmota a WiFi-n kívül a LAN portjára is kap egy IP címet.
Az az apróság még kicsit szúrja a szememet, hogy én WROVER modult használok, ennek ellenére csak a WROOM-oknál megszokott 111kB szabad memória áll rendelkezésre. Ebből leszűrhető az, hogy: 1/ nemcsak a micropython esetében tűnik el az 520kB memória négyötöd része 2/ a Tasmota ethernet bináris nem kezeli a PSRAM-ot. (Az ESP32 és Micropython cikkben részleteztem a memóriával kapcsolatos tudnivalókat) Van olyan binárisa a Tasmotának ami kezeli a PSRAM-ot, mégpedig a kamerás változat, de az már egy másik mese.
Természetesen mind a két IP címén elérhető a webes felülete és teljes értékűen használható. Amennyiben a wifit szeretnénk tiltani a WIFI 0 illetve WIFICONFIG 0 parancsokkal tudjuk ezt elmagyarázni a Tasmotának.
Mivel a webes felületen csak a beállítási lehetőségek töredéke látható, ezért bővebben lásd a Tasmota parancsok listáját:
https://tasmota.github.io/docs/Commands/
ESPEasy
Az ESPEasy szintén az ESP8266 chipekre készült, de időközben az ESP32-re is megérkezett a Tasmotához hasonló módon - kísérleti jellegű támogatása. Nemrégen jelent meg a binárisok között az Ethernet modul, szóval nyugodtan mondhatjuk erre is, hogy hasonlóan béta a béták között, mint a Tasmota32. :)
A hivatalos kiadások közül az "Assets"-nél a megfelelő ESPEasy_ESP32_mega-202xxxxx.zip letölthető:
https://github.com/letscontrolit/ESPEasy/releases
A ZIP fájl egy mikrovezérlőhöz mérten meglehetősen nagy méretű, de többféle verziót és a teljes forráskódot tartalmazza. Kibontása után a bin mappában találunk többféle variációt.
Mivel Ethernet modult szeretnénk, ezért az ETH-nek szerepelnie kell a nevében, továbbá első feltöltéshez a "factory" végződésűek a jók, és ha WROVER ESP32-nk van, ahogy nekem, akkor természetesen a wrover is legyen a nevében. (amiben nem szerepel a wrover, az wroomhoz való bináris)
Aki netán csodálkozna mi az a WROVER és WROOM, legyen kedves visszalapozni az ESP32 és Micropython c. cikkhez.
Mivel esetemben nem találtam minden igényt kielégítő szimpatikus binárist, ezért első lépésben az "ESP_Easy_mega_20201102_test_ESP32-wrover-kit_4M316k-factory.bin" nevűt küldöm fel esptool segítségével az ESP32-re, majd egy OTA lépcsőben immár WiFin keresztül a webes felületéről frissítem az "ESP_Easy_mega_20201102_test_ESP32-wrover-kit_4M316k_ETH.bin" binárissal véglegesre.
Van ugyan espeasyflasher.exe is mellékelve a csomagban, de én az esptoolban jobban bízom, meg Linuxon nem futnak a Windowsos programok, így ez egy erős passz részemről. :)
Tehát USB-n csatlakoztatjuk az ESP32-t, és kiadjuk a parancsot a flash törlésre, majd a megfelelő factory firmware 0-ás címre történő kiírásához: (két sornyi parancs)
esptool.py --chip esp32 --port /dev/ttyUSB0 erase_flash
esptool.py --chip esp32 --port /dev/ttyUSB0 --before default_reset --after hard_reset write_flash -z --flash_mode dout --flash_size detect 0x0 ESP_Easy_mega_20201102_test_ESP32-wrover-kit_4M316k-factory.bin
A sikeres flashelést követően indítsuk újra az ESP32-t, ami nyit egy "ESP_Easy_0" nevű AP-t jelszó nélkül, de ha mégis kér jelszót, az "configesp" alapértelmezetten. Erre csatlakozva rá tudjuk állítani a saját WiFi hálózatunkra a hotspot felületen. (ha hotspotként nem érhető el azonnal a beállítófelület, böngészővel a 192.168.4.1 címen lehet elérni AP módban)
Amint megleljük az eszközt saját hálózatunkon a "Tools->Update Firmware" menüben ki tudjuk tallózni a szintén kicsomagolt "ESP_Easy_mega_20201102_test_ESP32-wrover-kit_4M316k_ETH.bin" binárist és az Update Firmware gombra nyomva már kezdi is a frissítést az eszköz. Ez egy jó másfél percig eltarthat, addig nem nagyon fog reagálni, hagyjuk nyugodtan dolgozni. A folyamat végén automatikusan újraindul.
Újraindulás után a Hardware menü alatt meg fog jelenni egy új Ethernet rész, ahol be tudjuk állítani a LAN modulunk paramétereit. Sajnos az ESPEasy a GPIO4 és GPIO5-öt automatán aktiválja I2C vonalként, ami üti az én GPIO5 POWER lábamat, így az I2C-t hirtelen áttettem GPIO5-ről GPIO13-ra, ennek mentése után engedte aztán újrahasznosítani a GPIO5 lábat is a menü.
A bekötési rajz feletti táblázat alapján beállíthatóak a lábak így:
Majd indítsuk újra az ESP32-t. A Tasmotával ellentétben itt Vagy-Vagy kapcsolat van: vagy WiFi vagy Ethernet lesz, a kettő együtt nem. Tehát ha preferred Ethernetre állítottuk, wifin nem fogjuk elérni, amennyiben sikerült az Ethernet modulnak DHCP-n IP címet beszereznie. Persze, aki LAN-os eszközt szeretne, nem feltétlenül fogja megsiratni ezt a korlátot. Szükség szerint a Config menüpont alatt fix IP címet is beállíthatunk.
Az egy kicsit meglepett, hogy hiába választottam a WROVER binárist, nem kezeli a 4MB PSRAM-ot az ESPEasy32, bár valamivel több, 200kB szabad memóriát jelez.
Az igazság az, hogy hozzám közelebb áll az ESPEasy webes felülete, amin minden beállítási lehetőség elérhető, mint a Tasmota minimalista, inkább konzolközeli lelkülete, de persze konkrét céltól függ, hogy melyik a jobb választás: szenzorként én mindig is az ESPEasy-t kedveltem, mivel minden különálló szenzornak külön állítható a jelentési intervalluma. A Tasmota viszont elsőrangú egyszerű kapcsolókhoz.
Ám itt még nem ér véget a történet. Nem véletlen, hogy két nappal ezelőtt cikkeztem az ESP32 és MicroPython kapcsolatáról. Ugyanis az ESPEasy-t már korábban átírtam Python nyelvre Raspberry-hez, ez lett az RPIEasy, amit nemrég vissza-alakítottam, csúnya idegen szóval backportoltam MicroPython nyelvjárással ESP32-re. Nem mondom, hogy egyszerű volt, az alap python szerkezetek persze ugyanazok, de azért rá kellett jönnöm: a mikrovezérlők azért nagyon másképp működnek. Magam is meglepődtem, amikor az amúgy 1Ghz-es processzoron 128MB-ot kérő RPIEasy-t átírva MicroPythonra, az egészen tűrhető sebességgel fut a 240Mhz-es ESP32-n, 128kB RAM-al.
Így készült az mPyEasy!
Azt azért nem állítom, hogy olyan gyors, mint az ESPEasy, ami C nyelven íródott, de én úgy gondolom használható. Mondjuk ahogy írtam korábban MicroPython alatt csak kb 100kB memória van szabadon, így eléggé sikítva megy rajta alapjáraton, legalábbis a WROOM modellen. A WROVER 4MB RAM-jában minden további nélkül elfut, mondhatni: lubickol a rendelkezésre álló szabad memóriában. Viszont ha elhagyjuk a Python nyelv egyik előnyét rejtő interpreteres megközelítést, spórolhatunk az erőforrásokkal. Van ugyanis lehetőség arra, hogy a szöveges .py állományokat előre lefordítsuk bináris .mpy fájlokká, amik méretben is kisebbek, és kevesebb memóriát is igényelnek egyrészt a méretük miatt (minden fájlt be kell töltenie az interpreternek alapesetben) másrészt mivel nem kell a bonyolult interpretert a memóriában tartani, ez eleve nyereség.
Ezek úgynevezett frozen modulok, amik ezentúl nem a felhasználói fájlrendszerben, hanem a firmware-be égetve fognak létezni. Így a WROOM modelleken is sikerült 40-50kB memóriahasználatra leszorítani az alapból 110-120kB-ot.
Ami elsődlegesen a szemeim előtt lebegett az a Xiaomi Bluetooth eszközökről történő adatgyűjtés és lehetőség szerint a LAN modul integrációja, ami úgy gondolom, sikerült is. Bár mint ahogy az előző két versenyző, ez is "béta" tesztverziós jelen állásban, és nagyjából 20 féle plugin került bele.
De nézzük a használatát!
Először is töltsük le a binárist a hivatalos kiadási oldalról:
https://github.com/enesbcs/mpyeasy/releases
A ZIP fájlt kicsomagoljuk, és a bin állományt kell feltöltenünk.
Mivel ez egy normál MicroPython firmware, az előző cikkben írt esptool módszerrel is feltölthetjük, vagy Thonny-val közvetlenül, ha betallózzuk a bin állományt:

Az "Erase flash before installing" pontot célszerű bepipálva hagyni első feltöltésnél, hogy ne maradjanak korábbi firmware-ekből esetleg zavaró dolgok az adatpartíció helyén, ami megakaszthatná a bootolási folyamatot. Ha mpyeasy volt rajta korábban is, akkor a törlés opció kihagyandó.
Feltöltés után automatikusan újraindul az eszköz és egy "mpyEasy" nevű WiFi AP fog megjelenni, jelszava "configesp". Böngészővel a 192.168.4.1 címre látogatva a Config menüpontban megadhatjuk saját WiFi AP-nk nevét és jelszavát.
Ne felejtsük el bepipálni az "Enable Wifi STA mode" jelölőnégyzetet sem a lent található Submit-ra kattintás előtt. Majd indítsuk újra, és immár a saját hálózatunkon levő IP címén keresztül menedzselhetjük az eszközt egy böngészővel.
A Hardware - LAN menüt látogassuk meg ahhoz, hogy engedélyezni tudjuk a LAN8720 modult a bekötési rajz feletti táblázatnak megfelelően:
Mentés után várjunk türelemmel, az ESPEasy-től eltérően a mentés nem bináris fájlba, hanem szöveges JSON állományokba történik, ahogy az RPIEasy-nél, ez egy kicsit erőforrás igényesebb. A mentést követően a Hardware főoldalt tölti be, ahol máris látható mely lábakat foglalta le a LAN8720, amik már nem használhatóak más célra.
Sikeres mentést követően a Config menübe visszalépve megjelenik egy új részleg "LAN settings" néven. Ahhoz, hogy a bekonfigurált LAN modult használja is a rendszer, engedélyeznünk kell az "Enable LAN" jelölőnégyzetet. Amennyiben a DHCP mellől kivesszük a pipát, akkor fix IP-t is megadhatunk ezen a helyen. Illetve tetszőleges kombinációt dolgozhatunk ki, hogy akarunk-e mellé Wifit vagy sem, esetleg AP mód menjen fixen, vagy csak ha nincs vezetékes LAN kapcsolat, ízlés szerint. (PSRAM-al legalábbis jól működik minden egyidőben is, de jelen MicroPython verzióval egyidőben csak egyféle kapcsolat megy stabilan PSRAM nélkül!)
A lényeg az, hogyha elmentettük a beállításokat, csináljunk egy újraindítást!
A várakozásoknak megfelelően kapott IP-t a vezetékes hálózatról is, és a WiFi-n is, valamint látható, hogy ez bizony egy WROVER változat, mert a 4MB PSRAM is elérhető. (ez ugyanaz a hardver egyébként, amin az ESPEasy és a Tasmota is tesztelésre került)
Azért ez a 3973kB szabad memória lényegesen jobban hangzik, mint a korábbiak. Csak hogy egy példát mondjak egy 160x160-as kijelző 51kB memóriát igényel framebuffer módban, így a 110kB szabad memória igencsak szűkös tud lenni, mert a programkódnak és a betűfontoknak is tárolódni kell valahol. ;)
Dióhéjban ennyit szerettem volna bemutatni az ESP32 és a vezetékes LAN beállításáról, ezzel a sokak által keresett LAN-os relék és szenzorok újabb lehetőségeit felvillantva.
Léteznek olyan kész ESP32 lapok, melyekre a LAN és PoE áramellátó is integrálva vannak, ezekkel kényelmesebb dolgozni, hamarosan ezekről is írok pár gondolatot.
A bejegyzés trackback címe:
Kommentek:
A hozzászólások a vonatkozó jogszabályok értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a Felhasználási feltételekben és az adatvédelmi tájékoztatóban.
knisa 2020.11.20. 14:47:46
eNeS 2020.11.20. 18:58:23
tápegység 2022.01.10. 16:51:57
eNeS 2022.01.10. 17:06:50
Kommentezéshez lépj be, vagy regisztrálj! ‐ Belépés Facebookkal