查看: 6698|回复: 7

扩展库使用说明——无线遥控

[复制链接]

19

主题

80

帖子

631

积分

版主

Rank: 7Rank: 7Rank: 7

积分
631
发表于 2021-7-23 08:59:42 | 显示全部楼层 |阅读模式
本帖最后由 zly188 于 2021-10-21 13:18 编辑

一、概述
      433M/315M的无线在现实生活中使用很广泛,尤其是一些小家电里的无线遥控,比如遥控车库门、遥控晾衣架、无线开关、无线窗帘电机等。
       无线遥控器常用的编码方式有两种类型,即固定码与滚动码两种,滚动码是固定码的升级换代产品,目前凡有保密性要求的场合,都使用滚动编码方式。而固定码目前常用的有编码格式有2262、1527等,还有一些私有协议,比如宁波杜亚电机协议。
       本扩展库为通过单片机来实现1527、2262、杜亚电机等的编码,驱动无线模块发送无线信号来控制对应的设备。
       扩展库后续还会添加无线解码功能,用来解码无线编码数据。

二、硬件连接方式
Dingtalk_20210723142943.jpg
测试用的无线模块为433.92频率的模块,具体参数如下
231410cbnb8u4db48bn4xn.png
点击链接购买

三、库的函数功能和说明
1.1527编码说明
232337pk2o7hhcd52oooc5.jpg
如上图,包含一个同步头,20位地址码,4位开关码
同步头高电平和低电平脉宽比为1:31;
数据1高电平和低电平脉宽比为3:1;
数据0高电平和低电平脉宽比为1:3;

linecode_twostate.png
4LCK脉宽范围300-500us之间,常用的有350us,公牛面板为400us。

无线信号容易受到扰乱,尤其第一帧,所以数据至少需要连续发送3次以上。
库里默认为重复发送10次,如需修改,请看下面关于BlueRFLink基类的说明。

扩展库为使用C++编写,rf1527类包含初始化和发送两部分,继承至BlueRFLink基类
  1. class rf1527:public BlueRFLink
  2. {
  3.   public:
  4.     rf1527(uint8_t tx_pin, timer_base_t timer):BlueRFLink(tx_pin,timer)
  5.     {
  6.       setProtocol(13);//默认使用公牛的协议,这样公牛面板和其他厂家的面板都能兼容,公牛面板只支持这个。
  7.     };
  8.     void send(uint32_t address, uint8_t data);
  9. };
复制代码

1.jpg
  1. rf1527(uint8_t tx_pin, timer_base_t timer)
复制代码
初始化参数,第一个为发送的引脚;第二个为调用的定时器:ASR有TIMER0-3 4个定时器可以调用,注意不要和其他库同时调用同一个定时器,造成冲突;

2.jpg
  1. void rf1527::send(uint32_t address, uint8_t data)
复制代码
发送参数,第一个为C0-C19的20位地址,一般为出厂统一设置,程序上可以用EEPROM或者FLASH来存储;第二个为D0-D3的数据,包含(0~15)16种开关;
注意有些设备会有特殊的设置,比如官方提供的无线插座,数据位需要大于1。

2.2262编码说明

linecode_tristate.png
Dingtalk_20210723103715.jpg
如上图,
同步头:高电平和低电平脉宽比为1:31;
数据0: 1 Pulse High + 3 Pulses Low + 1 Pulse High + 3 Pulses Low
数据1: 3 Pulses High + 1 Pulse Low + 3 Pulses High + 1 Pulse Low
数据F: 1 Pulse High + 3 Pulses Low + 3 Pulses High + 1 Pulse Low

Dingtalk_20210723104947.jpg
包含最大12位地址,其中有6位数据和地址共用。

我们从2262的脉冲时序来看,可以发现和1527编码类似,都是24位+同步,所以程序上,底层和1527一样,调用的是同一个函数。

