“红外发射与接收”的版本间的差异
(→NEC协议) |
(→原理) |
||
第22行: | 第22行: | ||
[[File:advance3_2.jpg|600px|center|thumb]] | [[File:advance3_2.jpg|600px|center|thumb]] | ||
红外接收一体头包含了对红外信号的接收、滤波、放大等处理,能够大幅度介绍外界的干扰,方便的接收红外传输信号。 | 红外接收一体头包含了对红外信号的接收、滤波、放大等处理,能够大幅度介绍外界的干扰,方便的接收红外传输信号。 | ||
− | + | === NEC协议 === | |
下面以NEC协议为例对红外收发的原理进行讲解。 | 下面以NEC协议为例对红外收发的原理进行讲解。 | ||
2015年1月23日 (五) 22:23的版本
目录
目的
红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。本课我们就来学学红外遥控的发射和接收。
设备
Microduino-CoreSTM32是采用 STM32F103CBT6芯片的ARM开发板,采用独特的Upin7接口,大小与一枚一元硬币差不多大,完全兼容Microduino其他扩展模块。
- 其他硬件设备
- 面包板跳线 一盒
- 面包板 一块
- 红外接收头 一个
- 红外发射管(可从家里的旧遥控器中找到) 一个
- USB数据连接线 一根
- 220欧姆电阻 2 个
原理
常用的红外线信号传输协议有ITT协议、NEC协议、Nokia NRC协议、Sharp协议、Philips RC-5协议、Philips RC-6协议,Philips RECS-80协议,以及Sony SIRC协议等。
本课采用一个NEC协议的红外发射遥控器和一个红外一体接收头,做红外的接收解码实验。采用一个红外发射头和一个红外一体接收头做红外的发送实验。
常见的红外发送和接收器如下图所示:
红外接收一体头包含了对红外信号的接收、滤波、放大等处理,能够大幅度介绍外界的干扰,方便的接收红外传输信号。
NEC协议
下面以NEC协议为例对红外收发的原理进行讲解。
NEC编码的一帧(通常按一下遥控器按钮所发送的数据)由引导码(或起始码)、地址码及数据码组成,,如下图所示。
NEC编码有8位地址码、8位命令码;地址码和命令码均传送两次,一次是原码,一次是反码,以确保可靠;PWM(脉冲宽度编码)方式;载波频率38kHz;每一位用时1.12ms或2.25ms。 引导码及数据的定义如下图所示,当一直按住一个按钮的时候,会隔110ms左右发一次引导码(重复),并不带任何数据。
NEC协议采用PWM编码,每个脉冲宽560μs,载波频率38kHz(约21个周期)。逻辑“1”需时2.25ms,逻辑“0”需时1.12ms。NEC协议的“0”和“1”的表示方法如上图所示。推荐的载波占空比为1/4或1/3。
实验一
红外接收
红外接收的实验的接线其实很简单,如上图所示。红外接收头凸出的一面朝向自己,最右边的引脚VCC接Microduino-CoreSTM32的VCC,中间的引脚GND接Microduino-CoreSTM32的GND,最左边的引脚OUT接Microduino-CoreSTM32的D8引脚。
注意:接线要仔细,不能接反,接反很容易把元器件烧坏。
程序
#include "IRremote.h"
#define Serial SerialUSB
int RECV_PIN = 8;
IRrecv irrecv(RECV_PIN);
IRsend irsend;
decode_results results;
// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
void dump(decode_results *results)
{
int count = results->rawlen;
if (results->decode_type == UNKNOWN)
{
Serial.print("Unknown encoding: ");
}
else if (results->decode_type == NEC)
{
Serial.print("Decoded NEC: ");
}
else if (results->decode_type == SONY)
{
Serial.print("Decoded SONY: ");
}
else if (results->decode_type == RC5)
{
Serial.print("Decoded RC5: ");
}
else if (results->decode_type == RC6)
{
Serial.print("Decoded RC6: ");
}
else if (results->decode_type == PANASONIC)
{
Serial.print("Decoded PANASONIC - Address: ");
Serial.print(results->panasonicAddress,HEX);
Serial.print(" Value: ");
}
else if (results->decode_type == JVC)
{
Serial.print("Decoded JVC: ");
}
Serial.print(results->decode_type, HEX);
Serial.print(results->value, HEX);
Serial.print(" (");
Serial.print(results->bits, DEC);
Serial.println(" bits)");
Serial.print("Raw (");
Serial.print(count, DEC);
Serial.print("): ");
for (int i = 0; i < count; i++)
{
if ((i % 2) == 1)
{
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
}
else
{
Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
}
Serial.print(" ");
}
Serial.println("");
}
void setup()
{
irrecv.enableIRIn(); // Start the receiver
}
void loop()
{
if (irrecv.decode(&results))
{
// Serial.print(results.decode_type, HEX);
// Serial.println(results.value, HEX);
dump(&results);
irrecv.resume(); // Receive the next value
}
delay(1000);
}
程序说明: 程序需要用到IRremote库,下载地址:
- 红外接收引脚定义为Microduino-CoreSTM32的8号引脚。
- dump(decode_results *results) 函数用来判断接收到的红外码属于哪种传输协议(NEC、SONY、RC5、RC6、PANASONIC、JVC还是非协议码)。
调试
步骤一:接好电路图。
步骤二:下载IRremote库,解压到Maple IDE安装文件夹目录下的libraries文件夹中。 步骤三:拷贝实验一源代码到Maple IDE中,编译,下载。 步骤四:下载完成后,打开串口监视界面。 步骤五:用红外发射遥控把的发射头对准红外接收头,并按下遥控器上不同的按键,观察串口监视界面的变化。
结果
按遥控器上不同的按键后,串口监视界面会显示不同的按键信号,下图是分别按下1、2、3、4、5、6、7、8、9、0后收到的32位数据。