一年前我写过一篇博文《自制电脑红外遥控接收器(PC软解码)》,文中介绍借助几个简单的器件通过PC串口,来获取红外遥控器的按键信息。现在我们已经学会了如何用PWM技术驱动智能小车(参见《用PWM驱动智能小车》),正好缺少一个遥控机制,所以本篇文章先介绍一下,.NET Micro Framework开发板如何获取红外遥控信息,下一篇文章将介绍用遥控器驱动智能小车相关实现细节。
这次我们红外接收的硬件电路更为简单,仅需红外接收头、两个电阻,一个电容即可,其原理图如下:
我所选取的具体器件型号如下:
1、100欧电阻
2、18K欧电阻
3、电容104(0.1uF)
4、HS0038A红外接收头
5、电压接入3.3v
实际的器件连接图如下:
以上是红外接收部分,至于红外发送,我想每个家庭基本上都会有电视遥控器(此外还有机顶盒遥控器,DVD遥控器、空调遥控器等等),我的想法是红外接收设备可以接收任何红外遥控器发出的按键信息,这样用户就不需要再采购相关的遥控器设备了。
但是非常困难的是,电视遥控器厂家不同,型号各异,其红外遥控编码更是千差万别,如果一一对其解码,不仅工作量巨大,并且实际操作上不甚可能,因为短时间内也无法获取这些遥控器进行解码测试。
遥控器所发送的功能指令码一般采用多位二进制串行码,其编码规律为:头脉冲、系统码、资料码、资料反码和结束位。头脉冲用做一帧命令的起始位;系统码用于区别不同类的电器;资料码用于完成命令功能。不过这仅仅是一般规律,对有些遥控器适用,对另一类就不适用。
所以综上,我还是借鉴了我一年前所写的那篇文章中的思想,采集红外遥控器的按键特征(高低电平持续时间的集合)来识别红外遥控器按键,这样就绕过了对红外遥控器进行解码的难点,程序只需要比对按键特征就可以识别红外按键(需要预先采集并存储按键特征)。
红外信号采集的底层代码如下:
void IR_GPIO_ISR( GPIO_PIN Pin, BOOL PinState, void* Param )
{
if(!IR_RunFlag)
{
IR_RunFlag = TRUE;
IR_Count = 0;
IR_DataCount=0;
IR_Index = 0;
IR_Time[IR_Index]=0;
IR_PinState = CPU_GPIO_GetPinState(IR_Pin);
CPU_TIMER_Start(IR_Timer);
}
}
void IR_TIMER_ISR(void* param)
{
if(++IR_Time[IR_Index]>100 || IR_Index>250)
{
CPU_TIMER_Stop(IR_Timer);
IR_RunFlag=FALSE;
IR_Count = IR_Index;
if(IR_DataCount==0)
{
memcpy(IR_TimeData,IR_Time,IR_Count);
//GenerateEvent(0xF1,IR_Count); //产生事件
IR_DataCount=IR_Count;
}
return;