扩展库为使用C++编写,rf2262类包含初始化和发送两部分,继承至BlueRFLink基类
  1. class rf2262:public BlueRFLink
  2. {
  3.   public:
  4.     rf2262(uint8_t tx_pin, timer_base_t timer):BlueRFLink(tx_pin,timer){setProtocol(1);};
  5.     void sendTriState(const char* sCodeWord);
  6. };
复制代码


1.jpg
  1. rf2262(uint8_t tx_pin, timer_base_t timer)
复制代码
初始化参数,第一个为发送的引脚;第二个为调用的定时器:ASR有TIMER0-3 4个定时器可以调用,注意不要和其他库同时调用同一个定时器,造成冲突;

2.jpg
  1. /**
  2.   * @brief  2262三态数据发送
  3.   * @param sCodeWord 三态字符串("0000011111FF")
  4.   */
  5. void rf2262::sendTriState(const char* sCodeWord)
复制代码

3.杜亚电机编码说明
宁波杜亚是全球最大的一家门窗电机制造商,目前市面上的智能窗帘电机大部分都是出自他家,不是他家的,里面的通讯协议也会兼容他的,所以他的电机私有协议,已经默认为行业协议。不过网上有关电机的无线遥控部分的协议资料很少,通过不断的分析得到如下协议。
图片1.png

同步+28 Bit ID(地址) + 4 Bit CH (通道)+ 8 Bit CMD(命令)
同步   _|——————————————|________|
时间   _|————11.95T———————|__3.9T__|
DATA(H)_|————————|__|
            _|——1.75T———|1T|
DATA(L)_|——|____________|
            _|1T  |——1.75T———|
CH=0 群控,最大15
CMD=0x11 开;CMD=0x55 停;CMD=0x33 关;MD=0xCC 对码;CMD=0x1E 固定点动开;CMD=0x3C 固定点动关;
*/

扩展库为使用C++编写,dooya类包含初始化和电机控制等部分,继承至BlueRFLink基类
  1. class dooya:public BlueRFLink
  2. {
  3.   public:
  4.     dooya(uint8_t tx_pin, timer_base_t timer):BlueRFLink(tx_pin,timer)
  5.     {
  6.       setProtocol(14);
  7.       setChannel(1);
  8.       setAddress(0xfffffff);
  9.     };
  10.     void motorCW();
  11.     void motorCCW();
  12.     void motorStop();
  13.     void motorInchingCW();
  14.     void motorInchingCCW();
  15.     void matchCode();
  16.     void setAddress(uint32_t addr);
  17.     void setChannel(uint8_t ch);
  18.     void sendCmd(uint8_t cmd);
  19.   private:
  20.     uint32_t _address;
  21.     uint8_t _ch;
  22. };
复制代码


1.jpg
  1. dooya(uint8_t tx_pin, timer_base_t timer)
复制代码
初始化参数,第一个为发送的引脚;第二个为调用的定时器:ASR有TIMER0-3 4个定时器可以调用,注意不要和其他库同时调用同一个定时器,造成冲突;

2.jpg
  1. /**
  2.   * @brief  设置出厂地址
  3.   * @param addr 地址
  4.   */
  5. void dooya::setAddress(uint32_t addr)

  6. /**
  7.   * @brief  设置通道
  8.   * @param ch 通道,0为群控,最大15
  9.   */
  10. void dooya::setChannel(uint8_t ch)
复制代码
设置地址,长度为28位,一般为出厂统一设置,程序上可以用EEPROM或者FLASH来存储
设置通道,0为群控,最大15

3.jpg
  1. void dooya::matchCode()
复制代码
和电机配对的时候,需要发送这个命令。


4.jpg
  1. void dooya::motorCW()
  2. void dooya::motorCCW()
  3. void dooya::motorStop()
  4. void dooya::motorInchingCW()
  5. void dooya::motorInchingCCW()
复制代码
设置电机不同的状态,点动控制有些设备不支持。

  1. /**
  2.   * @brief  发送自定义命令
  3.   * 还有开关灯等其他命令,根据实际情况自己设置
  4.   */
  5. void dooya::sendCmd(uint8_t cmd)
