简介:面向物联网开发者、硬件工程师与嵌入式学习者,这是ESP32-PoE开源物联网开发板的完整资料包,涵盖硬件电路、固件示例与文档三部分。板卡集成WiFi、BLE与百兆以太网,采用符合IEEE 802.3的Si3402-B PoE芯片,能通过网线同步供电与传输数据;深度睡眠电流低于100微安,适配传感器、执行器类低功耗边缘节点。压缩包内含398个文件、共约14MB,包含81个C源码、38个头文件、13个Arduino例程、KiCad原理图与PCB工程、45个Gerber制造文件、STEP/WRL三维模型、16个PDF文档及SDK配置,可覆盖电路设计、打样生产到固件开发全链路。值得留意的是,C代码里还带NES模拟器实现,可作为显示类应用在PoE供电板卡上运行的参照。硬件与软件分别采用Apache 2.0、GPL3协议,文档按CC BY-SA 3.0发布,便于自由学习与二次开发。目前已有2126人学习下载,适合快速搭建基于以太网供电的低功耗物联网原型,也可作为高校课程设计与开源硬件改造的起点。
1. 项目概述与整体设计思路
做物联网(IoT)开发这些年,真正让我头疼的往往不是代码,而是两件看起来很小的事:设备联网不稳、部署点取电难。用ESP32做节点,WiFi连上路由器挺简单,可一到现场就发现信号弱、延迟飘、断线重连一大堆破事;再碰上走廊吊顶、机房机柜、厂房角落,附近压根没有插座。ESP32-POE这种同时带100Mb以太网和802.3以太网供电(POE)的IoT开发板,恰好把这两个痛点一起解决了——一根网线进去,数据和电都齐了。这篇文章从原理、电路、固件到排查,把它拆开讲清楚,适合正在做IoT网关、边缘采集、智能硬件原型的工程师和学生参考。
1.1 为什么IoT设备要上以太网和POE
先说以太网。WiFi、BLE这类无线方案前期部署省事,但真实环境的稳定性完全看运气:楼上楼下隔一面墙,信号就少一格;车间里电机一起动,丢包率直接起飞。而100Mb以太网在局域网内几乎是零丢包的,延迟稳定在几毫秒,还不受频段干扰。对很多采集和控制场景来说,有线带来的确定性比“看着更先进”的无线值钱得多,尤其涉及设备固件升级、远程调试、实时数据上报时,有线链路的优势会成倍放大。
再说POE。无线设备总得供电吧?普通电源适配器需要附近有插座,这在工业现场和楼宇吊顶里经常是奢望。POE通过同一根网线供48V直流电,从交换机端集中取电,设备端就不需要额外电源了。IEEE 802.3af标准能提供约12.95W功率,802.3at可以到25.5W,对ESP32这种低功耗主控来说非常充裕,剩下的功率还能带传感器、继电器、小屏幕。一根网线同时解决数据和供电,部署成本比单独拉电力线低一个数量级,这就是POE在物联网场景里最重要的价值。
1.2 开发板硬件拓扑与选型理由
这块板子的整体结构并不复杂:RJ45网口进来后,网络变压器和磁性元件负责信号隔离与耦合,中心抽头引出的48V进POE控制器和DC-DC降压,变成5V和3.3V;同时网口差分线进以太网PHY芯片,通过RMII接口和ESP32交换数据。数据通路和供电通路在物理上分开,但共用同一个RJ45座,所以PCB设计时要注意高压和数字区域的隔离。
选型上有几个关键决策。首先是主控,ESP32自带以太网MAC控制器,但物理层必须外接PHY,生态非常成熟,ESP-IDF里直接有esp_eth驱动,代码基本不用自己写,成本也比带MAC的MCU方案低。更妙的是ESP32本身还带WiFi和蓝牙,POE以太网作为主链路,无线通道可以留作配网、OTA备份或者调试,双网冗余在很多项目里是刚需。
其次是PHY芯片,我用得最多的是LAN8720A。它支持RMII接口、3.3V供电、100Mbps速率,封装小、价格便宜,资料也多,典型IoT板子几乎都选它。替代方案有IP101GRI和RTL8201F,选型时主要看货源、价格和驱动兼容性,ESP-IDF对这几种PHY都有现成驱动,切换成本不大。
最后是POE控制器,市面上常见SI3402、TPS2375、NCP1090等。功能上它们都能实现802.3af/at的PD端握手、浪涌控制和分类,差异主要在集成度、最大功率和外围电路复杂度。自己做板子我一般选内部集成DC-DC控制器的型号,能少绕一圈,布局也干净很多。
2. 核心技术原理:100Mb以太网与802.3 POE
很多人拿到POE板子,第一步就陷入“按照电路图连,但就是不工作”的困境。要解决问题,得先搞清楚两个协议背后的物理层逻辑。这里把100Mb以太网和POE的握手过程拆开讲一遍,后面排查问题时你会回来感谢这段内容。
2.1 100Mb以太网物理层与MAC/PHY分工
以太网的数据通路分两层:MAC层负责组帧、地址过滤、差错控制;PHY层负责把数据变成能在网线上传输的物理信号。ESP32内部集成了MAC,但物理编码和信号驱动做不了,所以必须外接一颗PHY芯片完成编码和信号转换。
RMII是MAC和PHY之间的标准接口,比传统MII少了一半引脚,特别适合IoT板子。它只需要TXD0/TXD1、RXD0/RXD1、TX_EN、CRS_DV、REF_CLK这7根数据和控制线,再加上MDC/MDIO管理信号。REF_CLK是50MHz参考时钟,TXD/RXD各2bit,数据在时钟上升沿被采样,每次传2bit,总速率正好100Mbps。
PHY做的事情才是重头戏:它要把MAC发来的并行数据做4B/5B编码、扰码,再调制成MLT-3差分信号送到网线上,接收时反向解码。自动协商功能也在PHY内部完成,两端设备自动协商速度、双工模式。MAC要了解PHY的状态,就通过MDC/MDIO总线读写PHY寄存器,比如BMCR、BMSR、PHY ID等,这也是后面排查问题时最常用的手段。
时钟方向是新手最容易踩的坑。RMII的50MHz参考时钟可以由MAC提供,也可以由PHY提供。拿LAN8720A举例,它可以外接25MHz晶振,内部倍频后把50MHz REF_CLK输出给ESP32;也可以由外部直接给50MHz时钟。两种模式在寄存器里的配置不一样,PCB上晶振位置也不一样,焊错一个模式,PHY就起不来,甚至连网口灯都不亮。
2.2 POE供电协议与握手流程
POE不是“插上网线就有电”,它有一套完整的发现与握手流程。供电端叫PSE,通常是POE交换机;受电端叫PD,就是我们的开发板。PSE必须确认线上确实连了一台合规PD后,才会输出48V。
第一步是探测。PSE会先施加一个2.7V到10.1V的小电压,检测回路中是否有25kΩ特征电阻。只有阻值落在19kΩ到26.5kΩ范围内,PSE才认为连的是有效PD,而不是网线接头短路或未知负载。第二步是分级,PSE把电压提到14.5V到20.5V,通过电流大小判断PD属于Class 0到Class 4的哪一档,从而知道PD大概需要多少功率。第三步才是真正上电,PSE把输出升到44V到57V,同时做软启动,限制浪涌电流。之后整个运行期间,PSE会持续监控电流:如果电流异常增大,比如设备短路,PSE会切断电源;如果设备断电后电流消失,PSE也会自动关断对应端口。
这就是为什么PD端不能只用一个电阻、一个二极管来“骗”电:就算骗过了探测电阻,没有浪涌控制,上电瞬间的冲击就可能把输入电容和PHY打坏;分级和维持电流不满足,交换机照样断你的电。老老实实用专用POE控制器才是最省心的,它内部会处理好25kΩ签名、分类、热插拔和电流限制。
3. 硬件电路设计与实操要点
原理清楚了,动手设计的时候有几个地方需要特别留意。电路图看着简单,但照着抄还会翻车,我把自己踩过的坑和总结的要点放在这一节。
3.1 POE接口电路设计
POE信号的接入路径是:RJ45到网络变压器后,变压器的中心抽头把48V直流引出来,经过整流桥或场效应管组成的极性校正电路,进入POE控制器,再经过DC-DC降压输出。
这里有一个关键点:PD端必须支持反接。网线里的供电极性在不同交换机上可能不同,4/5、7/8线对的正负极并不统一,所以PD入口一般会加全桥整流,不管正负都能工作,代价是多了一点导通压降。整流桥要用低正向压降的肖特基管,否则48V进来压降0.5V,到DC-DC输入端就明显少了一块,高负载时容易触发欠压保护。
DC-DC部分我一般用反激拓扑,因为POE输入48V和输出5V/3.3V之间需要隔离,反激方案元件少、成本低。POE控制器内部一般集成了PWM控制,只要外配高频变压器、MOSFET和反馈回路就行。如果不想自己做变压器,可以买现成的POE电源模块,集成度高、认证好过,但成本会高不少。
散热和布局也要提前想好。48V转5V,即使效率做到90%,3W负载下也有0.3W损耗,长时间运行会发热;TVS管和输入电容要放在接口附近,先吸收浪涌再进控制器,不然POE插拔瞬间的高压尖峰很容易把后级打坏。
3.2 ESP32与PHY连接设计
我自己的板子上,PHY用的LAN8720A,接线如下。不同开发板的引脚可能不一样,一定要以自己原理图为准。
| 信号 | ESP32 GPIO | 说明 |
|---|---|---|
| REF_CLK | GPIO0 | 50MHz时钟,方向按PHY模式配置 |
| TX_EN | GPIO21 | 发送使能 |
| TXD0 | GPIO19 | 发送数据bit0 |
| TXD1 | GPIO22 | 发送数据bit1 |
| RXD0 | GPIO27 | 接收数据bit0 |
| RXD1 | GPIO25 | 接收数据bit1 |
| CRS_DV | GPIO26 | 载波检测/数据有效 |
| MDC | GPIO23 | 管理时钟 |
| MDIO | GPIO18 | 管理数据 |
之所以这么接,是因为RMII信号在ESP32上很多都可以通过GPIO矩阵重映射,但上述引脚是多数模块默认的直连方案,驱动配置时直接照填就行。
PHY的电源也不能想当然。LAN8720A需要3.3V的I/O电源和1.2V内核电源,1.2V一般由3.3V经过LDO产生,也可以从DC-DC单独拉一路,但要注意纹波控制在几十毫伏以内,否则高负载时可能出现随机丢包。PHY复位引脚不能悬空,最好由ESP32的GPIO控制,上电后延时释放,保证PHY完成初始化后再开始与MAC通信。
PCB布局的经验值是:RMII信号线要短、尽量等长、避免过孔;PHY和RJ45之间的差分线阻抗控制在100Ω左右,走线远离DC-DC电感和高压区;晶振下面铺地,别让高频信号干扰电源。地线处理上,POE高压部分和数字部分要做单点连接,防止地环路把噪声带进PHY。
3.3 供电方案与功率预算
给POE板子做电源预算一定要留余量。拿典型配置估算:ESP32满跑约0.5W,LAN8720A约0.15W,板载传感器和指示灯约0.2W,再加上外设接口预留1W,整板功耗大概2W左右。DC-DC效率按85%算,POE输入端功率约2.35W,在802.3af的12.95W上限内毫无压力。
如果后续要外接电机、继电器、加热片这些大功率器件,功耗就上去了。802.3af能提供的PD最大功率只有12.95W,要带大负载最好用802.3at的Class 4分级,对应25.5W。设计时留出分级的电流设置电阻位,万一后面要用高功率,直接改电阻就能切换,不用重画板。
48V侧的输入电容要按POE控制器的要求选取,太小会导致上电瞬间电压跌落触发欠压保护,太大又会让浪涌电流过大。数据手册推荐的典型值一般在10uF到47uF之间,我习惯先按手册值焊,再根据实测调整,不要盲目加大。
4. 固件开发与系统集成
硬件跑通只是第一步,固件才是让这块板子真正干活的环节。我主推ESP-IDF,因为官方对ESP32和PHY驱动的支持最完整,踩坑资料也最好找。
4.1 ESP-IDF以太网驱动配置
在项目里启用以太网很简单,idf.py menuconfig后,在Component config、Ethernet菜单里打开内部EMAC控制器,PHY设备选LAN8720,填上PHY地址和引脚,再配置网络接口,设成DHCP获取IP或手动固定IP。
关键初始化代码不长,大致是这样:
esp_eth_phy_t *phy = esp_eth_phy_new_lan8720(&phy_config); esp_eth_mac_t *mac = esp_eth_mac_new_esp32(&mac_config); esp_eth_handle_t eth_handle = NULL; esp_eth_driver_install(mac, phy, ð_handle, ð_config); esp_netif_attach(eth_netif, esp_eth_new_netif_glue(eth_handle));这段代码做的事情是:先创建PHY和MAC对象,安装驱动,再把以太网接口挂到网络接口层,之后就可以像普通网卡一样使用lwIP协议栈了。
一个小提醒:GPIO0在这块常见板子上被用作REF_CLK,而GPIO0恰好也是经典UART下载模式的选择引脚。很多新手用UART烧录时发现一直连不上,就是因为这个引脚被时钟占住,导致芯片无法稳定进入下载模式。我的习惯是在板子上保留一个跳线,下载时断开REF_CLK,或者直接走USB-JTAG、WiFi OTA烧录。这件事最好写进项目README,不然过两个月你自己也会忘。
4.2 经典应用:MQTT、Modbus TCP、OTA
以太网加POE最实用的三个应用是MQTT上云、Modbus TCP通信和OTA升级。
MQTT场景是数据采集的首选。用esp-mqtt组件连自己的Broker,设置好keepalive和QoS,数据在以太网上非常稳。我在局域网里实测,几乎不存在重连问题,比WiFi省心太多,断线重连的逻辑甚至可以不写,因为链路太稳定了。
Modbus TCP在工业现场最常见。ESP32做从站,上位机通过Modbus读写寄存器,采集板上的温湿度或控制IO。ESP-IDF的esp-modbus组件支持Modbus TCP从站,初始化后注册寄存器回调,剩下的就是业务逻辑。POE供电加Modbus TCP,以太网线和485总线相比,还能顺带把传感器节点的远端供电问题处理掉。
OTA升级是POE板很容易被忽视的优势。通过HTTP或HTTPS拉取固件,百兆以太网传几十KB的固件几乎是一瞬间,还能做版本校验、回滚标志、防掉电变砖处理。相比WiFi OTA,有线OTA没有信号干扰、没有弱网重传,可靠性高了一个档次,非常适合批量部署后的远程维护。
4.3 扩展玩法:Micro-ROS、LVGL、蓝牙调试
再往深玩,这块板子能做不少实验性质的东西。比如micro_ros_espidf_component,配合ROS 2 Humble,让ESP32作为机器人上的分布式节点,通过以太网和ROS 2主机通信。DDS对网络稳定性要求高,有线以太网比WiFi更适合做这种实时控制链路,数据抖动小一个数量级。
再比如LVGL。POE供电加以太网,正好给板子配一块小屏做仪表盘,数据从服务器或云端拉下来刷新,不用担心屏幕耗电,也不用外接电源。在很多展厅、机柜门禁、楼宇导引屏场景里,这种方案比工控机便宜而且维护简单。
蓝牙和WiFi也不是浪费。可以把无线通道留给配网和调试,首次上电时用蓝牙广播设备信息,手机App配置服务器地址,之后主链路走以太网。如果以太网异常,还能用WiFi作为旁路通道做诊断。双网冗余在工业项目里确实是实打实的加分项。
5. 常见问题排查与避坑指南
这一节是我觉得最值钱的部分。POE板子和普通开发板不一样,出了问题往往是供电和通信叠加在一起,光看代码解决不了。
5.1 POE供电不启动或电压跌落
POE板最常见的故障是“插上去交换机灯不亮,板子没电”。我会按这个顺序查:
首先看PD端的25kΩ特征电阻,阻值是否准确、位置是否正确,尤其当板上已经并联其他电路时,等效电阻会被拉低,PSE就不认这个设备。第二看分类电流设置,确认分级引脚没有接错。第三看DC-DC输入端有没有48V,用万用表测POE控制器的VDD引脚。如果这里电压正常但输出没有,十有八九是反激变压器同名端焊反,或者反馈回路没工作。第四看PSE端,有些便宜的百元交换机功率预算很小,单端口带电能力不足,换一个标准的802.3af/at交换机再试。
还有一个细节:POE只在网线长度100米内有效。现场用几十米网线时,线阻压降可能让PD端电压进入欠压区间,导致设备反复上下电。这时候用0.5mm线径的纯铜网线比什么高级屏蔽线都实在。我遇到过几次“设备在实验室好好的,现场就是起不来”,最后查出来都是网线质量问题。
5.2 PHY初始化失败或协商不稳定
网络通了但速度上不去、指示灯闪烁,或者驱动一直打印Link Down,问题基本出在PHY侧。我排查的第一步是读PHY寄存器,确认PHY是否真的在工作。
在ESP-IDF里可以用esp_eth_io_cmd(eth_handle, ETH_CMD_READ_PHY_REG, reg_data)这样的接口读寄存器,传入的结构体里带寄存器地址和返回值。先读PHY ID寄存器,看是否返回LAN8720对应的ID,如果读出来全FF或全0,说明MDC/MDIO时序或PHY地址不对。再读BMSR寄存器,bit2表示链路状态,如果为0说明物理链路没通,问题可能在变压器、RJ45或网线。
时钟问题是第二大元凶。RMII的50MHz参考时钟方向不对的话,PHY可以读到ID,但收发数据全是乱的。检查PHY的时钟配置寄存器,确认是外部时钟模式还是内部晶振倍频模式,必须和PCB设计保持一致。复位时序也要留意,PHY上电后要等至少几毫秒再访问,我一般用GPIO控制复位信号,软件里做延时,比RC复位可靠得多。
5.3 固件烧录、加密与权限问题
很多人在开发阶段会接触到Flash Encryption和Secure Boot,然后遇到“烧录后程序被锁”的问题。其实ESP32如果开启了Flash Encryption,再次烧录时固件必须用同一密钥加密,直接idf.py flash会失败,日志会提示找不到有效的app,甚至进入boot loop。
最省事的解决方案是:开发前期不要开Flash Encryption,等产品定版再开启,并妥善备份eFuse密钥。如果已经开了又没备份密钥,只能整片擦除flash重烧,但Secure Boot一旦使能,eFuse熔断就是不可逆的,严重情况下只能换主控。所以这类安全功能,我的经验是:先排功能,再开加密,密钥三地备份,千万别图新鲜乱试。
烧录方式上,UART、USB-JTAG、OTA都可以。日常调试我习惯用USB-JTAG,免去频繁插拔下载线的麻烦;量产阶段用预烧录加上OTA差分升级,设备部署后基本不用再开盖。
5.4 以太网与WiFi共存时的路由配置
同时开WiFi和以太网,很容易出现“网线插了,但还是走WiFi上网”的情况。因为ESP32可以同时启用多个netif,系统默认路由却不一定是以太网。解决办法是在初始化后明确设置默认网络接口:
esp_netif_set_default_netif(eth_netif);另外,如果两个接口都在同一网段,还会产生ARP混乱,建议把以太网和WiFi配到不同的子网,或者干脆在业务运行期停用WiFi。如果希望一个网络断线后另一个网络接管,得在上层做链路检测和自动切换。我在做工业网关时吃过亏,后来干脆把WiFi从运行时去掉,只在配网模式打开,简单可靠,维护成本也低。
6. 实测效果与应用场景
6.1 性能实测
我拿自己做的这块板子跑过一轮简单测试,结果在预期内。用iperf在局域网测TCP吞吐,稳定在75到80Mbps左右,UDP可以跑到90Mbps以上,这个水平对IoT场景绰绰有余。ping网关延迟基本在1到2ms,偶发3ms,没有WiFi那种几十毫秒的抖动。功耗方面,空载约1.2W,满载跑吞吐测试约2.1W,48V输入端电流不到50mA,POE供电压力很小。
具体数值会随固件优化、PHY型号、DC-DC效率不同有浮动,但百兆以太网的稳定性优势是现象级的。我连续跑了48小时吞吐测试,没有出现一次断链,这在WiFi环境里很难实现。
6.2 可以落地的应用场景
工业Modbus网关:一块板子做从站或主站,通过以太网接入SCADA,POE集中供电,省掉工位电源。
楼宇自控传感器:吊顶里的温湿度、空气质量传感器,一根网线从弱电间交换机取电,不用为每个点位拉220V。
机柜环境监控:门磁、漏水、风扇转速监控,放在机柜里,POE交换机就在旁边,部署成本最低。
数字标牌和仪表盘:配合LVGL小屏,从服务器拿数据,展示设备状态或客流数据,适用于展厅、前台、电梯口。
机器人分布式节点:用Micro-ROS接ROS 2,普通IO采集和电机控制走有线,实时性比WiFi好得多。
每个场景其实都共享同一个核心价值:网线即供电,网络即电源,消除了“设备很好但没地方插电”的尴尬。这也让POE这类板子特别适合做产品原型验证,前期一根网线接交换机就能跑,后期直接搬进机柜。
6.3 做这块板子的一点个人体会
回到开头那个感受,POE加以太网不只是把WiFi换成网线那么简单,它更像是把物联网设备从一个“无线玩具”变成一个“基础设施设备”的思路转变。踩过几次坑之后,我现在做新项目会先问一句:现场能不能拉网线?能拉,就优先考虑POE;不能拉,再走无线。这样决策,后期省下的运维成本非常可观。
最后再分享一个小技巧:如果只是在实验室调试,找一台支持POE的交换机就能开始,别急着买POE模块做整板设计;等产品原型稳定后,再把POE接口按工业标准做进PCB。这样一步步来,既能快速验证功能,又不会在早期被硬件细节拖住,少走很多弯路。
本文还有配套的精品资源,点击获取