☰
ESP32不用Wi-Fi也能通信?三个隐藏射频外设实测与合规边界
2026/10/11 11:37:49 网站建设 项目流程

但凡玩过几块ESP32开发板的人,大概都会觉得这颗芯片的无线能力就两条线:Wi-Fi和蓝牙。这个印象不算错,但只对了一半。在引脚矩阵的更深处,还挂着一套官方文档很少正面介绍的“物理层通路”:RMT外设说自己是红外遥控模块,其实它能输出任意脉冲序列;触摸传感器说自己是电容按键检测器,其实它能捡到AM射频包络;BLE 5.1的CTE扩展说自己是测向天线校准用的,其实它吐出来的是正儿八经的连续未调制载波。换句话说,在Wi-Fi和蓝牙这两扇大门旁边,还开着三条不需要启动任何协议栈就能收发无线信号的小路。这篇文章就逐条把它们扒开:先说清楚硬件上的真相,再给可复现的实验步骤,最后聊一聊验证方法和合规边界。适合想让ESP32玩出点Wi-Fi和蓝牙以外花样的开发者,也适合被标题勾进来、想分辨真假隐藏功能的朋友。

1. 三条“手册外通路”到底藏在哪:从RMT到触摸传感器的硬件真相

1.1 RMT外设:一个被当成红外遥控的通用脉冲收发器

如果你去翻厂商的应用手册,RMT(Remote Control)模块的出镜率很高,但所有示例几乎都是红外遥控:发射NEC编码、解码RC-5编码、控制空调、控制风扇。问题在于,RMT在硬件层根本不是“红外专用芯片”,它就是一组带精确时序控制、支持载波调制、可以自由路由到任意GPIO的脉冲收发器。官方把它定位成红外遥控,只是因为红外遥控是最安全、最不容易出问题的应用方向。

为什么说最安全?因为如果官方文档大张旗鼓地写“你们可以用RMT输出任意脉冲序列,再接一个433MHz发射模块做无线链路”,那使用者一旦造出不合规的发射设备,原厂是要承担文档责任和舆论压力的。所以厂商把示例死死钉在红外遥控这个场景里,TRM里虽然详细描述了每个寄存器,但应用笔记和宣传手册里绝口不提射频发射方向,就形成了标题里说的“没写进手册”的现象。准确来说是没写进应用手册,不是芯片里真有一个秘密后门。

RMT的硬件结构很有意思。每个通道内部有独立的状态机和一组FIFO,你要做的事情就是把一段段“电平持续多长时间”的指令填进去,比如“输出高电平45微秒,再输出低电平15微秒”。它自己不关心你这些高低电平是红外波形,还是ASK基带波形,甚至不管你是给LED做调光还是给舵机做PWM。配合ESP32的GPIO矩阵,RMT通道能映射到任意引脚,这就等于给了你一个可编程程度很高的脉冲输出口。想象成一台只能印方波的打印机,红外编码只是它打印的一种“字体”,你想打印什么波形完全取决于你喂给它的指令。

1.2 触摸传感器:自带一个“射频包络感应器”

ESP32的触摸传感器,官方用途是检测人体触摸引起的电容变化。它内部通过比较器配合RC充放电,把引脚电容转化成数字计数,电容一变计数就变。但如果你把一根导线接到触摸引脚上,它会变成一个非常简陋但可用的AM包络检波器。原理是:导线相当于天线,会在引脚上感应出射频电压;引脚内部的高阻偏置和寄生电容共同构成了一个天然的整流/滤波网络,把射频载波的包络提取出来。触摸引脚对电容变化的敏感度本来就极高,而AM信号的包络恰恰会改变引脚上的等效电压/电容状态,于是几kHz的音频包络就在触摸读数里暴露出来了。

听起来有点玄,但这跟几十年前矿石收音机用的原理一脉相承:高阻引脚加一段导线就是天线,加上天然存在的结电容就完成了检波。ESP32的触摸传感器采样率大概在几十kHz量级,追不上兆赫兹级别的射频载波,但完全追得上几kHz到十几kHz的音频包络。所以它能收到AM广播里的语音或者信号发生器调制的音频,在波形上看得清清楚楚。

1.3 BLE 5.1的CTE扩展:被定位功能掩盖的连续波源