复制代码
有些遥控还有照明按键,目前还没分析对应的命令码,开放接口给用户自己处理,后期会更新。

4.BlueRFLink基类说明
  1. class BlueRFLink
  2. {
  3.   public:
  4.     BlueRFLink(uint8_t tx_pin, timer_base_t timer);

  5.     struct HighLow {
  6.         uint8_t high_pulse;
  7.         uint8_t low_pulse;
  8.     };

  9.     struct Protocol {
  10.         /** base pulse length in microseconds, e.g. 350 */
  11.         uint16_t pulseLength;//最小脉宽
  12.         HighLow sync;//同步头的高低脉宽比例因子
复制代码
  1. static const BlueRFLink::Protocol proto[]=
  2. {
  3.   { 350, {  1, 31 }, {  1,  3 }, {  3,  1 }, false },    // protocol 1
  4.   { 650, {  1, 10 }, {  1,  2 }, {  2,  1 }, false },    // protocol 2
  5.   { 100, { 30, 71 }, {  4, 11 }, {  9,  6 }, false },    // protocol 3
  6.   { 380, {  1,  6 }, {  1,  3 }, {  3,  1 }, false },    // protocol 4
  7.   { 500, {  6, 14 }, {  1,  2 }, {  2,  1 }, false },    // protocol 5
  8.   { 450, { 23,  1 }, {  1,  2 }, {  2,  1 }, true },     // protocol 6 (HT6P20B)
  9.   { 150, {  2, 62 }, {  1,  6 }, {  6,  1 }, false },    // protocol 7 (HS2303-PT, i. e. used in AUKEY Remote)
  10.   { 200, {  3, 130}, {  7, 16 }, {  3,  16}, false},     // protocol 8 Conrad RS-200 RX
  11.   { 200, { 130, 7 }, {  16, 7 }, { 16,  3 }, true},      // protocol 9 Conrad RS-200 TX
  12.   { 365, { 18,  1 }, {  3,  1 }, {  1,  3 }, true },     // protocol 10 (1ByOne Doorbell)
  13.   { 270, { 36,  1 }, {  1,  2 }, {  2,  1 }, true },     // protocol 11 (HT12E)
  14.   { 320, { 36,  1 }, {  1,  2 }, {  2,  1 }, true },     // protocol 12 (SM5212)
  15.   { 400, {  1, 31 }, {  1,  3 }, {  3,  1 }, false },    // protocol 13 公牛无线开关
  16.   {  20, { 239, 78}, { 20, 35 }, { 35, 20 }, false}      // protocol 14 Dooya DC1600
  17. };
复制代码

四、综合案例
1.语音控制公牛无线面板
1.jpg
公牛无线开关面板
配对操作说明:
长按面板直到发出“嘀”一声,绿色指示灯闪烁,对着天问ASR说,打开灯光,会发送无线信号,面板配对成功会发出“嘀”一声,绿色指示灯常亮。

取消配对操作说明:
长按面板直到发出“嘀嘀”两声。
更多说明,请查看配套说明书。



天问定制无线开关面板
点击链接购买
先唤醒语音识别,长按主开关按键3秒,听到“滴”的一声松手,此时对着天问ASR说,打开灯光,会发送无线信号,主开关会同时发出滴一声,即配对成功。配对成功后,发配对的相同指令,如果原来开的那就关灯了,如果关灯的那就开灯。(二开,三开以此方法依次配对使用)

有没有开指令控制开灯,关指令控制关灯呢。这时就要用分别学习开和关指令的方法来控制灯了。
学习开灯指令:长按主开关按键5秒,听到“滴滴”的两声松手,此时对着天问ASR说,打开灯光,即可实现此功能。
学习关灯指令:长按智能开关7秒,听到“滴滴滴”的三声松手,此时对着天问ASR说,关闭灯光,即可实现此功能。(注意这里程序上要和打开灯光的命令不同)
取消配对:长按智能开关10秒,听到“滴滴滴滴”的四声松手,即可清除配对。

注意:在“滴滴”声后,1-2秒里,就应该发送学习的无线指令。不然学习无效。请注意控制时间。

更多说明,请查看配套说明书。

天问定制无线插座
点击链接购买
配对操作说明:
      把插座插上电源孔里,在插座开关,关闭状态下,长按按钮直到指示灯红色快速闪送后,松开按钮,指示灯慢闪,进入配对模式,对着天问ASR说,打开插座,会发送无线信号,插座红色指示灯会闪烁几下,确认配置成功。

更多说明,请查看配套说明书。

程序编写说明:
指示灯为红色的版本,发送同一条无线命令,可以在“开”、“关”两种状态之间来回切换。
指示灯为蓝色的版本,“开”:状态对应一条指令;“关”:状态对应另外一条指令;两条指令的区别是数据位的最高位为1表示开,为0表示关。

Dingtalk_20210806105446.jpg
如上图的数据位9(1001)为开、数据位1(0001)为关。

2.用天问ASR+433M无线发射模块控制窗帘
点击链接购买窗帘电机
2.jpg

恢复出厂模式
长按电机设置键 10 秒,指示灯绿灯闪烁 5 次松手,恢复出厂设置成功,清除所有用户
设置并将电机恢复至默认状态。

对码


更多说明,请查看配套说明书。

语音控制窗帘和灯光


语音控制晾衣架








回复

使用道具 举报

1

主题

6

帖子

53

积分

注册会员

Rank: 2

积分
53
发表于 2022-3-2 17:25:46 | 显示全部楼层
可以详细讲一下衣架怎么改的吗?都用会模块了?无线接收模块?谢谢
回复

使用道具 举报

0

主题

1

帖子

86

积分

注册会员

Rank: 2

积分
86
发表于 2022-10-24 13:41:03 | 显示全部楼层
什么时候出软解码的库啊,最好是识别不同振荡电阻的
回复

使用道具 举报

19

主题

80

帖子

631

积分

版主

Rank: 7Rank: 7Rank: 7

积分
631
 楼主| 发表于 2022-11-28 15:40:13 | 显示全部楼层
yinds5092 发表于 2022-10-24 13:41
什么时候出软解码的库啊,最好是识别不同振荡电阻的

已经出了一个简易的能解码1527的了,上线扩展库了
回复

使用道具 举报

0

主题

2

帖子

30

积分

注册会员

Rank: 2

积分
30
发表于 2023-2-7 09:33:54 | 显示全部楼层
电机行程是怎么控制的?
回复

使用道具 举报

0

主题

1

帖子

4

积分

注册会员

Rank: 2

积分
4
发表于 2023-3-16 23:15:15 | 显示全部楼层
STC8G1K08 只有0和1两个定时器  直接用的话使用不了如何修改成使用1定时器呢
回复

使用道具 举报

0

主题

1

帖子

4

积分

注册会员

Rank: 2

积分
4
发表于 2023-3-25 11:08:44 | 显示全部楼层
BA7MIL 发表于 2023-3-16 23:15
STC8G1K08 只有0和1两个定时器  直接用的话使用不了如何修改成使用1定时器呢

我也是相同的问题,可能这些库文件是基于8H去写的,没有适配8G这类芯片,要是能兼容该多好,任一脚都能控制就好了
回复

使用道具 举报

0

主题

5

帖子

48

积分

注册会员

Rank: 2

积分
48
发表于 2023-4-3 20:59:08 | 显示全部楼层
本帖最后由 wherestheway 于 2023-4-4 15:43 编辑

报告老师,我家好太太晾衣杆已经可以控制了,用的是杜亚协议。照明的CMD我也识别出来了,是0x0F,紫外线消毒的CMD是0x73,电源的CMD是0x70。其余CMD都是正确的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|好好搭搭在线 ( © 好好搭搭在线 浙ICP备19030393号-1 )

GMT+8, 2024-3-29 16:14 , Processed in 0.369791 second(s), 25 queries .

Powered by Discuz!

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表