用Arduino来远程控制电源开关和车库门
此项目制作人为liwenyip,请点击这里查看原帖。来自DFRobot英文网站,转载需私信授权。在这次教程中,我会给大家展示怎样使用Arduino来解码RF遥控器信号以及重新发送这些信号来远程控制电源开关和车库门。
注意:本指南仅为澳大利亚用户编写的,因为在澳大利亚使用433MHz波段的小功率设备 (25mW) 是合法的,无需许可证。学习本教程前,请先确认在你们国家使用哪些设备是合法的。在遵守功率限制规定的前提下,如果你(或以相同的频率)向在你们国家购买的车库门遥控开关/遥控玩具等发送信号,效果应该会很好。
第1步:所需设备
[*]Arduino – 我用的是 Arduino Uno Rev3。
[*]433.92Mhz RF发射器和接收器对 - 我是在易趣购买的,价格非常便宜,仅$1.45:
[*]发射器型号:MX-FS-03V(标记XD-FST)
[*]接收器型号:MX-05V(标记XD-RF-5V)
[*]它们工作正常 – 主要问题是没有可用数据表或文件。一些基本配置可在hobbycomponents.com购买,仅此而已。相似模块也应能从你们当地的电子产品商店购买,比如Jaycar。
[*]面包板和跳线 – 也可从易趣或Jaycar购买。
[*]遥控开关
[*]遥控车库门,和/或:
[*]某些遥控电源开关。我的是“PowerTran”,型号为A0342。
[*]对Arduino和C++的基本了解
第2步:将发射器和接收器连接到Arduino
维基百科中可查阅遥控开关的发射器和接收器的连接图。
第3步:确定遥控器
大多数RF控制设备都应使用遥控开关,除非你希望能拆开遥控器并检查编码器芯片组是否在兼容芯片组清单中。
我有两个遥控器,其中一个用于车库门(EV1527芯片组),另一个用于RC电源开关(LX2262A-R4芯片组)。
第4步:解码遥控器信号
遥控开关针对某些本地支持设备内置了发送代码的功能,如果你有这种设备(我没有),可跳过这一步。
打开遥控开关“ReceiveDemo_Advanced”示意图。上传示意图并打开串口监视器。使你的遥控器靠近接收器模块并按下按钮。Arduino应能解码信号并打印串口监视器结果。图中是我按下按钮并打开频道5时从遥控电源开关得到的。
Decimal: 3932352 (24Bit)
Binary: 001111000000000011000000
Tri-State: 011000001000
PulseLength: 232 microseconds
Protocol: 1
Raw data: 7244,232,692,124,792,592,328,596,324,596,328,596,324,140,784,144,788,120,792,136,780,136,788,140,788,128,784,144,796,124,780,140,784,596,336,588,968,96,36,104,908,132,1412,68,248,64,28,484,56,
The LX2262A-R4 uses a 12 tri-state bit codeword comprising 8 address bits followed by 4 data bits. For the tri-state codeword above – 011000001000 - the address is 01100000 (channel 5) and the data/command is 1000 (turn on).
My mains switches can have up to 8 addresses with a separate on and off command for each. By pressing every button and decoding the signals I worked out the codes for all the addresses and commands:
Address Bits: 8
Channel 1 = 01110000
Channel 2 = 00110000
Channel 3 = 01010000
Channel 4 = 00010000
Channel 5 = 01100000
Channel 6 = 00100000
Channel 7 = 01000000
Channel 8 = 00000000
Data Bits: 4
Turn On= 1000
Turn Off = 0000
我怀疑同一厂家&型号的所有设备的地址代码都是相同的,当然如果谁能确认,请告诉我。
我的车库门遥控器中的EV1527芯片组使用24位代码,由20位地址和4位数字组成。我从车库门遥控器获得的代码是:
Button 1:
Decimal: 8571080 (24Bit)
Binary: 100000101100100011001000
Tri-State: not applicable
PulseLength: 321 microseconds
Protocol: 1
Raw data: 9964,956,332,312,976,312,976,308,980,304,980,308,980,952,340,304,980,956,336,188,908,276,728,264,124,168,308,60,24,60,236,88,88,204,88,76,80,56,1020,284,440,56,24,40,100,84,12,36,56,
Button Address Data
Button 1: 10000010110010001100 1000
Button 2: 10000010110010001100 0100
Button 3: 10000010110010001100 0010
Button 4: 10000010110010001100 0001
第5步:书写设备代码
遥控开关针对某些本地支持设备内置了发送代码的功能,如果你有这种设备(我没有),应该能使用TypeX示意图中的遥控开关::闭合()和遥控开关::断开()功能。
如果没有,你需要手动设置脉冲长度和通讯协议并且用遥控开关::发送()或遥控开关::发送TriState()功能发送原始代码,如下图所示。
如下代码 – 基于“SendDemo”示意图 – 切换我一个遥控电源开关的通断,1秒1次。注意已经手动设置了脉冲长度,因为与通讯协议1默认脉冲长度不同。我创建了一个“指令()”功能,接受通道数和通/断为整数参数并查找与我的设备相对应的地址和数据指令。对于你的设备,你可创建相似功能或者只是发送原始代码。
#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(321);
// set protocol (default is 1, will work for most outlets)
// mySwitch.setProtocol(2);
// Optional set number of transmission repetitions.
// mySwitch.setRepeatTransmit(15);
pinMode(13,OUTPUT);
}
void loop() {
mySwitch.send("100000101100100011001000");
digitalWrite(13,HIGH);
delay(500);
digitalWrite(13,LOW);
delay(10000);
}
Here is the code which opens and closes my garage door (simulates button 1) every 10 seconds. It also flashes the on-board LED to indicate a command has been sent.
#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(321);
// set protocol (default is 1, will work for most outlets)
// mySwitch.setProtocol(2);
// Optional set number of transmission repetitions.
// mySwitch.setRepeatTransmit(15);
pinMode(13,OUTPUT);
}
void loop() {
mySwitch.send("100000101100100011001000");
digitalWrite(13,HIGH);
delay(500);
digitalWrite(13,LOW);
delay(10000);
}
第6步:开始工作!
第7步:注意
如果没有天线,发射器模块的有效范围似乎只有几米。如需扩大范围,你可在发射器的“ANT”上焊接一段绝缘导线,从而添加一条外部天线。建议长度为1/4波长,即若频率为433MHz,长度约为17cm。
第8步:后续工作和应用
我后续计划要做的事情有:· 添加电视和空调遥控器等红外设备的控制。· 通过网页或手机应用软件来开/关电器、灯具等。· 当我在度假时,按时间表来开关灯具、电视、收音机等,看起来似乎我一直在家。为增加悬念,时间表可能随时变化。· 如果电器&灯具无意中被打开,可自动关闭。· 人们随便打开和关闭他们的车库门。(你不能这样做,这不乖哦。)· 树莓派接口(遥控开关有一个RPi接口)。
[*]https://code.google.com/p/rc-switch/
[*]http://aitendo3.sakura.ne.jp/aitendo_data/product_img/wireless/315MHz-2012/RX315-HT48R/EV1527.pdf
[*]http://en.chiptrue.com/images/LX2262_en.pdf
[*]http://forum.hobbycomponents.com/viewtopic.php?f=39&t=1324
[*]http://blog.sui.li/2011/04/12/163/
[*]http://tinkerman.eldiariblau.net/decoding-433mhz-rf-data-from-wireless-switches-the-data/
[*]http://tinkerman.eldiariblau.net/decoding-433mhz-rf-data-from-wireless-switches/
Project orginially shared by liwenyip via Instructables
涨知识了{:5_121:} 学习了,牛逼了 牛 翻译的不错 牛皮
页:
[1]