CTE(Constant Tone Extension)在蓝牙规范里的定位非常明确:它是一个跟在数据包尾部的固定频率未调制载波片段,用于接收机在不同天线阵元间测相位差,从而计算信号到达角度,也就是AoA/AoD测向。官方文档讲CTE的时候,永远在教你如何配置天线切换、如何采样IQ数据、如何算角度,没人会提它还有另一重身份。

但你把“固定频率未调制载波”这几个字翻译成射频工程师的语言,那就是“一个可以在2.4GHz频段、由软件开关控制的连续波信号源”。不携带信息的时候,它就是一杆可以被软件开关的“射频信号源”。测向只是它的消费场景,而近场射频实验、天线屏蔽验证、无源标签唤醒这类玩法,属于手册之外的衍生用途。这也是所有外设共性的一种体现:芯片厂商按商业逻辑定义外设,硬件工程师按物理能力重新定义外设。

2. 通路一实验:433MHz ASK自定义链路,全程不走Wi-Fi协议栈

2.1 为什么选433MHz ASK?RMT的时序优势

如果说三条通路里哪条最值得第一个复现,我强烈推荐433MHz ASK这条。原因是它兼顾了低门槛和强现象:433MHz是普遍允许的低功率短距离ISM频段,几块钱就能买到成熟的ASK发射/接收模块;ASK调制(也叫OOK开关键控)的本质就是“载波开/关”,RMT输出的高低电平脉冲恰好就是开/关控制信号,电路上几乎是直连的。

为什么不用FSK?因为RMT本质上是一个时序发生器,它擅长产生“开多久、关多久”的基带脉冲,而FSK需要切换载波频率,这需要另一个频率合成机制配合,复杂度立刻上去了。OOK/ASK调制只需要开关载波,RMT天然擅长。从数字链路的角度看,一帧数据就是一串高电平方波包,接在433MHz发射头的DATA引脚上就能直接发射。整条链路完全不启动Wi-Fi协议栈,不需要SSID、不需要握手、不需要加密协商,发送端就是个纯外设操作,延迟在微秒级,功耗也能压得很低。这种属性特别适合做传感器数据回传、无线触发、遥控开关这类“我要发一个信号,不想谈对象”的场景。

2.2 最小硬件清单与接线

列表比较清晰,先把东西备齐:

  • ESP32开发板一块(任意常见型号都行,重点是引脚能映射到RMT)
  • 433MHz ASK发射模块一只(带DATA引脚,常见那种超外差发射头)
  • 433MHz ASK接收模块一只(超外差接收头,DATA引脚输出解调后的基带脉冲)
  • 天线:433MHz四分之一波长大约17.3厘米,短线或直导线即可
  • 杜邦线若干、面包板一块
  • 验证设备三选一或全选:逻辑分析仪、示波器、SDR接收棒

接线非常简单。发射端:ESP32的一个GPIO(比如GPIO4)接到发射模块DATA,发射模块VCC接3.3V,GND共地。接收端:接收模块VCC接3.3V,DATA引脚接另一个ESP32的GPIO或逻辑分析仪通道,GND共地。如果你想一次性做自发自收又能看波形,就用两块开发板,发射板只发,接收板只收,逻辑分析仪同时挂着两端,对比时序,非常直观。

2.3 RMT发送代码骨架与脉冲设计

老版本ESP-IDF的RMT API比较容易看懂,我拿它做示意。新版本SDK把RMT重构成了一套基于transmit engine的API,接口名和配置结构体变化很大,但底层思路不变,下面代码主要是讲透原理。

// 示意代码:ESP-IDF旧版RMT接口,用于说明RMT脉冲序列设计 #include "driver/rmt.h" #define RMT_TX_CHANNEL RMT_CHANNEL_0 #define RMT_TX_GPIO 4 rmt_item32_t items[16]; rmt_config_t config; void rmt_ask_init(void) { config.rmt_mode = RMT_MODE_TX; config.channel = RMT_TX_CHANNEL; config.gpio_num = RMT_TX_GPIO; config.mem_block_num = 1; config.clk_div = 8; // 80MHz / 8 = 10MHz,一个tick = 100ns config.tx_config.carrier_en = false; // 不启用RMT内部载波,因为ASK模块自己搞定射频载波 config.tx_config.loop_en = false; rmt_config(&config); rmt_driver_install(RMT_TX_CHANNEL, 0, 0); } void rmt_send_byte(uint8_t data) { int idx = 0; // 简单NRZ编码:逻辑1=高电平450us? 不,450 tick=45us // 每个bit拆成两段:先输出一个tone,再输出一段gap for (int i = 7; i >= 0; --i) { if ((data >> i) & 1) { items[idx].duration0 = 450; // 45us 高电平,发射模块输出载波 items[idx].level0 = 1; items[idx].duration1 = 150; // 15us 低电平,载波关闭 items[idx].level1 = 0; } else { items[idx].duration0 = 150; // 15us 高电平 items[idx].level0 = 1; items[idx].duration1 = 450; // 45us 低电平 items[idx].level1 = 0; } idx++; } rmt_write_items(RMT_TX_CHANNEL, items, 8, true); }

