原文首发于IterNull Blog,作者为IterNull,原文链接地址:http://blog.iternull.com/posts/2017/02/02/Decoding-Remote-Control-Signals.html
我们平常对遥控器信号的截取、分析、重放,一般用得都是 SDR 设备,常见的有 R820T2+RTL2832U, CC1111EMK, Yardstick One, HackRF One ……
其中 R820T2+RTL2832U 电视棒是最廉价的 SDR 设备,35 人民币左右就能得到,其余的都是比较昂贵的设备。不过使用电视棒你只能接收信号,不能发送信号。
这里我们使用更廉价的设备(Arduino + 315 or 433 MHz 超再生模块)来实现对常见固定码遥控器信号的分析与重放。
常见型号的 Arduino 开发板都可以支持,无线模块建议不同频段的多买几对,价格也不贵。
1、接收/解码信号
这里我们使用 RC Switch 库接收和解码信号。
1.1 安装 RC Switch 库
打开 Arduino IDE ,在选项栏 项目 > 加载库 > 管理库 里打开库管理器,搜索 rc switch
并安装它。
1.2 连接 Arduino 和接收模块
使用数据线连接 Arduino 到电脑,并在 Arduino IDE 里选择对应的板和端口号。
1.3 上传代码
打开信号接收的示例代码。在选项栏 文件 > 示例 > rc-switch > ReceiveDemo_Simple
/* Simple example for receiving https://github.com/sui77/rc-switch/ */ #include <RCSwitch.h> RCSwitch mySwitch = RCSwitch(); void setup() { Serial.begin(9600); mySwitch.enableReceive(0); // Receiver on interrupt 0 => that is pin #2 } void loop() { if (mySwitch.available()) { int value = mySwitch.getReceivedValue(); if (value == 0) { Serial.print("Unknown encoding"); } else { Serial.print("Received "); Serial.print( mySwitch.getReceivedValue() ); Serial.print(" / "); Serial.print( mySwitch.getReceivedBitlength() ); Serial.print("bit "); Serial.print("Protocol: "); Serial.println( mySwitch.getReceivedProtocol() ); } mySwitch.resetAvailable(); } }
点击上传,上传代码到 Arduino
想要注意的一点,在 void setup()
里有一行代码是定义数据接收的针脚的,不同的 Arduino 版本针脚不一样,如果接错线会导致 Arduino 没法正常工作,具体可以参考 Arduino 的文档。
ySwitch.enableReceive(0); // Receiver on interrupt 0 => that is pin #2
1.4 查看信号解码
打开串口监视器。在选项栏 工具 > 串口监视器 或者按快捷键 Ctrl + Shift + M
然后你可以按下遥控器,Arduino 会解码它,并在串口监视器上显示出你按下的按键所发送的代码。
2、重放信号
当你知道了信号的代码后你就可以对它进行信号的重放。
2.1 连接 Arduino 和发送模块
2.2 修改示例代码
打开信号发送的示例代码。在选项栏 文件 > 示例 > rc-switch > SendDemo
示例代码里有好几种发送选项,和好几个被注释的发送参数。
这里我们使用十进制的发送方式。
/* Example for different sending methods https://github.com/sui77/rc-switch/ */ #include <RCSwitch.h> RCSwitch mySwitch = RCSwitch(); void setup() { Serial.begin(9600); // Transmitter is connected to Arduino Pin #10 mySwitch.enableTransmit(10); // Optional set pulse length. // mySwitch.setPulseLength(320); // Optional set protocol (default is 1, will work for most outlets) // mySwitch.setProtocol(2); // Optional set number of transmission repetitions. // mySwitch.setRepeatTransmit(15); } void loop() { /* See Example: TypeA_WithDIPSwitches */ /* mySwitch.switchOn("11111", "00010"); delay(1000); mySwitch.switchOff("11111", "00010"); delay(1000); */ /* Same switch as above, but using decimal code */ mySwitch.send(5393, 24); // 5393 表示发送的信号代码, 24 表示数据长度。 delay(1000); // 暂停 1000 毫秒后再执行下一行代码。 mySwitch.send(5396, 24); delay(1000); /* Same switch as above, but using binary code */ /* mySwitch.send("000000000001010100010001"); delay(1000); mySwitch.send("000000000001010100010100"); delay(1000); */ /* Same switch as above, but tri-state code */ /* mySwitch.sendTriState("00000FFF0F0F"); delay(1000); mySwitch.sendTriState("00000FFF0FF0"); delay(1000); */ delay(20000); }
2.3 上传代码
代码上传完成后会一直向外发送信号。
3、可能遇到的问题
1、串口监视器没有显示,不能正常接收信号。
导致出现正在错误的情况有很多,比如打开的端口错误、接收模块与 Arduino 的连接错误、遥控器和接收模块不是同一个频段的……
2、发送的信号正常但被遥控的设备没响应。
遇到这种情况你需要使用 RC Switch 库的 ReceiveDemo_Advanced 示例代码进行接收和解码信号,其中有一个 PulseLength
字段,RC Switch 库默认的值是 320
,而常见的遥控器是 185
你需要修改发送代码的 mySwitch.setPulseLength(185);
参数。
- RC Switch: https://github.com/sui77/rc-switch