一、红外协议之NEC协议原理

NEC协议格式:

首次发送的是9ms的高电平脉冲,其后是4.5ms的低电平,接下来就是8bit的地址码(从低有效位开始发),而后是8bit的地址码的反码(主要是用于校验是否出错)。然后是8bit 的命令码(也是从低有效位开始发),而后也是8bit 的命令码的反码。

/* 以脉宽为低电平0.565ms、间隔高电平0.56ms、周期为1.125ms的组合表示"0"; */

/* 以脉宽为低电平0.565ms、间隔高电平1.685ms、周期为2.25ms的组合表示"1"。 */

二、解码KM-001红外遥控器

平台:Digispark kickstarter 微型 Arduino usb 开发板 ATTINY85

采集到第17个到第24个高电平的脉冲时间如下:

706

1753

1694

674

1694

639

702

571

01101000=>22

#include "DigiKeyboard.h"
int irPin = ; //Sensor pin connect to digital pin2 (ATINY85 pin7)
int start_bit = ; //Start bit threshold (Microseconds)
int bin_1 = ; //Binary 1 threshold (Microseconds)
int bin_0 = ; //Binary 0 threshold (Microseconds)
const byte BIT_PER_BLOCK = ; void setup() {
pinMode(irPin, INPUT);
} void loop() {
DigiKeyboard.update(); //keep on updating the keyboard
// this is generally not necessary but with some older systems it seems to
// prevent missing the first character after a delay:
DigiKeyboard.sendKeyStroke(); int key = getIRKey(); //Fetch the key if(key != ) //Ignore keys that are zero
{
DigiKeyboard.print("=>"); //uncomment this if you want to
DigiKeyboard.println(key); //print out the value of the button
}
} /////////////////////////////////////////////////////////////
// decode infrared signal
/////////////////////////////////////////////////////////////
int getIRKey() {
int data[BIT_PER_BLOCK];
int i;
while(pulseIn(irPin, HIGH) < start_bit); //Wait for a start bit for(i = ; i < BIT_PER_BLOCK ; i++)
data[i] = pulseIn(irPin, HIGH); //Start measuring bits, I only want HIGH pulses delay(); //add by tingpan
/* for(i = 16 ; i < 24; i++) {
DigiKeyboard.println(data[i]); //print out the value of button in binary form
//if(data[i] == 1) result |= (1<<i-16);
} */ for(i = ; i < BIT_PER_BLOCK ; i++) //Parse them
{
if(data[i] > bin_1) //is it a 1?
data[i] = ;
else if(data[i] > bin_0) //is it a 0?
data[i] = ;
else
return -; //Flag the data as invalid; Return -1 on invalid data
}
//based on NEC protocol, command data started from bit 16
//and end with bit 24 (8 bits long)
int result = ;
for(i = ; i < ; i++) {
DigiKeyboard.print(data[i]); //print out the value of button in binary form
if(data[i] == ) result |= (<<i-);
}
return result; //Return key number
}

三、红外控制电脑键盘相关按钮

平台:平台:Digispark kickstarter 微型 Arduino usb 开发板 ATTINY85

代码:

#include "DigiKeyboard.h"
// not all keys are mapped in the DigiKeyboard.h file.
// you have to map it here
#define KEY_HOME 0x4A
#define KEY_PAGE_UP 0x4B
#define KEY_PAGE_DOWN 0x4E
#define KEY_ESCAPE 0x29
#define KEY_UP_ARROW 0x52
#define KEY_DOWN_ARROW 0x51
#define KEY_LEFT_ARROW 0x50
#define KEY_RIGHT_ARROW 0x4F //defined by tingpan
#define KEY_ESC 0x1B
#define KEY_UP 0x26
#define KEY_DOWN 0x28
#define KEY_LEFT 0x25
#define KEY_RIGHT 0x27
#define KEY_LEFT_CLIK 0x01
#define KEY_RIGHT_CLIk 0x02 int irPin = ; //Sensor pin connect to digital pin2 (ATINY85 pin7)
int start_bit = ; //Start bit threshold (Microseconds)
int bin_1 = ; //Binary 1 threshold (Microseconds)
int bin_0 = ; //Binary 0 threshold (Microseconds)
const byte BIT_PER_BLOCK = ; void setup() {
pinMode(irPin, INPUT);
} void loop() {
DigiKeyboard.update(); // keep updating the keyboard
// this is generally not necessary but with some older systems it seems to
// prevent missing the first character after a delay:
DigiKeyboard.sendKeyStroke(); int key = getIRKey(); //Fetch the key if(key != ) //Ignore keys that are zero
{
//DigiKeyboard.print("=>"); //uncomment this if you want to
//DigiKeyboard.println(key); //print out the value of the button switch(key)
{
case : DigiKeyboard.println(""); break;
case : DigiKeyboard.println(""); break;
case : DigiKeyboard.println(""); break;
case : DigiKeyboard.println(""); break;
case : DigiKeyboard.println(""); break;
case : DigiKeyboard.println(""); break;
case : DigiKeyboard.println(""); break;
case : DigiKeyboard.println(""); break;
case : DigiKeyboard.println(""); break;
case : DigiKeyboard.println(""); break;
case : DigiKeyboard.sendKeyStroke(KEY_SPACE); break;//can stop or continue
case : DigiKeyboard.sendKeyStroke(KEY_ENTER); break; // enter
case : DigiKeyboard.sendKeyStroke(KEY_ESC); break; //can't use
case : DigiKeyboard.sendKeyStroke(KEY_HOME); break; //Mode
case : DigiKeyboard.sendKeyStroke(KEY_LEFT_ARROW); break;// <--
case : DigiKeyboard.sendKeyStroke(KEY_RIGHT_ARROW); break;//-->
case : DigiKeyboard.sendKeyStroke(KEY_DOWN_ARROW); break; //down
case : DigiKeyboard.sendKeyStroke(KEY_UP_ARROW); break; //up
case : DigiKeyboard.sendKeyStroke(KEY_LEFT_CLIK); break; //can't use
case : DigiKeyboard.sendKeyStroke(KEY_RIGHT_CLIk); break; //can't use }
}
} /////////////////////////////////////////////////////////////
// decode infrared signal
/////////////////////////////////////////////////////////////
int getIRKey() {
int data[BIT_PER_BLOCK];
int i;
while(pulseIn(irPin, HIGH) < start_bit); //Wait for a start bit for(i = ; i < BIT_PER_BLOCK ; i++)
data[i] = pulseIn(irPin, HIGH); //Start measuring bits, I only want HIGH pulses delay();
for(i = ; i < BIT_PER_BLOCK ; i++) //Parse them
{
if(data[i] > bin_1) //is it a 1?
data[i] = ;
else if(data[i] > bin_0) //is it a 0?
data[i] = ;
else
return -; //Flag the data as invalid; Return -1 on invalid data
} //based on NEC protocol, command data started from bit 16
//and end with bit 24 (8 bits long)
int result = ;
for(i = ; i < ; i++) {
//DigiKeyboard.print(data[i]); //print out the value of button in binary form
if(data[i] == ) result |= (<<i-);// convert="" data="" bits="" to="" integer
}
return result; //Return key number
}

参考:

STC的51单片机红外遥控器读码、发射程序,已试成功 - 第1页 - wxleasyland's Blog - EDN China电子设计技术

红外协议之NEC协议_Linux教程_Linux公社-Linux系统门户网站

Digispark红外接收器 - Powered by Discuz!

Digispark红外接收器的更多相关文章

  1. Digispark kickstarter + JoyStick 模拟鼠标

    IDE:Arduino 1.0.4 一.线路连接 S-Y --> P5(A0) S-X --> P2(A1) S-K --> P0 VCC --> VCC GND --> ...

  2. Digispark(ATTINY85) 微型开发板驱动安装与开发环境配置教程

    前几天无聊就弄了弄这个玩,网上教程可能有点杂,在这里就总结一下. Digispark开发板(也就是badusb)能干什么,自己搜去,/坏笑. 1.准备材料:Attiny85微型 USB接口开发板 Di ...

  3. TI CC2541的狗日的Key

    被突如其来的一个bug困扰了好几天, 起因是, 按键接的红外接收器, 结果发现, 一旦按下之后, IEN1, P0IE的标识位bit5, 被不知道特么的谁归0了, 也就是说, 按键只能被按下一次, 再 ...

  4. arduino 红外遥控器控制LED灯

    /* 日期:2016.9.1 功能:红外遥控器控制LED灯 开,关,闪烁,呼吸 元件: 跳线公公头 * 5 led 220欧电阻 红外接收管,红外遥控 接线: 红外灯面向自己从左到右分别接 IO3 , ...

  5. !!!全球最流行开源硬件平台!不知道就OUT了!

    全球最流行的几个开源硬件平台!不知道就OUT了! 随着物联网的推广和普及,五年内全球会有200亿台智能设备的需求,而如今随着创客概念的兴起,开源硬件也越加的火热,让我们来看看现在都有哪些主流的开源硬件 ...

  6. Arduino红外遥控系列教程2013——发射与接收

    教程一:红外接收教程本教程共四步操作,将教大家如何收集电视红外遥控器的编码 视频链接:http://v.youku.com/v_show/id_XNTE2NjQ5NTcy.html 第一步:电路连接, ...

  7. 怪兽z主机豪华版 答问。

    我的淘宝店里,怪兽z主机标准版,分经济版本,标准版,豪华版,三个版本.这里给大家详细介绍一下豪华版的概况. 淘宝购买地址:http://item.taobao.com/item.htm?id=3818 ...

  8. 使用 Windows Media Center 远程控制

    http://windows.microsoft.com/en-us/windows/getting-started-windows-media-center#getting-started-wind ...

  9. 使用 Media Center 遥控器(Windows Vista Premium)

    本文适用于安装了 Windows Vista Premium 并附带遥控器的 HP 和 Compaq 台式电脑. 本文简要介绍了三种Windows Media Center 遥控器上每个按钮的功能. ...

随机推荐

  1. dom cookie记录用户名

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  2. QueryInterface

    QueryInterface IUnknown *p2; hr = pInnerUnknown->QueryInterface(vGUID2, (void**)&p2); IUnknow ...

  3. Php最近1个月总结

    1.数据库方面太薄弱. 2.对于Php性能的调优也没有用到很专业的工具. 3.大型网站的架构也没有一个概念,需要细致的了解.

  4. windows2003服务器不显示桌面怎么办

    ctrl +alt+delete 进入任务管理器应用程序里 创建新任务 C:\WINDOWS\explorer.exe 运行就行

  5. HTML超出文本多行截取代码

    HTML超出文本多行截取代码如下: HTML: <div class="sytm-text-1">      <p>           沈阳网页制作公司有 ...

  6. myeclipse搭建svn插件

    在网上查了一下,安装的方法有几种,这里给大家推荐一种快速安装的方法. //第一步 : 下载 site-1.6.5.zip //===================================== ...

  7. 王者荣耀交流协会final发布-第3次scrum立会

    1.例会照片 成员高远博,冉华,王磊,王玉玲,任思佳,袁玥出席.拍照的是王磊同学,王超同学因参加比赛不在学校,不能出席. master:任思佳 2.时间跨度 2017年12月3日 18:00 — 18 ...

  8. MAC 开启与关闭SIP

    1. 查看SIP状态 在终端中输入csrutil status,就可以看到是enabled还是disabled. 2. 关闭SIP S1  重启MAC,按住cmd+R直到屏幕上出现苹果的标志和进度条, ...

  9. java中的数据加密1 消息摘要

    消息摘要(Message Digest) 又称为数字摘要(Digital Digest).它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生.如果消息在途中 ...

  10. [UE4]计算机中的数据表示

    一.位:数据的最小单位,一个位仅有两种状态 一个电路,通或断:磁盘上的小磁铁,南极或北极: 使用Bit表示位,百兆带宽,一秒钟可以传输一百兆个bit 二.字节:8个位组成一个字节,一个字节有256种状 ...