多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

ESP-01与ESP-01s区别详解:硬件差异、烧写参数与故障排查

ESP-01与ESP-01s区别详解:硬件差异、烧写参数与故障排查 玩ESP8266绕不开ESP-01这个老祖宗模块一颗ESP8266EX、一颗Flash芯片、一个PCB天线、两排2.54mm排针就组成了当年最便宜的WiFi接入方案。但只要你上淘宝搜ESP-01结果里总会混着另一种长得几乎一样的模块绿板丝印写着ESP-01s再往下翻还有蓝板、黑板的复刻版长得都像亲兄弟。很多人以为ESP-01s就是ESP-01的升级款随便拍一个都行结果到手后发现启动失败、烧写连不上、Arduino IDE里每个选项都像在猜谜。这篇文章就是把这两个模块的硬件区别和烧写关键设置一次讲透怎么靠外观快速分辨哪些硬件细节决定你能不能顺利烧录每个烧写参数背后的原因是什么。文章里会有我踩过的接线坑、供电坑还有反复烧写几十次之后整理出来的排查顺序。新手可以照着操作有一定基础的人也能补上以前忽略的细节。1. 外观判断不是玄学丝印、LED和板型都能看出名堂1.1 拿到手先看丝印和布局先说说最直接的区分方法。原厂安信可Ai-Thinker早期生产的ESP-01PCB多为蓝色正面丝印一般印着ESP-01或者ESP8266MOD而ESP-01s的丝印基本就是ESP-01s并且绝大多数是绿色或黑色PCB。需要说明的是市面上复刻版太多颜色只能作为参考不能当作唯一依据。更靠谱的看点是板载LED的位置。我手头这两块模块对比下来老版ESP-01的蓝色LED通常放在靠近天线那一端模块正面右上方ESP-01s则把LED移到模块正面中部偏天线方向的位置整体感觉更居中。此外ESP-01s的PCB尺寸比ESP-01略短一点点大概短两三个毫米不拿尺子量的话不容易察觉但把两个模块叠在一起就能看出来。还有个细节是天线形状。老版ESP-01的PCB天线尺寸稍长边缘过渡比较圆润ESP-01s的天线区域更接近方形边界更分明。这个差异不影响功能只是生产批次不同留下的外观特征但确实可以作为分辨的辅助依据。1.2 市场上为什么有那么多混血模块如果你发现自己买到的模块丝印、LED位置和上面说的都对不上不用太惊讶。ESP-01火了好几年中间经过无数次改版我甚至见过蓝板丝印却带着ESP-01s内部电路的混血模块。根源在于这类低价WiFi模块的方案太成熟了深圳那边很多工厂都在做兼容版用的都是ESP8266EX这颗芯片剩下的区别就是Flash芯片容量、PCB走线、天线匹配和丝印。有些商家标题写着ESP-01发货时可能给你发ESP-01s或者反过来因为他们自己都分不清库存里是什么。所以我的建议是外观判断只是第一步真正的判断标准是后面要讲的硬件细节和烧写参数。你手里那块模块到底该按ESP-01还是ESP-01s来处理取决于它的Flash容量、上拉电路和实际烧写表现。这篇文章后面所有内容都是围绕如何用实测手段搞清楚你手里是什么模块来展开的。2. 硬件区别的关键点上拉、Flash和供电是真正影响使用的差异2.1 引脚定义与内部上拉的变化ESP-01和ESP-01s都是2x4共8个引脚引脚定义相同VCC、GND、TXGPIO1、RXGPIO3、RST复位、CH_PD使能、GPIO0、GPIO2。但内部电路上有个非常重要的区别很多教程都没说透。老版ESP-01为了保证稳定启动GPIO0和GPIO2需要外部加上拉电阻常见10kΩ拉到3.3VCH_PD也必须接高电平否则模块上电后可能不启动或者不断重启。ESP-01s在模块内部已经把这些上拉电阻做进去了CH_PD默认被拉高GPIO0和GPIO2也带板上上拉所以直接接3.3V和GND就能跑起来。这个差异直接影响了你的接线复杂度。如果你用的是老版ESP-01烧写和运行都要额外接上拉电阻如果是ESP-01sVCC、GND接好就能工作。我早期玩ESP-01时不知道这个区别直接用USB转TTL的3.3V供电结果模块上电后串口完全没反应排查了半天才发现是GPIO0和GPIO2悬空导致启动异常。补上两个10k上拉电阻后立刻正常这个教训印象很深。2.2 Flash容量差异为什么烧写设置必须分清楚ESP-01和ESP-01s在Flash容量上的差异是烧写设置最容易翻车的地方。早期ESP-01原厂模块大多配备8Mbit1MBFlash但市面也流通过4Mbit512KB的版本尤其是机智云定制版或者一些低价复刻版里很常见。ESP-01s从安信可量产开始就标称8Mbit1MB整体来说容量比老版ESP-01更统一。Flash容量直接决定了你在烧写工具里选512KB还是1MB。选错会怎样我实测过把512KB的模块按1MB烧烧写过程可能正常但固件写入地址超出了物理Flash范围启动时要么白屏要么无限重启反过来把1MB模块按512KB烧固件被截断功能不完整可能AT指令能响应但WiFi连接不正常。所以拿到模块第一件事不是急着烧而是先读取Flash实际容量。用esptool连接模块后执行esptool.py --port COM3 --baud 460800 flash_id正常会输出类似这样的结果Manufacturer: 5e Device: 4014 Detected flash size: 1MB看到Detected flash size: 1MB就按1MB处理看到512KB就按512KB处理。这一步花十秒钟能省下后面排查故障的几小时。2.3 晶振、射频电路与供电需求的版本差异这两个模块用的都是26MHz晶振不是常见的40MHz。这一点在Arduino IDE里尤其重要Board设置里如果Crystal Frequency选错成40MHz串口输出就会变成一堆乱码因为波特率是按照晶振频率计算的频率错了9600和115200全都不对。射频电路方面ESP-01s在ESP-01基础上做了一些匹配优化天线附近的走线不同理论上RF指标略有提升。实际使用中很难感受到差别近距离信号强度基本一致但ESP-01s在弱信号环境下的稳定性稍好一点这属于硬件迭代的正常改进。供电需求是两个模块都必须重视的部分。ESP8266在WiFi发射瞬间的峰值电流可以到300mA甚至更高很多USB转TTL模块上的3.3V引脚只能输出50mA到100mA直接用它给ESP-01供电烧写时经常出现连接成功一半就断的情况或者烧写完成后模块运行几秒就重启。所以无论是ESP-01还是ESP-01s我都建议外接一个独立的3.3V稳压模块比如AMS1117-3.3或者用支持大电流输出的开发板供电。后面烧写章节会专门说这个。3. 烧写接线比你想的更讲究3.1 USB转TTL选型与接线表烧写ESP-01和ESP-01s的本质都是一样通过串口把固件写入Flash。你需要一个USB转TTL模块CP2102、CH340G、FTDI232都行但必须确认两点支持3.3V电平输出、3.3V供电能力尽量强。有些便宜的CH340模块只引出了5V和GND3.3V引脚形同虚设这种不建议用来烧ESP-01还是老老实实外接稳压模块更稳。接线方式如下注意串口收发要交叉USB转TTLESP-01 / ESP-01s说明3.3VVCC供电也可以外接稳压模块供给GNDGND共地必须接TXDRXGPIO3模块接收来自电脑的数据RXDTXGPIO1模块发送数据到电脑3.3VCH_PD / EN使能脚必须接高GPIO0 → GND进入烧录模式的条件见下文RST可选可悬空靠重新上电复位这里要特别强调绝对不要用5V给模块供电也绝对不要让串口TX/RX直接以5V电平连接模块。ESP8266的IO口不是5V容忍5V电平灌进去大概率烧芯片。如果你的USB转TTL没有3.3V电平跳线就需要用分压电阻或者电平转换板否则模块会处于半死不活的状态。3.2 三种进入UART下载模式的方式ESP8266进入串口下载模式的条件其实很简单GPIO0在复位/上电时保持低电平同时CH_PD为高电平。满足这个条件芯片启动时的Boot Mode就是UART Download Mode。三种常用做法第一种冷启动法最稳。先把模块所有线接好GPIO0通过杜邦线或跳线帽直接接到GND然后给模块上电。上电瞬间GPIO0就是低电平芯片直接进入下载模式。这种方式的优点是时序简单不受模块复位电路干扰。第二种热启动法。模块已经上电工作的情况下把GPIO0拉低然后按一下RST引脚复位。注意先拉低GPIO0再按RST顺序不能反。如果模块上已经有10k上拉电阻GPIO0默认是高电平你把GPIO0接到GND时相当于用导线把上拉电阻短路掉也能达到低电平效果。只要在复位之前稳定保持低电平就能进入下载模式。第三种自动下载电路。部分USB转TTL模块带DTR/RTS自动控制电路比如一些标注支持自动下载的开发板Arduino IDE通过串口信号自动拉低GPIO0并复位。但市售裸USB转TTL模块基本没有这个功能所以对ESP-01小白来说冷启动法最可控。3.3 供电不足是烧写失败的头号原因我见过的ESP-01烧写失败案例里至少一半是供电问题而不是参数问题。表现是esptool能打开串口模块也能识别但开始擦除Flash或者写入固件时进度条卡住最后报Timed out waiting for packet header。原因就是USB转TTL模块的3.3V输出电流不够。ESP8266在Flash擦写时电流波动大瞬间拉低电压芯片直接复位或者串口通信中断。电压不稳定的情况下任何参数设置都白搭。解决方法是给模块单独供电。我常用的接法是把USB转TTL的3.3V断开改用一颗AMS1117-3.3稳压模块输入接USB的5V输出3.3V接到模块VCC稳压模块的GND和USB转TTL的GND共地。同时在VCC和GND之间并一个100uF电解电容和一个0.1uF陶瓷电容用来吸收瞬态电流波动。加了电容之后我甚至遇到过之前一直失败的模块突然就烧写成功了。还有个容易忽略的细节接线长度和线材质量。ESP-01的烧写速率如果拉到460800杜邦线太长会引入干扰。建议烧写线控制在15cm以内尤其是TX、RX两根线越短越好。如果条件受限必须用长线就把波特率降到115200再试。4. 烧写参数设置每个选项都对应一种翻车现场4.1 esptool.py命令行烧写关键参数分析esptool.py是Espressif官方Python工具通用性最强推荐所有玩ESP8266的人都装一个。安装很简单pip install esptool烧写一条典型命令是这样的esptool.py --port COM3 --baud 460800 write_flash --flash_modedout --flash_sizedetect 0x0 firmware.bin几个参数一个一个说。--flash_modedout是我强烈建议的选项。ESP8266支持QIO、QOUT、DIO、DOUT四种Flash读取模式。理论上QIO速度最快但很多廉价Flash芯片对QIO支持不好而且ESP-01/ESP-01s的硬件设计未必把全部IO都连到Flash上。实测下来DOUT的兼容性最好几乎不会因为模式问题导致启动失败。如果你用默认的QIO烧完发现模块没反应改成DOUT重新烧一次基本都能解决。--flash_sizedetect的意思是让esptool自动检测Flash容量。这个功能依赖Flash芯片能正常响应SFDP或者ID读取指令绝大多数情况下没问题。如果检测失败就手动指定比如--flash_size1MB或者--flash_size512KB。--baud 460800是烧写波特率。不是越高越好我用460800烧ESP-01s很稳但换到另一块老版ESP-01上就超时降到115200立刻正常。如果你遇到半途中断先把波特率降到115200稳定性优先。如果只烧写应用固件地址一般从0x0开始写如果是刷AT固件或者NodeMCU固件固件包通常分成多个bin需要按官方说明分别指定地址。不要自己想当然把固件都烧到0x0例如AT固件的user1.bin可能要写到0x01000写错了模块一样变砖。4.2 Arduino IDE中的参数26MHz晶振和DOUT是重点用Arduino IDE开发ESP-01和ESP-01s也是一套参数设置的门道。先装好esp8266开发板支持包然后按下面配置BoardGeneric ESP8266 ModuleFlash ModeDOUTFlash Size根据实际容量选1MB或512KBCrystal Frequency26 MHzReset Methodck如果有自动复位电路否则选manual或noneFlash Frequency40MHzUpload Speed115200Port选择实际串口号这里最容易被忽略的就是Crystal Frequency。很多教程把它默认放40MHz但ESP-01和ESP-01s用的都是26MHz晶振。选错之后的现象很迷惑程序能编译能上传串口监视器却全是乱码波形对不上。我第一次遇到时还以为是USB转TTL坏了换了三个模块才想起来查晶振设置。Reset Method同样很关键。绝大多数裸USB转TTL没有DTR/RTS自动复位控制电路如果Reset Method选ckArduino IDE会等待下载信号一直卡在Connecting........_____那里。这种情况可以先手动把GPIO0接地并重新上电让模块处于下载模式再点上传。如果还是不行就把Reset Method改成none然后手动复位进下载模式再传。Flash Size选错也会引起诡异问题。有些模块标称1MB但实际Flash只有512KB烧录时IDE会报错说固件太大这种情况需要把固件体积控制住或者换模块。反过来实际是1MB但选了512KBIDE不会报错只是生成的固件地址和OTA布局不对程序功能异常。4.3 点灯科技Blinker场景下的固件处理很多朋友买ESP-01/ESP-01s是为了做智能开关最常接触的就是点灯科技Blinker。Blinker的原理是设备通过MQTT协议连接点灯云平台手机App端配置好之后可以在公网远程控制家里的开关。ESP-01/ESP-01s体积小、价格低特别适合改造成单路继电器控制面板。在Blinker场景下Flash容量差异会直接决定你选哪个模块。Blinker的示例固件编译出来普遍比较大基于Arduino的blinker库加上WiFiManager再加MQTT一个固件经常到600KB甚至800KB。如果是512KB的ESP-01编译出来放不下或者勉强放下后OTA空间全无后续升级固件非常痛苦。所以我做点灯项目一律推荐ESP-01s1MB这也是ESP-01s现在更受欢迎的原因之一。接线方面用GPIO0接继电器控制端即可。Blinker示例程序默认把某个GPIO定义为开关引脚你可以改成GPIO0。GPIO2也可以但GPIO2在启动时有特殊状态限制如果外接下拉负载可能影响启动所以优先用GPIO0。GPIO1和GPIO3是串口引脚虽然也可以复用为普通IO但会占用调试串口不建议在Blinker项目里用。烧写Blinker固件时前面提到的Arduino IDE参数设置依然适用唯一要注意的点是在烧写完成后拔掉GPIO0的接地线给模块重新上电否则模块会再次进入下载模式而不是正常运行。5. 从常见故障反推参数一份排查实践记录5.1 连不上、同步超时的硬件排查顺序esptool烧写时卡在Connecting...是ESP-01新手最常碰到的报错。这个报错的意思是工具在等待芯片握手同步但一直没有成功。我的排查顺序是固定的第一步用万用表量模块VCC和GND之间的电压必须在3.0V到3.6V之间。低于3.0V基本就是供电不足接稳压模块再加电容。第二步确认GPIO0确实接地而且是从上电前就接好的。很多人是先上电再接地芯片已经以正常模式启动了这时候再接地也不会进入下载模式。第三步检查CH_PD是不是接了3.3V悬空等于没有使能模块压根不工作。第四步核对TX和RX有没有接反。USB转TTL的TXD要接模块的RXGPIO3RXD接模块的TXGPIO1很多人按同色相接的方式接成了TX接TX、RX接RX结果什么信号都收不到。第五步换一根杜邦线。USB转TTL模块的排针焊点松了或者杜邦线内部断芯这种物理问题排查起来最费时间我后来索性准备了一套专门烧写用的短线避免线材背锅。如果以上都没问题还不通就换个USB转TTL模块试试。不同模块的串口芯片驱动状态、输出电压能力都有差异有些模块的3.3V电平虽然标称3.3V实际空载只有2.8V带载后更低这种也不行。5.2 烧写成功但启动乱码的参数排查顺序烧写过程中没有报错进度条顺利走完但是重新上电后串口监视器看到的是一堆乱码或者模块没有任何反应。这时候别急着怀疑硬件坏了先从参数层面排查。第一个嫌疑是Crystal Frequency选错。Arduino IDE里如果你选了40MHz实际上模块是26MHz晶振串口波特率就会偏移输出自然乱码。改成26MHz重新编译上传绝大多数乱码问题瞬间解决。第二个嫌疑是Flash Mode。QIO模式烧写时如果Flash芯片不支持四线读取程序会跑飞或者直接卡死。改成DOUT重新烧写这个我之前提过是ESP-01系列最稳妥的模式。第三个嫌疑是Flash Size。比如实际Flash是1MB但你按512KB烧IDE把固件放在了一个超出物理地址范围的位置启动时读不到正确代码也会表现为无反应或随机重启。用esptool的flash_id读取实际容量然后严格对应设置。第四个嫌疑是硬件接线导致运行模式不对。GPIO0在运行时必须悬空或接高电平如果你烧完还保持着GPIO0接地模块上电后就一直试图进下载模式串口会输出类似waiting for host的提示或者根本没反应。把GPIO0的接地线断开按一下RST复位再看串口输出。5.3 运行后频繁重启的供电解决案例最后一种常见故障是程序烧进去了串口也能看到启动日志WiFi都能连上路由器了但模块运行几秒钟就重启重启日志又是正常的反复循环。我遇到过一个典型案例。当时用USB转TTL模块直接给ESP-01s供电刷了一个连接WiFi的AT固件只要模块开始扫描WiFi并连接路由器电流瞬间增大USB转TTL的3.3V电压被拉低芯片进入欠压复位然后重启再扫WiFi再复位无限循环。这个问题的本质就是供电电流不足。WiFi发射时ESP8266的瞬态电流峰值可以达到300mA以上而普通USB转TTL的3.3V输出根本扛不住。解决方案是外接独立3.3V电源在模块电源引脚附近加一个100uF电解电容和0.1uF陶瓷电容能让电压在瞬态电流冲击下依然保持稳定。还有一个容易忽略的点是如果模块后面接了继电器或者其他负载不要用模块的3.3V给负载供电。继电器的吸合电流比ESP8266还大两者共用一个电源会互相干扰。最好单独给继电器供电只用模块的GPIO输出控制信号。最后说点实际操作中的体会我把ESP-01和ESP-01s放在一起用了一年多整体感受是作为入门ESP8266的第一个模块两者都够用但如果你准备做点灯科技这类工程项目直接买ESP-01s别犹豫。它省掉了外部上拉电阻的麻烦Flash容量统一1MB烧写参数相对标准踩坑概率小很多。有个小习惯我强烈建议养成每次拿到新模块烧写任何固件之前先跑一遍esptool.py flash_id把实际Flash容量记录下来顺手标记在模块背面的标签上。这样以后每次烧写都不用猜直接按标签选参数。这个小动作帮我省下了大量排查时间尤其当你手头同时有好几个模块的时候只靠外观区分它们真的容易出错。如果你已经买了一批ESP-01老版本也别急着扔。给GPIO0和GPIO2加上10k上拉电阻供电充足它照样能稳定工作。只是它更适合跑AT固件这类体积小、功能单一的程序需要大固件的场景就交给ESP-01s吧。
返回列表