Digispark红外接收器

一、红外协议之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 = 2; //Sensor pin connect to digital pin2 (ATINY85 pin7)
int start_bit = 2200; //Start bit threshold (Microseconds)
int bin_1 = 1000; //Binary 1 threshold (Microseconds)
int bin_0 = 400; //Binary 0 threshold (Microseconds)
const byte BIT_PER_BLOCK = 32;

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(0);

  int key = getIRKey();        //Fetch the key

  if(key != 0) //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 = 0 ; i < BIT_PER_BLOCK ; i++)
    data[i] = pulseIn(irPin, HIGH); //Start measuring bits, I only want HIGH pulses

  delay(100);  

  //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 = 0 ; i < BIT_PER_BLOCK ; i++) //Parse them
  {
    if(data[i] > bin_1) //is it a 1?
      data[i] = 1;
    else if(data[i] > bin_0) //is it a 0?
      data[i] = 0;
    else
      return -1; //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 = 0;
  for(i = 16 ; i < 24; i++) {
    DigiKeyboard.print(data[i]); //print out the value of button in binary form
    if(data[i] == 1) result |= (1<<i-16);
  }
  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

int irPin = 2; //Sensor pin connect to digital pin2 (ATINY85 pin7)
int start_bit = 2200; //Start bit threshold (Microseconds)
int bin_1 = 1000; //Binary 1 threshold (Microseconds)
int bin_0 = 400; //Binary 0 threshold (Microseconds)
const byte BIT_PER_BLOCK = 32;

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(0);

  int key = getIRKey();        //Fetch the key

  if(key != 0) //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 12: DigiKeyboard.println("1"); break;
      case 24: DigiKeyboard.println("2"); break;
      case 94: DigiKeyboard.println("3"); break;
      case 8: DigiKeyboard.println("4"); break;
      case 28: DigiKeyboard.println("5"); break;
      case 90: DigiKeyboard.println("6"); break;
      case 66: DigiKeyboard.println("7"); break;
      case 82: DigiKeyboard.println("8"); break;
      case 74: DigiKeyboard.println("9"); break;
      case 22: DigiKeyboard.println("0"); break;
      case 68: DigiKeyboard.sendKeyStroke(KEY_SPACE); break;//can stop or continue
      case  7: DigiKeyboard.sendKeyStroke(KEY_ENTER); break; //
      case  69: DigiKeyboard.sendKeyStroke(KEY_ESCAPE); break; //
      case 81: DigiKeyboard.sendKeyStroke(KEY_HOME); break;
      case 21: DigiKeyboard.sendKeyStroke(KEY_LEFT_ARROW); break;//
      case 9: DigiKeyboard.sendKeyStroke(KEY_RIGHT_ARROW); break;//
      case 64: DigiKeyboard.sendKeyStroke(KEY_DOWN_ARROW); break;  //
      case 67: DigiKeyboard.sendKeyStroke(KEY_UP_ARROW); break;    //
    }
  }
}

