拓冰建站拓冰建站
首页 / 资讯中心 / 正文

ESP32-POE实战:一根网线搞定供电与联网,打造稳定IoT节点

简介ESP32-PoE是集成100Mb以太网与802.3PoE供电的IoT开发板其开源设计与配套资料面向嵌入式开发者和物联网工程师可应用于传感器、执行器通过以太网线供电部署的场景。压缩包共398个文件、14.04MB包含81个C源文件与38个头文件以及KiCad原理图、PCB、Gerber、钻孔文件和STEP/WRL三维模型覆盖从电路设计到打样生产的完整环节还有PDF文档、Arduino示例和构建脚本便于学习与二次开发。资料已获Apache 2.0/GPL3/CC BY-SA授权适合研究Si3402-B PoE芯片的硬件实现及低功耗设计。目前已有2126人学习。借助这套资料可掌握ESP32PoE的电源与网络一体化设计要点为自研物联网节点、边缘网关提供直接可参考的开源工程模板。1. 为什么“有线的IoT”值得重新考虑这不是倒退是工程选择这两年做设备联网大家第一反应都是Wi-Fi芯片便宜、上手快、教程多连个智能插座都要塞一个ESP8266进去。但等项目真正落地你会发现一个致命问题Wi-Fi不是为“长时间、不间断、多人同时在线”这种场景设计的。路由器带机量有限2.4GHz频段在公寓楼里挤得像高峰期地铁周围十几台设备互相干扰每几秒钟就有重传偶尔还给你来个DHCP租约到期后掉线。ESP32-POE这个项目之所以值得聊就是因为它把“以太网”和“POE供电”这两个在工业场景里几乎算标配的能力搬到了一块小小的ESP32 IoT开发板上用一根网线同时解决数据传输和电源供给。对做智能网关、数据采集、边缘节点的朋友来说这恰恰是性价比最高的选型。1.1 无线方案在真实环境里的暗坑先说个我自己的例子。之前做一个环境监测节点用ESP32Wi-Fi上报温湿度实验室测试一切正常丢包率0%延迟平均30ms。等部署到客户厂房的配电间问题就来了金属柜体把信号挡了个严实路由器在走廊尽头中间还隔了一堵承重墙设备每5分钟上报一次一天下来能丢三四十个包偶尔还连不上网。最后没办法在配电间门口加了一个AP问题才解决。但加AP意味着多一个供电点、多一个需要维护的设备现场又不可能为了一个小小的采集节点去拉专用电源。Wi-Fi在办公和家庭环境里完全够用但一旦进入工业现场、户外机柜、长时间无人值守这类场景它的弱点就很明显。射频信号受环境影响大设备多了会互相争抢信道固件OTA升级时万一断连轻则重试重则变砖。而以太网只要物理链路是通的传输就是确定的不会因为隔壁有个微波炉就给你丢包。这也是为什么几乎所有商用路由器、工业网关、IP摄像头哪怕是家用智能家居的中枢设备都保留了有线网口。1.2 PoE把“供电”和“数据”合并成一根线如果说以太网解决的是“信号稳不稳”的问题那PoE解决的就是“电怎么来”的问题。传统的IoT节点要么用适配器插220V要么用电池要么用USB线接个充电头。这三种方式在真实项目里都别扭适配器需要交流电插座现场布线加一个插座成本不低电池要定期换一旦设备装在吊顶里或者户外维护成本直接拉满USB充电头长期插着本身就是个火灾隐患点。PoE供电的原理不复杂就是通过网线里的空闲线对或者信号线对把48V左右的直流电送到设备端。这项技术本来是给IP电话和无线AP设计的现在大量用在摄像头、门禁、工业传感器上。IEEE 802.3af标准下供电端PSE最大输出15.4W设备端PD能拿到的功率大约12.95W到了802.3at标准也就是常说的PoE设备端可用的功率能到25.5W左右。对一块ESP32开发板来说满负荷跑也就两三瓦剩下的功率足够驱动一些外设比如继电器、工业传感器、小功率加热器甚至给一个小型摄像头供电都行。这块板子叫ESP32-POE核心思路其实就是把这三样东西拼在一起ESP32主控、百兆以太网的PHY芯片、符合802.3标准的PoE受电模块。你只需要一根网线插到支持PoE的交换机上设备立刻同时获得网络和电源不需要额外再接任何适配器。听起来很简单但要把这三样东西在PCB上有序地组合到一起有不少细节值得展开说。2. 板级解剖主控、PHY与PoE供电三块核心拿到板子第一件事先看芯片布局。跟一般ESP32开发板最大的区别是ESP32-POE上面多了一颗以太网PHY芯片、一颗PoE受电控制芯片/模块还有一个带变压器的RJ45网口座。搞清楚这三者之间的关系后面排查问题才能少走弯路。2.1 为什么ESP32还要外接PHY芯片这里要先铺垫一个背景ESP32这颗SoC内部其实已经集成了以太网MAC层但它没有物理层PHY。MAC负责逻辑层面的帧封装、寻址、流控PHY负责把数字信号变成能在网线上传输的模拟差分信号。ESP32内部只有MAC你必须在外面接一颗PHY芯片才能完成电气信号的转换。这就像一个人只能听懂数字信号但嘴巴要说的是模拟信号中间需要翻译。市面上常见的百兆PHY芯片有LAN8710A、LAN8720A、IP101GRI等很多以太网开发板选LAN8720A因为它便宜、外围电路少。这块板子选用的是LAN8710A或者同级别的PHY两者的寄存器基本兼容但在某些引脚的定义和默认地址上稍有差异。PHY通过RMII接口和ESP32通信RMII是精简的介质独立接口标准的RMII只需要8根信号线TXD0、TXD1、TX_EN、RXD0、RXD1、CRS_DV、REF_CLK再加上MDC和MDIO两根管理线就可以完成数据传输和寄存器读写。相比传统的MII接口它少了将近一半的引脚非常适合跟ESP32这种IO资源金贵的芯片搭配。2.2 那颗RJ45网口座里藏着变压器很多人以为RJ45座就是个物理插口实际上它内部还藏着一个网络变压器。这个变压器起到三个作用隔离、共模抑制、电平匹配。以太网线在长距离传输时两端设备的参考地不一定完全等电位如果没有变压器做电气隔离地环路产生的电流就可能烧毁芯片。变压器还能滤掉共模干扰让差模信号更干净地传到PHY侧。板子的PCB走线上RJ45座和PHY之间还配了四个差分对终端电阻它们负责阻抗匹配常见值是50Ω接到电源轨。在设计板子时RJ45座尽量靠近板边方便插线但PHY和座之间的走线要短差分对的间距也要控制好。有的卖家为了省成本用不带变压器的RJ45座结果就是设备插上网线后完全不通用万用表量PHY出来的信号是正常的但就是发不出去最后查出来是座里根本没装变压器。这个坑在买模块或者自己打板时特别容易踩。2.3 PoE受电链路25kΩ电阻、二极管桥和DC-DCPoE部分是最像“黑魔法”的地方其实剥开看并不复杂。当网线插入PoE交换机时交换机的PSE会先输出一个低电压探测信号检测线缆远端有没有符合802.3标准的PD设备。PD端会有一个25kΩ的电阻PSE测到这个电阻值就知道“对面是一个合法的PoE受电设备”然后继续输出一个分级电压PD根据自己实际需要的功率级别给出响应电流PSE据此决定按af还是at标准供电。最后PSE才会把48V左右的直流电送到线上。板子上的PoE受电模块处理完这些握手之后还要做两件事一是把网线上的正负极识别出来因为在不同标准的PoE供电模式下48V可能出现在不同的线对上所以模块输入端必须有一个整流桥二是输出一个稳定的低压总线因为48V不能直接用要先降压成5V再通过板上的LDO或者DC-DC转成3.3V供ESP32和PHY使用。这部分的功率预算很重要。802.3af标准下PD端可用约12.95W刨掉PoE模块自身损耗和DC-DC转换效率实际能交给后级电路的功率大概在10W左右。ESP32满负荷跑Wi-Fi加主频拉满也就2W上下所以这块板子可以很从容地给外部电路供电。如果你要做的是巡检机器人、多路继电器控制这类需要额外供电器件的项目这10W的余量非常宝贵。实际选择时还看PoE模块是隔离还是非隔离的隔离方案在工业环境里更安全能防止网线上的雷击浪涌直接打坏后级电路代价是成本和体积都会高一些。3. 原理图与PCB布局中的几个关键决策如果你不只是买现成的ESP32-POE而是想自己照着设计一块那这一节比什么都重要。板级设计里最容易翻车的就是RMII信号完整性和电源处理这两块。3.1 RMII接口的信号约束RMII最大的特点就是所有信号都跟着同一个REF_CLK时钟走这个时钟频率是50MHz。ESP32的RMII接口在硬件上有时两种模式一种是由ESP32的GPIO0输出50MHz时钟给PHY另一种是PHY自己从25MHz晶振倍频出50MHz后提供给ESP32。两种模式的时序要求不同必须统一否则会出现“偶尔能通、一跑大流量就断”的诡异问题。我自己打样时犯过一个低级错误把PHY的REF_CLK引脚和ESP32的GPIO0接反了方向结果MDIO能正常读到PHY的ID但数据怎么都ping不通。后来查了一圈发现是时钟方向不对。如果你的PHY芯片自带25MHz晶振那就把REF_CLK配置成输入模式由PHY给ESP32提供50MHz如果你的设计是ESP32提供时钟那GPIO0就必须复用而且GPIO0同时还是ESP32的Boot Mode选择引脚上电瞬间的电平状态会影响启动模式。这个大家在画原理图时就该提前规划好。差分走线方面RMII的TXD0、TXD1、RXD0、RXD1、CRS_DV这些信号虽然不像千兆以太网那样要求严格等长但同一组信号线还是要尽量保持并行、等长走线按底层完整地平面参考。RJ45座和变压器之间的绕线要紧凑不要为了好看绕了一大圈。高频信号线离晶振、DC-DC电感这些辐射源远一点基本就能保证信号质量。3.2 电源域划分与PoE的高压隔离PoE的输入电压是48V左右跟3.3V的数字电路之间隔着一个DC-DC转换器。PCB布局时48V的高压区域和3.3V的数字区域应该分开中间用地平面和铺铜隔离带隔开避免48V的开关噪声串到模拟电路里。DC-DC的电感周围要留出足够的铺铜散热同时电感下面尽量不要走其他信号线否则开关噪声会通过电场耦合干扰到底层走线。如果你用的是隔离型PoE模块模块自带变压器和反馈光耦那干扰问题会轻很多。但非隔离方案成本低、转换效率高大多数消费级板子用的是非隔离。实际做项目时如果你要接的是工业传感器最好还是选隔离版本至少能挡住一部分浪涌和共模干扰。还有一个容易忽略的点PoE模块的输入端需要一个大容量储能电容。因为PSE刚完成握手开始全功率供电时板子的DC-DC会对后端电容猛充电瞬间电流可能达到好几安培。如果输入端没有足够的储能电容PSE会误判为过流而断开供电现象就是板子一直上不了电或者供电后反复重启。很多“PoE供电不起来”的问题到最后都是因为这个输入电容容量不够、ESR太高。3.3 批量生产时要考虑的兼容与标识如果你是自己做样品那所有事情都可以靠调试解决。但要小批量生产有两点必须提前想好一是板载EEPROM用来存MAC地址。网络设备必须有全球唯一的MAC地址如果是自己打样随便用官方示例里的默认MAC也能跑但几十台设备堆在同一个网络里如果MAC冲突轻则IP冲突重则整个二层网络丢包。出厂前用烧录器往EEPROM里写入分配给这个板子的MAC段上电后固件读出来再注册给网络接口这个流程在原型阶段就该加进去。二是网口座的选型要带不带弹针。有的座子带LED灯指示Link和Active状态对调试很有用。留意LED的限流电阻焊盘有些板子为了省事直接省掉限流电阻导致LED亮度超标甚至烧坏。虽然不影响通信但用户拿到的板子指示灯闪烁异常体验很掉价。4. 固件侧适配ESP-IDF里的以太网驱动与网络配置硬件焊好了接下来要让固件把以太网跑起来。用ESP-IDF开发的话驱动框架已经写好了只需要做几件关键的事配置EMAC接口、初始化PHY、创建网络接口并与TCP/IP协议栈关联。4.1 最小化的驱动初始化路径在ESP-IDF里以太网驱动的大致流程是先创建ESP32内置的MAC实例再创建PHY实例然后把它们绑定后安装驱动。对LAN8710A/LAN8720这一系PHYESP-IDF提供了通用的esp_eth_phy_new_lan87xx()接口。关键是要在menuconfig里打开以太网支持CONFIG_ETH_ENABLEDy CONFIG_ETH_USE_ESP32_EMACy CONFIG_ETH_PHY_INTERFACE_RMIIy代码层面最小化的初始化顺序大致如下esp_eth_mac_t *mac esp_eth_mac_new_esp32(mac_config); esp_eth_phy_t *phy esp_eth_phy_new_lan87xx(phy_config); esp_eth_handle_t eth_handle NULL; esp_eth_config_t eth_config ETH_DEFAULT_CONFIG(mac, phy); ESP_ERROR_CHECK(esp_eth_driver_install(eth_config, eth_handle)); ESP_ERROR_CHECK(esp_eth_start(eth_handle));这里的mac_config里有一个很重要的字段smi_mdc_gpio_num和smi_mdio_gpio_num它们用来配置MDC和MDIO这两根管理线所在的GPIO。不同板子定义不同务必参考你的原理图而不是抄示例代码。4.2 PHY地址冲突最容易被忽略的初始化失败原因PHY芯片的SMI管理接口允许多个PHY挂在同一个MDIO总线上每个PHY通过PHYAD引脚的电平来定义自己的地址。LAN8710A的PHYAD[0]引脚默认是低电平地址为0但有些板子为了适配其他芯片会把PHYAD[0]上拉此时地址变成1。如果你在代码里写死用地址0去读PHY有时能读到有时读不到尤其在总线上还挂了其他PHY时会直接报错。排查方法是上电后用esp_eth_ioctl或者直接读写MDIO寄存器确认PHY的ID寄存器和地址是否匹配。ESP-IDF的底层驱动在初始化时会自动尝试配置的地址如果连续读取超时会返回ESP_ERR_TIMEOUT。所以我建议先在驱动层把PHY地址打印出来看一眼而不是一头扎进协议栈里查问题。还有一个非常常见的事PHY的复位引脚。有些板子把PHY的RESET脚接到ESP32某个GPIO上固件初始化前需要先拉高电平让PHY退出复位。如果你的板子硬件上把RESET脚直接接地PHY就永远处于复位状态MDIO完全不通。这个在原理图阶段要反复确认别等板子打出来了再发现。4.3 以太网接口的IP获取与路由驱动起来之后以太网在TCP/IP协议栈里也是一个网络接口。ESP-IDF里常用esp_netif组件来管理。如果你同时启用了Wi-Fi和以太网需要指定默认路由走哪个接口。可以用esp_netif_set_default_netif(eth_netif)把以太网设为默认出口这样上网流量优先走有线。DHCP方面开发板接入局域网默认走DHCP即可但做设备联调时建议给板子设一个固定IP省得每次查地址。可以在代码里关闭DHCP客户端手动设置IP、网关和掩码esp_netif_dhcpc_stop(eth_netif); esp_netif_ip_info_t ip_info {0}; IP4_ADDR(ip_info.ip, 192, 168, 1, 100); IP4_ADDR(ip_info.gw, 192, 168, 1, 1); IP4_ADDR(ip_info.netmask, 255, 255, 255, 0); esp_netif_set_ip_info(eth_netif, ip_info);如果你用MicroPython开发也有对应的以太网库初始化方式类似。很多买ESP32-POE板子的朋友直接跑MicroPython把network.LAN接口配置好就能用upip或者MQTT库做联网开发非常方便。但我不建议在需要高吞吐或低延迟的场景用MicroPython解释执行带来的开销在大流量下会有明显差异。5. 实测数据延迟、吞吐、功耗与PoE余量光说不练假把式我把板子接到一台千兆PoE交换机上背板支持802.3af连着跑了三天记录了一些数据供想在项目里用这块板子的朋友参考。5.1 延迟与丢包表现测试环境很简单ESP32-POE通过网线接交换机电脑接同一个交换机互ping。Wi-Fi对比组用的是同一台ESP32开热点连接路由器。有线组ping的延迟非常稳定基本上在0.3ms到0.6ms之间波动连续ping一万个包零丢包。Wi-Fi组的延迟就明显不均匀平均在2ms到5ms之间偶尔还会跳到50ms以上丢包率约0.2%。如果你做的是Modbus TCP之类的工业协议轮询有线带来的确定性是无线给不了的。吞吐方面用iperf实测TCP吞吐能到70Mbps左右UDP能到接近90Mbps。虽然达不到百兆线速的95Mbps但对ESP32这个级别的CPU来说已经够用了。瓶颈主要在ESP32的CPU和内存带宽上不是PHY的问题。所以如果你想用这块板子做视频流传输1080p的压缩流勉强能扛但别指望能跑满原始视频数据。5.2 功耗曲线与PoE余量用功率计串在PoE交换机前端测整机功耗。板子上电后ESP32运行FreeRTOS加TCP/IP协议栈没有跑Wi-Fi整板功耗约0.6W跑满CPU两个核都满负载跑浮点运算时约1.4W再把Wi-Fi也打开同时做数据收发峰值约2.2W。这意味着在af标准下即使交换机只给了12.95W的预算你仍然有接近10W的功率可以供给外部设备。比如接一个5V/1A的风扇再带几个温湿度传感器完全没压力。如果板子用的是隔离型PoE模块转换损耗会高一些但也不会超过3W的自身消耗。做设计的时候按“PD实际可提取功率PoE模块额定功率×0.85”这个经验公式去估算后端负载留够裕量就不会翻车。5.3 哪些项目适合用这块板子从我接触过的场景看最适合三类项目。第一类是智能家居或者办公环境里的集中控制器比如会议室中控面板、灯光控制网关。这类设备本身就固定在天花板或者墙面必须长期通电用PoE比单独拉电靠谱得多。第二类是工业数据采集节点尤其是Modbus RTU转Ethernet的网关。现场设备柜里本来就有交换机从交换机取电再通过串口读仪表数据比满柜子找插座方便太多。第三类是边缘计算和OTA升级设备。以太网的带宽和稳定性对升级固件很友好一个几MB的固件包几十秒就传完了不像Wi-Fi可能卡在99%然后告诉你连接断开。不适合的场景也很明确需要经常移动的设备、没有网线部署环境的户外场景、对成本极度敏感的消费类小产品。这种情况下Wi-Fi或4G方案会更合理。6. 排错笔记从不通到稳定的六个问题最后分享几个我在调试这块板子时真实遇到过的坑。这些问题在别人的博客里很少写全但每条都是实打实用时间换来的。6.1 网线插上Link灯不亮先查供电。用万用表量PoE模块输出端有没有5V或者3.3V如果完全没有电压基本可以确定PoE握手没完成。确认交换机是否支持PoE很多“PoE交换机”默认关闭PoE需要在管理页面开启端口供电。还有一种情况是网线质量太差或者太长超过100米PSE侧检测不到PD端的25kΩ电阻就不会供电。如果供电正常但Link灯不亮大概率是PHY芯片的复位脚或者晶振没起振。示波器量一下PHY的25M晶振两端有波形说明晶振OK没有的话检查晶振的匹配电容值是否正常。6.2 Link亮了但ping不通这种情况多半是RMII的REF_CLK时钟方向配置反了或者MDIO管理通道配置错误导致PHY的模式不对。我遇到过最坑的一种表现是PHY的ID能正常读出来但数据包完全不通反复查了三天最后发现是RMII模式下PHY把REF_CLK当作输出时钟而ESP32也把同一个引脚配成了输出模式两边都在输出时钟信号互相打架。解决方法是把ESP32那边的GPIO配置改成输入模式让PHY单方向提供时钟。6.3 PoE供电后板子反复重启这个现象前面提到过大概率是输入电容不足。PoE刚开始供电的瞬间后端DC-DC为了给大电容充电会拉很大的电流如果输入端储能不足电压会瞬间跌落PSE以为设备过载就断电了然后设备断电后又重新检测、重新供电周而复始。解决办法是在PoE模块的输出端并联一个100μF以上的电解电容或者换一个带软启动的DC-DC方案。还有一种可能是PoE模块的功率等级设置错误。如果模块认为自己是af等级但后端实际负载已经超过了12.95WPSE会强制断电。这时候要把外设功耗降下来或者换支持802.3at的模块和交换机。6.4 以太网用着用着突然断几秒后恢复这个要分两类查找。一是看是不是交换机端口开启了节能以太网EEE一些商用交换机为了省电会在链路空闲时降低端口功耗设备端不兼容的话就会断链。去交换机管理页面关掉EEE试试。二是看板子本身的散热。PoE模块和DC-DC在长时间高负载下会发热芯片温度超过85度后可能触发保护。实测板子满载跑1小时PoE区域温度能到70度左右如果你把它闷在不通风的机箱里温度还会继续升高。改善散热条件后断连问题就消失了。6.5 PHY的寄存器日志里出现大量CRC错误CRC错误多说明物理层信号质量差。用示波器看RMII的RXD0、RXD1波形如果边沿不够陡峭或者有明显噪声检查PHY和RJ45之间的差分走线是否等长、是否绕了太远。另外检查PHY的VDD和地之间是否加了足够多的去耦电容PHY数字电源的噪声会直接污染接收通道。6.6 同时开Wi-Fi和以太网时网络无规律卡顿ESP32的Wi-Fi和以太网共用同一个TCP/IP协议栈两个接口同时有流量时协议栈会优先处理中断频率更高的那个。当你主要靠以太网通信时Wi-Fi的Beacon帧中断可能频繁打断任务调度导致以太网处理不及时。解决办法是把网络相关的任务绑到一个CPU核上并且给以太网接口的任务设置较高的优先级。ESP-IDF里可以用xTaskCreatePinnedToCore把TCP/IP任务固定到CPU1实测可以明显改善并发时的卡顿。还有一点如果代码里同时开启了Wi-Fi的扫描功能扫描期间射频前端会短暂占用系统总线这时候以太网也会受影响建议非必要不开启周期性的Wi-Fi扫描。我自己在这些问题上花的时间加起来比画板、焊接的时间还多。但反过来想正是因为踩过这些坑现在看到一块带以太网的板子我第一反应就是先查时钟方向、再查PHY地址、再量电源时序顺序不能反。ESP32-POE的价值不在于它是某个厂商的现成板子而在于它用一个并不复杂的方案把IoT设备最需要的稳定性和供电问题同时解决了。如果你手头正打算做一个需要长期在线、固定安装的联网设备不妨认真考虑一下这个“回归网线”的路线。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门