这里每bit用了两段脉冲:一段高、一段低。高电平期间ASK发射模块的DATA脚收到逻辑1,内部振荡器工作,天线辐射出433MHz载波;低电平期间振荡器关断,没有载波输出。这样射频信号就是标准的OOK波形。为什么要用NRZ而不是曼彻斯特编码?对于这种玩具链路,NRZ结构简单、解码直接,接收端看脉宽就能恢复数据。如果你想提高可靠性,可以改成曼彻斯特或者加强制最小脉宽的4B/5B编码,但那是后话,先把链路弄通再说。

2.4 接收端验证方法和示波器观察要点

如果手头有SDR接收棒,第一件事就是打开频谱界面,把中心频率设到433.9MHz附近,带宽设个1MHz。按下发射板上的发送键,频谱上会出现一个明显的窄峰,松手就消失,这就是载波在开关。这一步能一锤定音地确认射频通路是通的,不用怀疑接线问题。

如果只有逻辑分析仪,就把CH1接到发射模块DATA,CH2接到接收模块DATA。发射时应该看到CH1有脉冲串,接收模块的CH2在几十微秒延迟后出现一串形状相似的脉冲。因为发射头和接收头都是超外差结构,天然会有几十微秒的固定延迟和波形整形,不用强求完全一致。若用示波器,还能看到更细节的东西:接收模块DATA脚的边沿可能带有毛刺,这是因为模块内部没有完美的迟滞比较器;数据速率越低,解码越稳。

实测中最容易翻车的三个点:一是供电,ASK发射模块瞬态电流不小,USB供电不稳会导致载波频率漂移,建议在模块电源脚旁边加一颗10uF电容;二是RMT时序参数,不同厂家的发射模块对DATA高/低电平的脉宽要求差别很大,有的要求最短100微秒,你按网上抄的45微秒参数发出去,接收端直接丢包;三是天线,如果只是桌面测试,一根10厘米左右的杜邦线凑合能用,但别指望距离,离开两三米就衰减得很厉害。

3. 通路二实验:让触摸引脚变成一个AM包络检波器

3.1 从触摸测量到射频解调的物理链路

ESP32的触摸传感器内部结构可以简化成一个高阻节点、一个比较器、一组计数器。高阻节点对外部电容变化极其敏感,你的手指靠近引脚,引脚对地电容增加几皮法,计数就显著变化。外部射频信号通过天线进入引脚后,会叠加在内部偏置点上,再由引脚自身的寄生电容和ESD结构完成包络检波。整个过程没有额外电路,全靠芯片自带的“杂散参数”。

这个实验的精妙之处在于它复现了矿石收音机的基本原理,只不过把二极管检波换成了芯片内部的寄生结构,把高阻耳机换成了ADC/触摸计数。你不需要加任何射频前端,一根导线、一个触摸引脚、几行代码,就能看到AM包的轮廓。这绝对是“手册外能力”里最让人眼前一亮的一个。

3.2 软件解调:touchRead配合低通滤波

我用Arduino环境来写,因为touchRead函数现成、代码最短。最基础版本的思路:不断读取触摸值,把它当成一个带直流偏置的音频信号,然后做差分处理去掉直流。

#define TOUCH_PIN T0 void setup() { Serial.begin(115200); } void loop() { int raw = touchRead(TOUCH_PIN); static int prev = 0; int diff = raw - prev; // 一阶差分,相当于高通滤波器,去掉直流分量 prev = raw; Serial.println(diff); delayMicroseconds(100); // 采样间隔约0.1ms,理论上能覆盖几kHz音频 }

