使用 Arduino 和 RC Switch 逆向遥控器

原文首发于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);参数。


原文地址:https://www.cnblogs.com/1go0/p/13794380.html