zoukankan      html  css  js  c++  java
  • 使用 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);参数。


  • 相关阅读:
    JS URL传中文参数引发的乱码问题
    git (转载)
    php webservice
    php date之间的相互转换
    在图片上加字符-base64转图片-图片转base64
    转:微软面试一百题
    2014-8-17 note
    some base knowledge
    introduction
    Centos6.6 编译安装nginx
  • 原文地址:https://www.cnblogs.com/1go0/p/13794380.html
Copyright © 2011-2022 走看看