实验台搭建建议:信号发生器输出载波1MHz、AM调制1kHz、调制深度30%左右,输出幅度从100mV开始慢慢往上加,通过一个100pF~1nF的电容串联到触摸引脚。如果你不想惹麻烦,这是最好的实验方式,因为信号不经过天线,完全在实验台上闭环传播。打开Arduino串口绘图仪,如果操作正确,你应该能看到一条1kHz正弦波在零线上下浮动。关掉AM调制,波形消失;把调制频率改成2kHz,波形频率跟着变。这就是标准的对照实验,确认你看到的不是50Hz工频干扰或者其他杂散噪声。

如果想直接用天线收中波广播,也能试,但要注意两点:一是中波天线至少需要几米长导线,实验现场未必好布置;二是触摸引脚对工频、人体靠近都非常敏感,稍微动一下波形就会跑飞。我的建议是先把信号发生器实验做到100%稳定,再考虑接天线收广播,否则你会被各种噪声弄得怀疑人生。

3.3 这个方案的现实定位

必须说清楚,触摸传感器做AM解调,现象很酷,但离实用还有很大距离。它没有选频能力,接上长导线后所有出现在引脚上的AM信号都会混在一起,多个电台同频叠进来,出来的声音就是一团浆糊。你可以用软件滤波突出某个音频频率,但那只是音频层面的加工,解决不了射频层面的混叠。它真正适合的场景是教学演示和理解包络检波:用一把导线、一个引脚、几行代码,把“调幅”这个概念从书本搬到屏幕上。如果你想要一台能听的收音机,去买个正经的收音机芯片或者用SDR,都比这条路省心得多。

4. 通路三实验:把BLE的CTE变成一把可开关的射频信号源

4.1 CTE在官方文档里的定位与真实信号特征

BLE的数据包结构里,CTE是跟在某个LL事件后面的一段“额外尾巴”。这段尾巴没有调制,频率就等于该物理信道的中心频率,例如信道37的中心频率是2402MHz。接收机通过测量这段纯载波在不同天线上的相位差,就能算出信号来向。官方文档的所有算法、代码、示例都围绕这个目标。

但从射频实验的角度看,这段尾巴就是一个短时CW源。打开蓝牙嗅探器或者支持2.4GHz频段的SDR,你会在信道中心频率看到一个突然出现又突然消失的窄带峰值,持续时间从几十微秒到几百微秒不等。手动开启一次,就像按了一下信号源触发键。这个特性在近场测试里很好用:不需要外接射频信号发生器,不用编程控制外部仪器,ESP32自己就能吐出一段干净载波。

4.2 开启CTE的两种可行路径

第一种路径是走正规BLE协议:用扩展广播包,在包尾附加CTE字段。SDK里通常有配置CTE长度、天线切换序列之类的入口,具体接口名在不同版本、不同芯片型号之间差异很大,我不建议你照抄网上某个版本,直接看SDK里跟CTE相关的回调函数,配置一个带CTE的广播包发出来即可。第二种路径是使用蓝牙芯片的测试模式或者厂商的vendor命令直接让射频前端输出连续波。这种模式本来是产线校准和认证测试用的,但暴露在用户空间后,等于给开发者一个软件开关的CW源。我实测下来发现,第二种方式更容易复现,因为它不需要构造完整BLE包,只要进入测试模式再退出就行。

不管走哪条路,验证方法都是一样的:用支持2.4GHz的接收设备,把中心频率调到目标信道中心,打开瀑布图或者频谱图,触发一次CTE发射,屏幕就会闪出一根短脉冲谱线。这里有个关键提醒:普通RTL-SDR接收棒最高一般只能到1.7GHz左右,看不了2.4GHz频段,需要频谱仪或者更高频率范围的SDR方案。

4.3 近场实验用途和发射边界

CTE载波虽然时间短,但频率稳定、频点可预测,非常适合做三类实验。第一类是屏蔽效果验证:把一个小天线靠近ESP32,再拿一块金属板隔在中间,观察SDR上信号幅度变化,能够直观感受到屏蔽罩的作用。第二类是无源标签唤醒:某些低功耗标签内置整流电路,能够从2.4GHz载波获取能量,你不需要专门用射频信号源供电,用ESP32发一段CTE就能看到标签上的LED微亮或者MCU被唤醒。第三类是射频开关响应时间测试:把CTE的起始沿当作时间基准,配合SDR记录,可以测量外部射频开关或者功放模块的切换延迟。