/////////////////////////////////////////////////////////////
// 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 = 0 ; i < BIT_PER_BLOCK ; i++)
    data[i] = pulseIn(irPin, HIGH); //Start measuring bits, I only want HIGH pulses

  delay(100);
  for(i = 0 ; i < BIT_PER_BLOCK ; i++) //Parse them
  {
    if(data[i] > bin_1) //is it a 1?
      data[i] = 1;
    else if(data[i] > bin_0) //is it a 0?
      data[i] = 0;
    else
      return -1; //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 = 0;
  for(i = 16 ; i < 24; i++) {
    //DigiKeyboard.print(data[i]); //print out the value of button in binary form
    if(data[i] == 1) result |= (1<<i-16);// 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!

时间: 2024-08-27 00:05:26

Digispark红外接收器的相关文章

Digispark kickstarter + JoyStick 模拟鼠标

IDE:Arduino 1.0.4 一.线路连接 S-Y --> P5(A0) S-X --> P2(A1) S-K --> P0 VCC --> VCC GND --> GND 二.Arduino代码 //from A0 start,the max is 1023 ,the max Vol is 5V //A0 ==> P5 //from 470 begin ,less this can't working //A1 ==> P2 //A2 ==> P4

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

前几天无聊就弄了弄这个玩,网上教程可能有点杂,在这里就总结一下. Digispark开发板(也就是badusb)能干什么,自己搜去,/坏笑. 1.准备材料:Attiny85微型 USB接口开发板 Digispark kickstarter扩展板开发板(淘宝上9 RMB左右,我自己在这里购买的:点击进入,自己斟酌哪里购买) 这个可以直接连接电脑的USB接口. 2.接着安装Arduino IDE来配置环境. 各版本下载链接:https://pan.baidu.com/s/1T7OetboNNUneK

时钟+温度+遥控设置,综合时钟例子

时钟+温度+遥控设置,综合时钟例子6月30日到手的二手单片机开发板,今天做个综合的时钟例子,包含代码和仿真.做个近期的学习总结. 按独立键盘K1和红外遥控的EQ为设置键.按独立键盘K2和红外遥控的VOL+为加键.按独立键盘K3和红外遥控的VOL-为减键. 手摸温度传感器,当温度超过 34℃ 的时候点亮LED灯,模拟启动的设备. 程序有很多细节没有优化,主要是学习,lcd1602显示,独立建扫描,红外遥控,ds1302时钟芯片,ds18b20温度传感器. 实时时钟综合应用,源代码和仿真下载http

microduino实现红外线发送与接收

一.目标:使用microduino套件实现红外线的发送与接收 二.材料:(1)模块:Microduino Core/Core+ (核心板),Microduino-USBTTL(下载程序) (2)传感器:红外线发射器,红外线接收器 (3)其它设备:Micro-USB线,面包板,导线 - 红外线发射器使用说明: 目前的红外发射器有两种规格,两脚的(左图)和三脚的(右图) 两脚的结构和普通LED管相似,长引脚接高电平,短引脚接低电平 三脚的连接情况分别是:5V,OUT,GND,其中OUT是指定的输出端

IRM3800 红外遥控器解码 linux驱动

这一次还是接在 Cemera 上.用 中断引脚 EINT20 也就是 GPG12. 之前焊的 51 板子上有一个红外接收器. 请注意了,是 标准的 NEC 码规范:首次发送的是9ms的高电平脉冲,其后是4.5ms的低电平,接下来就是8bit的地址码(从低有效位开始发),而后是8bit的地址码的反码(主要是用于校验是否出错).然后是8bit 的命令码(也是从低有效位开始发),而后也是8bit 的命令码的反码.其"0"为载波发射0.56ms,不发射0.565ms,其"1"

怪兽z主机豪华版 答问。

我的淘宝店里,怪兽z主机标准版,分经济版本,标准版,豪华版,三个版本.这里给大家详细介绍一下豪华版的概况. 淘宝购买地址:http://item.taobao.com/item.htm?id=38184610493   价格为2799. 详细配置为AMD 6700处理器+映泰Hi-FiA88S3E主板+金泰克s500 60G SSD硬盘+1TB SATA3 HDD硬盘+ 8GB 金士顿骇客游戏内存条+金河田翼扬2082机箱. 赠品为 HDMI数据线+300mb独立wifi网卡+映泰遥控器. 一.

树莓派的kodi设置遥控器的方法

首先你需要买一个红外接收器,根据卖家的文档,插到树莓派的GPIO串口上, 我的红外接收器是18入口,17出口, 所以我的config.txt文件设置如下 dtoverlay=lirc-rpi,gpio_in_pin=18,gpio_out_pin=17 硬件安装好,并且config.txt文件设置好后,插上TF卡,开机, 开机后,进入主界面的菜单最下方,找到[My OSMC]进入后, 选择树莓派[Hardware Support]选择开启[Enable LIRC GPIO support]开启红

风扇控制系统--最终版

简要描述: 硬件线路连接=>硬件编程=>软件编程 实现功能 : 1.红外线遥控板 控制风扇开关 挡速 2.液晶显示器 显示风扇的工作情况 3.客户端 显示风扇工作情况 4.开启风扇时 记录上次的挡速关键技术:         1.硬件中断         2.红外线通信         3.串口通信         4.FALSE存储 硬件截图:   客户端软件截图:   硬件编程源码: /****************************************************

Mixtile LOFT

日前,国内电子原型类开发团队Mixtile(深圳致趣科技)新推出的 Mixtile LOFT套件,受到业内著名的海外科技网站CNXSoft的关注和报道. 如果要阅读相关的原文报道,可点击这里.下面摘录“雷科技”的翻译稿子(稍微做了一些调整): 随着全志芯片不断发展,市面上有不少开发板子用的是他们A20的芯片,比如Cubieboard2,A20-OLinuXino,IBOX等.除去 一些常见的消费类电子(平板和机顶盒等),我们甚少看到全志A31芯片的影子.得益于来自中国深圳的 Mixtile LO