K mikrokontroléru ESP32 existuje množstvo periférii, ktoré je možné pripojiť cez podporované zbernice a rozhrania. Jedno z menej známych rozhraní je RMII (Reduced media-independent interface), ktoré znižuje počet potrebných signálov (oproti rozhraniu MII) pre prepojenie mikrokontroléra s perifériou. RMII využíva jeden hodinový signál pre príjem a odosielanie dát, RXDV a CRS multiplexuje do jedného signálu a nemá signál COL a hodinový signál je zvýšený z 25 MHz na 50 MHz.
Medzi populárnu perifériu, ktorú je možné pripojiť k ESP32 cez RMII rozhranie je PHY Ethernet modul s čipom LAN8720. Samotný PHY čip nemá MAC vrstvu, teda tá je zabezpečená priamo mikrokontrolérom ESP32. Zaujímavosťou je, že MAC vrstvu ESP32 poskytuje cez WiFi kontróler pre ovládanie Ethernetu a posielanie stavových signálov. LAN8720 podporuje Ethernet (10 Mbps) a Fast Ethernet (100 Mbps) štandard s Full-Duplex prenosom.
Zapojenie s ESP32 ==> LAN8720 PHY Ethernet modul:
PHY Ethernet LAN8720 má 3V3 logiku s 2.0V a vyššie pre log 1 a 0.8V a menej pre log 0 (podľa špecifikácia RMII). Periféria nie je 5V tolerantná. Pre prepojenie ESP32 s LAN8720 cez rozhranie RMII je potrebných 8 dátových signálov + napájanie.
3V3 |
Vcc |
GND |
GND (RBIAS) |
D18 |
MDIO |
D19 |
TXD0 |
D21 |
TXEN |
D22 |
TXD1 |
D23 |
MDC |
D25 |
RXD0 |
D26 |
RXD1 |
D27 |
CRS_DV |
Programová implementácia
PHY Ethernet je podporovaný vo frameworku ESP-IDF ale taktiež aj vo Wiringu (Arduino Core pre ESP32). Vstavaná knižnica ETH slúži pre inicializáciu PHY Ethernetu. Okrem LAN8720 je možné využiť aj iné moduly pre PHY Ethernet - TLK110 / IP101GRI. Stavy Ethernetu sa zobrazujú cez WiFi eventy, ktoré indikujú aktuálny stav Ethernetu, pričom dokáže rozoznať aj odpojený LAN Ethernet kábel. Stavové WiFi eventy vypíšu (z príkladov ETH knižnice) IP adresu po pridelení z DHCP služby, Duplex mód a taktiež aj nastavená rýchlosť komunikácie.
Ethernet LAN8720 som otestoval v rôznych projektoch, napríklad v režime webclient ako ultrazvukový senzorový uzol, či pre termostat s teplotnými senzormi DS18B20 Dallas. Po inicializácii Ethernetu je možné využívať všetky sieťové funkcie a knižnice totožne ako v prípade požívania WiFi na ESP32. Pre HTTP spojenia som využíval socket spojenie v knižnici WiFi, taktiež mi fungovalo aj šifrované spojenie s webserverom po HTTPS protokole s využitím Root CA certifikátu - knižnica WiFiClientSecure.
Taktiež aj knižnica Webserver funguje totožne a bez úprav programu funguje programová implementácia aj pod Ethernetom. ESP32 s PHY Ethernetom som tak implementoval do projektu Hladinomer, kde funguje ako klient a v pravidelných intervaloch odosiela dáta na webserver po HTTP, alebo HTTPS protokole. V tejto programovej implementácii som použil FreeRTOS s Queue blokovacím mechanizmom taskov totožne ako v programe pre WiFi variant.
Druhou implementáciou, kde som LAN8720 skúšal bol Ethernet termostat ako ekvivalent už k existujúcemu WiFi termostatu. Implementácia bola jednoduchá, stačilo nahradiť inicializáciu WiFi za Ethernet (jednoriadková úprava). Termostat využíva teplotné čídlo Dallas DS18B20 na OneWire zbernici s 12-bitovým rozlíšením meraní - 0.0625 °C. Ethernet termostat som sa rozhodol vylepšiť o OTA (Over-The-Air) pre možnosť vzdialeného nahrávania firmvéru, nakoľko som v miestnosti nemal možnosť dvojzásuvky. Z počítača som tak mohol cez sieť aktualizovať firmvér termostatu bez potreby nahrávania cez USB kábel. Aj táto funkcionalita fungovala korektne bez potreby úpravy programovej implementácie. Firmvér sa úspešne nahral nástrojom espota.py a spustil na mikrokontroléri.
Ethernet modul LAN8720 funguje výborne. Nezaznamenal som žiadne výpadky Ethernetu pri prevádzke na client-side, alebo serverových aplikácii. Testoval som niečo vyše dvoch týždňov v non-stop prevádzke. Modul preto odporúčam, i keď k nemu neexistuje veľa tutoriálov, jeho zapojenie a následné použitie v programovej implementácii je jednoduché.
Ďalším plusom je cena. Na slovenských e-shopoch modul zakúpite pod 5€, čo je menej ako za Ethernet moduly ENC28J60, či Wiznet pre Arduino s ktorými je problém urobiť spoľahlivú aplikáciu, či už z pohľadu pamäte (najmä u mikrokontrolérov Arduino s jednotkami kB RAM, ENC28J60 navyše vyžaduje SW stack, ktorý musí bežať na Arduine), alebo aj po stránke napájania (rádovo 150 mA, pričom LAN8720 má maximálne 49 mA pri vysielaní na 100 Mbps Full Duplex). Pri Arduino doskách nemôžete využiť šifrované spojenie s webserverom z dôvodu absencie kryptografických akcelerátorov a najmä chýbajúcej pamäti.
K stabilite prislúcha aj počet možných otvorených socket spojení. V prípade ENC28J60 je počet spojení závislý od mikrokontroléra, ktorý celý stack spravuje. Arduino Uno v štandardnom programe zvláda 1 až 2 aktívne socket spojenia na ktoré stačí 2 kB RAM pamät. V prípade Wiznet W5100 Ethernet modulov sú to 4 spojenia, W5500 podporuje 8 nezávislých spojení. Všetky Wiznet moduly majú hardvérový stack. Nakoľko LAN8720 nemá MAC, je počet spojení závislý od mikrokontroléra. ESP32 pre WiFi podporuje 10 nezávislých spojení, ktoré je možné použiť aj pre PHY Ethernet.
Programová implementácia pre Ethernet PHY termostat na ESP32:
https://martinius96.github.io/termostat-ethernet/phy_ethernet.html