发射边界必须反复强调。2.4GHz频段极其拥挤,Wi-Fi、蓝牙、ZigBee全都挤在一起。CTE连续波虽然是ISM频段合法应用,但持续满载发射会让周围Wi-Fi体验雪崩,也会让ESP32的射频前端热积累严重,毕竟它本来就不是为连续发射设计的。操作方法上要注意:把发射功率调到可用范围里的最低挡,加衰减器,测完立刻关闭。另外,任何实验都不得把它当作“可绕过监管的隐藏通道”来使用,这条红线在后面的合规清单里会再提一遍。

5. 信号验证工具箱与“手册外能力”的正确打开方式

5.1 为什么推荐SDR做第一道验证

我在测试这三条通路时,最大的感触是:数字域的验证和射频域的验证完全是两回事。用万用表量通断、用逻辑分析仪看数据引脚,都只能证明“开发板上的数字信号出来了”,不能证明“射频信号真的辐射出去了”。这时候SDR的价值就体现出来了:打开频谱图,看一眼载波有没有出现,一秒钟就能定位问题。

不同工具适合看不同的环节,我整理了一个简单的选型思路:

工具适合观察的目标不适合什么
逻辑分析仪调制前的数字脉冲波形、接收模块输出的基带数据看不到射频载波是否真正发射
示波器观察低速包络、边沿时序、电源噪声看433MHz完整载波需要1GHz以上带宽,普通示波器做不到
SDR接收棒直接看频谱峰值、瀑布图、OOK闪烁普通型号覆盖不到2.4GHz
频谱仪精确测量频率、功率、带宽价格高,大多数人手头没有

我建议的排查顺序是:先用SDR看频谱,确认载波通断;再用逻辑分析仪看基带数据,确认编码逻辑对;最后用示波器看边沿和供电,解决稳定性问题。这套顺序几乎可以覆盖所有“射频链路调不通”的疑难杂症。

5.2 调试时最容易忽略的三个细节

第一个细节是共地。开发板、发射模块、接收模块、SDR如果不在同一个地参考上,频谱里会出现忽大忽小的浮动,甚至出现移动的杂散峰。建议从开发板统一引出3.3V和GND,让所有模块共用同一组电源线,不要两个USB独立供电。

第二个细节是别盲目抄时序参数。我曾经见过一位开发者在论坛里求助:照抄了别人的RMT参数,发射模块死活没反应。结果一查,他用的发射模块对DATA高电平要求最短100微秒,而别人的参数只有45微秒。每个模块的规格不一样,先查模块资料,再用示波器确认DATA引脚波形,不要迷信网络代码。

第三个细节是触摸实验的稳定性。触摸引脚对皮法级电容变化都敏感,手一靠近、线一压、电源纹波一大,读数全飘。做AM包络实验时,把开发板平放固定,引脚导线尽量远离数字信号线和USB线,测量过程中手远离板子。所有测量都做“开/关对照”:信号源开和信号源关各采一组数据,一对比就知道捕捉到的信号是不是你想要的。

5.3 合规清单:能玩的范围和不能碰的红线

写到这里,我必须把“手册外通路”的定义和边界说透。所谓没有写进手册,是指官方应用文档没有把外设的通用能力讲透,而不是给你一个可以无视无线电管理规定的灰色后门。能玩的范围很清晰:在本地无线电法规允许的ISM频段做低功率短距离实验;用信号发生器进行传导耦合测试;接收本地公共广播信号用于学习;在实验室里使用衰减器和屏蔽盒控制实验环境。这些都属于正常的射频学习范畴。

不能碰的红线同样清晰:未经许可增大发射功率、改变频点、加装高增益天线;对任何不明信号做恶意干扰;以“隐藏通道”之名绕过监管,或者把这类技术用在非法通信上。尤其是最后一条,一旦方向跑偏,再酷的技术也会变成负担。我宁可多啰嗦几句安全原则,也不希望看到有读者因为好奇玩出麻烦。

如果你真的喜欢折腾射频,正确的态度是把它当成理解芯片外设通用性的窗口,而不是找到了一条规则之外的旁路。RMT能发射ASK,触摸引脚能解调AM,CTE能当CW源,这些能力都在合法实验的框架内,都能让你学到实打实的射频链路知识。把这些原理吃透,比琢磨任何灰色用法都更长久、更有价值。

落地时的个人体会是:不要一上来就追求复杂,先复现2.2节那条433MHz ASK链路,材料最简单、现象最直观。等SDR上看到频谱峰随着数据脉冲一闪一闪时,你自然会理解什么叫“不靠协议栈也能通信”。手册没写的东西,往往比宣传彩页上写的多得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询