无线遥控方案: ASK无线接收模块

ASK无线是电子系统常用的一种无线遥控/数据传输方式,常用的频段是315MHz和433MHz。这里我用的模块是工作在433MHz的 H3V4F 无线接收模块,体积小,功耗低(工作电流0.28mA),距离远(实测60m有效),价格便宜。在淘宝搜索H3V4F即可买到。建议采购时买配套的天线,虽然不用天线模块仍能使用,但有效距离减少很多。

发送信号采用的是卷帘门遥控器,只有四个键,淘宝上也买得到,注意因为无线模块是433MHz,因此也必须使用433MHz的遥控器。如果想使用无线发射模块,推荐同厂家的433MHz无线发射模块(H34A/H34B)。

h3v4fcontroller

无线遥控的优点:
相比于红外遥控,无线电波长短,穿透力强,传播时能能更好得绕过障碍物。因此用无线遥控时不用像红外遥控一样必须对准。
而相比无线网/蓝牙等遥控手段,无线遥控是不存在协议的,对处理能力差的单片机而言不存在维护协议的负担。而且无线网(仅TCP协议)/蓝牙是需要在通信前建立连接的,这对于简单的遥控而言也是不必要的步骤。因此,无线是遥控的最佳解决方案。

对H3V4F无线模块的测试:

1、解码方案:
按H3V4F的厂家提供的DataSheet,无线解码的方案有两种:硬件解码和软件解码
硬件解码使用PT2262芯片实现;软件解码直接使用单片机采集模块的DAT引脚的电平和时序,按厂家设计的时序解析无线信号编码。

本例采用软件解码方案,代码实现了对H3V4F模块时序的解析。
因为商家提供的时序表述不清,我用示波器观察了H3V4F模块在遥控器按动时的波形,写出了Arduino 的解码代码。

2、材料:
Arduino UNO(也可以是其他Arduino)、H3V4F无线接收模块、433MHz卷帘门遥控器、弹簧天线(可选)

3、接线:(模块有两个重复的DAT和两个重复的GND引脚,多余的不接就行。ANT引脚可接弹簧天线,也可不接)

H3V4F Arduino UNO
GND GND
DAT 2
DAT 不接
VCC 3.3V
GND 不接
ANT

4、代码:

/*
 * H3V4F无线接收模块测试
 * 型号: Arduino UNO
 * 效果: 按动遥控器时,将按键的编码通过串口发送到电脑
 */
 
// H3V4F DAT引脚对应的Arduino 引脚
#define DAT_PIN 2
 
// 超时时间设为0xffffffff ms,一个很长的时间
#define FOREVER 0xffffffff
 
// 获取下一个无线解码字节
// 参数:pin是H3V4F模块DAT对应的Arduino引脚,timeout是超时时间
// 返回值:若超时时间内接收到了无线信号,则将解码出的字节返回(0~255) ,超时返回-1
int16_t H3V4F_decode(uint8_t pin, uint32_t timeout){
    uint32_t t;
    int16_t stat = -1;
    do{
        for(uint16_t s=0;s!=0xaaaa;s<<=1){             t = pulseIn(pin,HIGH,timeout);             if(t==0){               return -1;             }             if(t>1024){
                s = 0;
            }else if(t>512){
                s++;
            }
        }
        stat = 0;
        for(uint8_t i=0;i<8;i++){
            stat<<=1;             t = pulseIn(pin,HIGH,3000);             if(t==0){                 stat = -1;             }else if(t>512){
                stat++;
            }
        }
    }while(stat==-1);
    return stat;
}
 
void setup() {
  Serial.begin(9600);
  pinMode(DAT_PIN, INPUT);              //预先设置DAT引脚是INPUT状态
}
 
void loop() {
  uint8_t code;
  code = H3V4F_decode(DAT_PIN, FOREVER); //等待下一个解码字节,按下遥控器时函数返回
  Serial.println(code);                 //串口打印遥控器的按键编码
}

5、测试结果
上传程序后,对模块按动遥控器,可以看见按键解码打印在串口上。
我手头的卷帘门遥控器的四个按键编码分别是:3、12、48、192