本帖最后由 furong600 于 2021-11-1 11:44 编辑
1. 背景:
由于对面房子建起来了,离自己家只有80米左右,晚上对面很容易看到家里。
于是在淘宝买了电动遮阳帘,想让遮阳帘日出自动升起来,日落自动降下来。
买前和客服反复确认了是RF433,但收到后,一直无法用esphome RF receiver或者openmqttgateway来读取射频码。
试了好多谷歌上esphome receiver的配置参数都不行。
偶然间,在一个网站上看到用逻辑分析仪来分析射频码。于是在淘宝花了41元买了个逻辑分析仪。当在逻辑分析仪里,抓到波形的时候。豁然开朗。原来这个遥控器RF433协议是这样的。
分析协议后,用excel统计好时间,得出引导码和脉冲的时间平均值。直接用ESPhome,按照时间隔间发射出来。窗帘动了,动了,动了。激动的心情和返回舱成功落地一样激动。毕竟在老婆面前吹的牛,没有破!
后面又看了下为啥rc_switch协议识别不了我的遥控器。发现我的遥控器,脉冲时间和bit 0/1的时间不在rc_switch协议表里面。根据我的遥控器设置了协议,也可以直接用0/1代码来发送了。
只要用逻辑分析仪抓到射频波形,可以模拟出,任何协议遥控器。(每个厂家遥控器协议不一样,看着都是0/1,但0/1对应的时间定义不一样)
2. 用逻辑分析仪抓取RF433射频波形:
某宝买的这个逻辑分析仪比以前上学时实验室用的那种好用。接在电脑上用软件查看波形。可以放大缩小波形,查看时间也很方便。
所用工具:
1. 433M超外差接收模块(模块上就一个芯片的那种,比超再生模块抗干扰能力强,2元)
2. 逻辑分析仪(24MHz采样,40元)3. NodeMCU8266
步骤:
1. 逻辑分析仪接线
CH0 ->接收模块data管脚
GND ->接收模块GND
2. 打开电脑软件PulseView,修改顶部采样参数设置为100M samples,1MHz采样频率。
点run,按下遥控器按键,然后点stop。
这样波形就抓好了。一般遥控器为了防止有干扰导致部分bit出错,会重复发3-5次控制码,或者发部分数据位的反码,来保证控制命令传输成功。
注意:要先装好驱动,连好usb,再打开PulseView。
否则无法默认识别逻辑分析仪接口类型。虽然可以手动添加,但不知道选哪个接口。
3. 波形分析:
协议分析我主要参考了https://blog.csdn.net/wo325866145/article/details/109808137。里面相同的内容我就不提了。主要说下我的分析。
上图是我抓到的波形。测量每个高低电平的时间,存储在excel里面。统计去掉最大最小取平均值可以看出。
一个窄的高电平或者低电平为346us,一个宽高电平或低电平为700us。一般宽和窄是倍数关系。我这里取近似2:1关系。宽700us,窄350us。
这里为什么波形抓出来,不是精确的同一个值呢?因为芯片发射时,时钟并非那么精确,而且如果是单片机控制发射,用中断计算时间,也会有误差。
到这里,其实我们已经可以用间隔时间完全模拟出任意遥控器了。
因为不论什么协议,最终发射出来的都是有一定时间间隔的高低电平。
在esphome里面,用transmit_raw,模拟出发射波形。(高低电平是用正负来表示的)。
remote_transmitter:
pin: D1
# RF uses a 100% carrier signal
carrier_duty_percent: 100%
switch:
- platform: template
name: RF3 Button down
turn_on_action:
# - remote_transmitter.transmit_rc_switch_raw:
# code: '010011111000110000010000000001100011110'
# protocol: 1
- remote_transmitter.transmit_raw:
code: [4773, -1514, 343, -724, 696, -371, 696, -371, 343, -724, 343, -724, 343, -724, 696, -371, 343, -724, 696, -371, 343, -724, 696, -371, 343, -724, 343, -724, 343, -724, 696, -371, 343, -724, 696, -371, 343, -724, 343, -724, 696, -371, 343, -724, 343, -724, 343, -724, 343, -724, 343, -724, 343, -724, 343, -724, 343, -724, 343, -724, 696, -371, 696, -371, 343, -724, 343, -724, 343, -724, 696, -371, 696, -371, 343, -724, 343, -724, 696, -371, 696, -7849]
抓出来的时间间隔,不是相同的。可以取平均值。比如窄脉冲时间,这里取的是343us. 这里不用担心时间浮动一些,会影响数据传输。接收端一般会留一定百分比幅度的误差.
假如宽容度(esphome接收参数 tolerance)为25%,343us*25%=85us。上下可以浮动85us,都没问题。
恭喜你,你已经可以模拟任意一款RF433遥控器了。
如果只想简单模拟按键,到这里已经结束了。如果想了解更多深层次问题,可以继续往下看。
4. rc_swtich协议分析:
rc_switch协议在RF433射频中,使用非常广泛。esphome/tasmota/openmqttgateway用的都是这个协议来抓取和发射射频。
但为啥我这个遥控器,就无法解码呢???
于是我翻看了一下rc_switch源码。发现我这个遥控器的协议,不在rc_switch协议列表里。
协议源文件,对协议介绍的很清楚,值得大家一看。
rc_switch协议表:https://github.com/sui77/rc-switch/blob/
/* Format for protocol definitions:
* {pulselength, Sync bit, "0" bit, "1" bit, invertedSignal}
*
* pulselength: pulse length in microseconds, e.g. 350
* Sync bit: {1, 31} means 1 high pulse and 31 low pulses
* (perceived as a 31*pulselength long pulse, total length of sync bit is
* 32*pulselength microseconds), i.e:
* _
* | |_______________________________ (don't count the vertical bars)
* "0" bit: waveform for a data bit of value "0", {1, 3} means 1 high pulse
* and 3 low pulses, total length (1+3)*pulselength, i.e:
* _
* | |___
* "1" bit: waveform for a data bit of value "1", e.g. {3,1}:
* ___
* | |_
*
* These are combined to form Tri-State bits when sending or receiving codes.
*/
#if defined(ESP8266) || defined(ESP32)
static const VAR_ISR_ATTR RCSwitch::Protocol proto[] = {
#else
static const RCSwitch::Protocol PROGMEM proto[] = {
#endif
{ 350, { 1, 31 }, { 1, 3 }, { 3, 1 }, false }, // protocol 1
{ 650, { 1, 10 }, { 1, 2 }, { 2, 1 }, false }, // protocol 2
{ 100, { 30, 71 }, { 4, 11 }, { 9, 6 }, false }, // protocol 3
{ 380, { 1, 6 }, { 1, 3 }, { 3, 1 }, false }, // protocol 4
{ 500, { 6, 14 }, { 1, 2 }, { 2, 1 }, false }, // protocol 5
{ 450, { 23, 1 }, { 1, 2 }, { 2, 1 }, true }, // protocol 6 (HT6P20B)
{ 150, { 2, 62 }, { 1, 6 }, { 6, 1 }, false }, // protocol 7 (HS2303-PT, i. e. used in AUKEY Remote)
{ 200, { 3, 130}, { 7, 16 }, { 3, 16}, false}, // protocol 8 Conrad RS-200 RX
{ 200, { 130, 7 }, { 16, 7 }, { 16, 3 }, true}, // protocol 9 Conrad RS-200 TX
{ 365, { 18, 1 }, { 3, 1 }, { 1, 3 }, true }, // protocol 10 (1ByOne Doorbell)
{ 270, { 36, 1 }, { 1, 2 }, { 2, 1 }, true }, // protocol 11 (HT12E)
{ 320, { 36, 1 }, { 1, 2 }, { 2, 1 }, true } // protocol 12 (SM5212)
};
我的遥控器,一个脉冲时间为350us,其它用350us的倍数表示,协议表里面没有符合的。
好在rc_switch支持自定义协议:rc_switch_raw。
我的遥控器rc_switch协议参数如下:
{pulselength, Sync bit, "0" bit, "1" bit, invertedSignal}
{350, [14,4], [1,2], [2,1], false}
单位脉冲时间:350us
同步位:4773us高电平+1514低电平 [14, 4]
bit 0:350us高电平+700us低电平 [1, 2]
bit 1:700us高电平+350us低电平 [2, 1]
code根据上面bit 0/1的定义,在波形上记录下。
最终完美用rc_switch发射出来。控制卷帘,日出而升,日落而降。
- platform: template
name: RF433 Cover1 Up
turn_on_action:
- remote_transmitter.transmit_rc_switch_raw:
code: '0100111110001100000100000000011000010001' # 0x4F 8C10 0611
protocol:
pulse_length: 350
sync: [14, 4]
zero: [1, 2]
one: [2, 1]
repeat:
times: 5
wait_time: 7500us
用时间间隔RAW格式来发送和用protocol来发送,都可以。
时间间隔可以原样模拟遥控器发射的波形。
protocol用bit 0/1来表示,更方便些。但在某种情况下,无法原样模拟。
例如,我这个遥控器,先3次发控制码,再发5次最后4bits的反码。
RF433 cover2 down:
0100100110100110001100000000011000110011 49 A630 0633
0100100110100110001100000000011000110011 49 A630 0633
0100100110100110001100000000011000110011 49 A630 0633
0100100110100110001100000000011000111100 49 A630 063C
0100100110100110001100000000011000111100 49 A630 063C
0100100110100110001100000000011000111100 49 A630 063C
0100100110100110001100000000011000111100 49 A630 063C
0100100110100110001100000000011000111100 49 A630 063C
实际只发控制码,重复几次,也能控制。后面这种反码,一般用来保证前面数据传输的正确性。
5. ESPhome接收-有逻辑分析仪:
关于接收模块,建议买超外差带芯片和长天线的模块。一般的超再生模块,抗干扰和信号弱。家里有个影辉幕布的遥控器,超再生抓不到,超外差能抓到。
下图是换成超外差,并调整接收参数后,收到的raw数据。
超外差接收能力强,导致杂波也很多。想从esphome log里面找到有用的数据,也不容易。还是逻辑分析仪看的真切。
根据波形,调整参数后,esphome配置如下:
remote_receiver:
#pin: D2
dump: all
pin:
number: D2
#inverted: True
mode: INPUT_PULLUP
#dump:
# - rc_switch
# Settings to optimize recognition of RF devices
tolerance: 50%
filter: 200us
idle: 6ms
buffer_size: 3kb
remote_transmitter:
pin: D1
# RF uses a 100% carrier signal
carrier_duty_percent: 100%
binary_sensor:
- platform: remote_receiver
name: "RF433 Cover3 Stop"
raw:
code: [4805, -1503, 359, -717, 710, -361, 692, -359, 358, -715, 357, -716, 358, -716, 693, -359, 357, -723, 713, -358, 358, -716, 694, -358, 358, -715, 359, -714, 359, -696, 713, -358, 359, -722, 713, -358, 358, -696, 358, -716, 713, -358, 359, -714, 359, -695, 359, -713, 360, -720, 359, -714, 359, -695, 360, -713, 360, -713, 360, -714, 695, -358, 714, -356, 361, -720, 360, -714, 696, -356, 360, -714, 715, -355, 361, -714, 696, -355, 361, -713, 715]
inverted:要不要设True,可以试下,跟绑定的管脚有关系。
filter:过滤掉频率比较高的杂波。建议设到小于窄脉冲时间的75%。
下图就是我抓到的无线干扰造成的杂波:
idle:要大于同步的时间,小于控制码重复的间隔时间
buffer_size: ESP8266默认1kb,可以设大点3kb
也可以用自定义协议方式来替换时间间隔方式,方式和发射相同。
6. ESPhome接收-无逻辑分析仪:
当在无逻辑分析仪的时候,想分析出射频接收的时间间隔序列,也是可以通过esphome log接收raw时间间隔数据。
这种方式,分析麻烦些,接收是准确和稳定的。
6.1 第一步先将接收模块接好,esphome接收设置好。
建议管脚用nodemcu8266和我用的一样,用管脚D2,节省调试时间。
remote_receiver:
dump: all
pin:
number: D2
#inverted: True
mode: INPUT_PULLUP
tolerance: 50%
filter: 200us
idle: 6ms
buffer_size: 3kb
6.2 esphome receive几个重要参数说明:
dump: all #这里要用all,或者raw+rc_switch。raw会打印脉冲时间间隔(就是逻辑分析仪看到的波形)
number: D2 #这个管脚没接其它东西,不会引起干扰。管脚不是随便选的。假如选到一个接LED的管脚上,会影响波形上升和下降时间,导致接收不稳定。
filter: 200us #建议刚开始几次设小点80-100us。我设200us,是因为我看到我的遥控器,最小脉冲宽度为300+。所以设的稍微大些,不影响接收,还能减少杂波数据。如果你的遥控器最小宽度为100us,还设成200us,收到的波形都被过滤掉了。一点数据都不会打印在log里。
idle: 6ms #两帧数据之间的间隔时间,建议初始设成8ms。没有逻辑分析,不容易知道间隔时间。设小了,容易和同步脉冲混淆。设大了,多帧数据就会变成一大串数据,没有分开。
6.3 复制log到txt
我的esphome是在home assistant里面直接网页编译的。所以直接在esphome页面,点击log,通过wireless查看。
点击查看后,页面开始打印log。这时,按下实体遥控器按键,可以间隔1s,多按几次。便于找规律。
在右面动下进度条。这样log虽然会继续打印,但不会滚动。(直接点stop,log就没了)
用鼠标从这里开始,往上拉,复制这段log,到txt里面用来分析。
6.4 分析查找射频码(时间间隔)
查找原则:
1. 有数据重复或数据很长的数据帧。(一般遥控器会重复发送多帧控制指令,保证命令成功传输)
2. 时间间隔都很接近两个值,一个窄,一个宽,且宽是窄的倍数。
如下图中,最后几行的重复数据,就是我们要找的射频码。
窄脉冲约350us,宽脉冲约700us。
找到这个数据,就好办了。最终提取出RAW格式的射频码。可以用来发射和接收。
注意:
这里raw可以显示在一行或多行里面。要把它们组合在一起。
直接放到esphome,或者把里面的数值取平均值替换后再放到esphome更准确。
记得要把开头的同步位放进去。一般是时间比较长点的脉冲。
按照下面的方法,放到esphome里面,重新编译上传,esphome log就能接收到我们的按键了。
binary_sensor:
- platform: remote_receiver
name: "RF433 Cover3 Stop RECEIVE"
raw:
code: [4805, -1503, 359, -717, 710, -361, 692, -359, 358, -715, 357, -716, 358, -716, 693, -359, 357, -723, 713, -358, 358, -716, 694, -358, 358, -715, 359, -714, 359, -696, 713, -358, 359, -722, 713, -358, 358, -696, 358, -716, 713, -358, 359, -714, 359, -695, 359, -713, 360, -720, 359, -714, 359, -695, 360, -713, 360, -713, 360, -714, 695, -358, 714, -356, 361, -720, 360, -714, 696, -356, 360, -714, 715, -355, 361, -714, 696, -355, 361, -713, 715]
下面就是esphome log的打印:
[08:17:05][D][remote.raw:041]: Received Raw: -253, 341, -2301, 2709
[08:17:05][D][remote.raw:028]: Received Raw: 642, -277, 1799, -509, 514, -1776, 1416, -5193, 4372, -4492, 4812, -1484, 378, -696, 733, -340, 732, -340, 376, -681, 373, -698, 376, -699, 730, -341, 357, -706, 729, -343, 374, -700, 729, -343, 354, -700, 374, -700, 373, -701, 728, -344,
[08:17:05][D][remote.raw:028]: 353, -709, 728, -344, 372, -701, 372, -703, 707, -346, 371, -702, 371, -702, 371, -685, 371, -709, 371, -702, 371, -703, 371, -683, 375, -699, 370, -704, 725, -348, 706, -346, 370, -711, 370, -705, 724, -347, 369, -687, 723, -349, 368, -706, 723, -349,
[08:17:05][D][remote.raw:041]: 349, -707, 722
[08:17:05][D][binary_sensor:036]: 'RF433 Cover3 Stop RECEIVE': Sending state ON
[08:17:05][D][binary_sensor:036]: 'RF433 Cover3 Stop RECEIVE': Sending state OFF
[08:17:05][D][binary_sensor:036]: 'RF433 Cover3 Stop RECEIVE': Sending state ON
[08:17:05][D][binary_sensor:036]: 'RF433 Cover3 Stop RECEIVE': Sending state OFF
[08:17:05][D][binary_sensor:036]: 'RF433 Cover3 Stop RECEIVE': Sending state ON
[08:17:05][D][binary_sensor:036]: 'RF433 Cover3 Stop RECEIVE': Sending state OFF
[08:17:05][D][binary_sensor:036]: 'RF433 Cover3 Stop RECEIVE': Sending state ON
[08:17:05][D][binary_sensor:036]: 'RF433 Cover3 Stop RECEIVE': Sending state OFF
[08:17:06][D][remote.raw:041]: Received Raw:
[08:17:06][D][remote.raw:028]: Received Raw: -305, 260, -689, 436, -260, 547, -853, 961, -503, 810, -841, 334, -435, 343, -934, 441, -1029, 249, -482, 1430, -221, 339, -611, 410, -667, 2433, -2655, 261, -476, 1592, -240, 604, -318, 441, -483, 796, -498, 261, -497, 1272, -433, 506,
[08:17:06][D][remote.raw:028]: -425, 269, -302, 429, -828, 1302, -520, 596, -859, 3854, -2665, 2574, -345, 619, -501, 1510, -865, 1156, -690, 511, -1319, 622, -304, 1145, -650, 1347, -664, 799, -307, 634, -1210, 789, -1031, 974, -1039, 618, -487, 437, -680, 239, -883, 667, -587,
[08:17:06][D][remote.raw:041]: 686, -962, 1257, -229, 326, -236, 329, -420
[08:17:06][D][remote.raw:041]: Received Raw: -683
[08:17:05][D][remote.raw:028]: Received Raw: 642, -277, 1799, -509, 514, -1776, 1416, -5193, 4372, -4492, 4812, -1484, 378, -696, 733, -340, 732, -340, 376, -681, 373, -698, 376, -699, 730, -341, 357, -706, 729, -343, 374, -700, 729, -343, 354, -700, 374, -700, 373, -701, 728, -344,
[08:17:05][D][remote.raw:028]: 353, -709, 728, -344, 372, -701, 372, -703, 707, -346, 371, -702, 371, -702, 371, -685, 371, -709, 371, -702, 371, -703, 371, -683, 375, -699, 370, -704, 725, -348, 706, -346, 370, -711, 370, -705, 724, -347, 369, -687, 723, -349, 368, -706, 723, -349,
[08:17:05][D][remote.raw:041]: 349, -707, 722
上面其实是第一帧数据,同步位我标红了。只是因为前面干扰太近4ms(当前接收参数idle为6ms),没有识别成功。
[08:17:05][D][binary_sensor:036]: 'RF433 Cover3 Stop RECEIVE': Sending state ON
紧接着就是识别到4帧按键指令,说明esphome接收到了按键“RF433 Cover3 Stop RECEIVE”,并且重复了4次,其它的Raw数据都不是按键信息。
这里可以看到,重复发送多次指令的重要性。
恭喜你,已经完成了esphome的成功接收。
7. 窗帘遥控器编码:
7.1 再次强调。遥控器不能只看编码,还要看单位脉冲时间,同步位,bit 0/1的定义。
下表是我的三个卷帘遥控器的编码。设置键P2,我只抓了一个遥控器。其它可以类推。
==========================
bits number: 40bits
RF433 cover1 up: 4F 8C10 0611
RF433 cover1 stop: 4F 8C10 0655
RF433 cover1 down: 4F 8C10 0633
RF433 cover2 up: 49 A630 0611
RF433 cover2 stop: 49 A630 0655
RF433 cover2 down: 49 A630 0633
RF433 cover3 up: 62 A290 0611
RF433 cover3 stop: 62 A290 0655
RF433 cover3 down: 62 A290 0633
RF433 cover3 P2: 62 A290 06CC
==========================
从编码看,编码组成:芯片唯一编码+功能控制位
芯片唯一编码:4F 8C10/49 A630/62 A290
控制位:最后16bits:
- 上:0611
- 停:0655
- 下:0633
- P2:06CC
7.2 调整上下限位方法:
1. 以此按:P2、上、P2(每次按卷帘都是上下小幅抖动一次)。进入上下限位设置模式(先下后上)
2. 按下,达到想要的位置,按停,再长按停。卷帘抖动一次为设置下限成功。
3. 按上,达到想要的位置,按停,再长按停。卷帘抖动一次为设置上限成功。
7.3 电机首次对码(配对):
感谢@Sloy 分享的杜亚遥控器和电机的配对方法:
通电转动一次,然后按一次P2,电机转动一周,然后再按一次P2电机转动一周,再按一次上键就可以完成配对。
7.4 官网:杜亚电机说明书
我在杜亚官方网站上找到了杜亚电机的说明书,下载链接:
http://www.dooya.com/download_cate.php?id=5&nid=245
例如:遮阳帘用的管状电机 DM25TE
dm25te.pdf
(3.84 MB, 下载次数: 50)
详细介绍了:如何对码/添加或清除遥控等,很实用。
大家可以根据自己的杜亚电机型号,找到对应的说明书,查看相关说明。
8. rc_switch 新增protocol请求
已经提交新增本protocol的请求,不知道rc_switch的作者给不给通过。
https://github.com/sui77/rc-switch/pull/440
如果能通过,以后杜亚的遥控器就可以直接解析出控制码,不用自定义protocol了。
9. ESPhome配置:
见附件
rf433.zip
(1.26 KB, 下载次数: 265)
10. 参考文档:
学习参考了一些文章内容,感谢以下文章作者的分享:
1. 逻辑分析仪分析无线波形:https://blog.csdn.net/wo325866145/article/details/109808137
2. rc_switch协议表:https://github.com/sui77/rc-switch/blob/master/RCSwitch.cpp
3. esphome参数设置:https://bbs.hassbian.com/thread-9210-1-1.html
4. esphome参数设置讨论:https://github.com/esphome/esphome/issues/228
5. esphome参数设置讨论:https://community.home-assistant.io/t/esphome-rf-receiver-too-much-noise/194291/5
6. RF433 ASK编码:http://www.elecfans.com/soft/161/2021/202102061497733.html
有技术问题,可以留言探讨。
分享您如何利用本方法,解决射频的疑难问题。
|