红外遥控

红外遥控简介

红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。

由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以,在设计红外线遥控器时,不必要像无线电遥控器那样,每套(发射器和接收器)要有不同的遥控频率或编码(否则,就会隔墙控制或干扰邻居的家用电器),所以同类产品的红外线遥控器,可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。这对于大批量生产以及在家用电器上普及红外线遥控提供了极大的方面。由于红外线为不可见光,因此对环境影响很小,再由红外光波动波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电器,也不会影响临近的无线电设备。

红外遥控的编码目前广泛使用的是:NEC Protocol 的 PWM(脉冲宽度调制)和 Philips RC-5 Protocol的 PPM(脉冲位置调制)。我使用的的遥控器使用的是NEC 协议,其特征如下:

  1. 8位地址和8位指令长度;

  2. 地址和命令2次传输(确保可靠性);

  3. PWM脉冲位置调制,以发射红外载波的占空比代表“ 0”和“ 1”;

  4. 载波频率为38Khz;

  5. 位时间为1.125ms或2.25ms;

NEC 码的位定义:一个脉冲对应560us的连续载波,一个逻辑 1 传输需要2.25ms(560us 脉冲+1680us 低电平),一个逻辑0的传输需要 1.125ms(560us 脉冲+560us 低电平)。而遥控接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样,我们在接收头端收到的信号为:逻辑1应该是560us低+1680us高,逻辑0应该是560us低+560us高。

NEC 遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。同步码由一个9ms的低电平和一个4.5ms的高电平组成,地址码、地址反码、控制码、控制反码均是8位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性(可用于校验)。

1. ENC 协议的时序图

41b2f7fdada4b7c4cb67798e86a56487.jpeg

ENC特点如下:
1),协议规定低位首先发送。一串信息首先发送9ms的AGC(自动增益控制)的高脉冲,接着发送4.5ms的起始低电平,接下来是发送四个字节的地址码和命令码,这四个字节分别为:地址码;地址码反码;命令码;命令码反码。
2),如果你一直按那个按键,一串信息也只能发送一次,一直按着,发送的则是以110ms为周期的重复码。
3),接收到的信号是跟发送信号正好反向的。

2.重复码的格式

3f3a23b59665fcd65888620acc5bb302.jpeg

重复码的格式是由9ms的AGC高电平和4.5ms的低电平及一个560us的高电平组成。

3.逻辑“1”的表示

d66f7bd7e8bb756f6f3ae5024645f9f6.jpeg

逻辑1的是由560us的高电平和1.69ms的低电平组成的脉冲表示。

4.逻辑“0”的表示

bb988cdcb92e1fecc10262366a5ddf67.jpeg

逻辑0的是有560us的高电平和565us的低电平组成的脉冲表示。

5.ENC的解码过程

一般ENC的解码过程为:

1),产生下降沿,进入外部中断15的中断函数,延时一下之后检测IO口是否还是低电平,是就等待9ms的低电平过去。

2),等待完9ms低电平过去,再去等待4.5ms的高电平过去。

3),接着开始接收传送的4组数据

①先等待560us的低电平过去
②检测高电平的持续时间,如果超过1.12ms那么是高电平(高电平的的持续时间为1.69ms,低电平的持续时间为565us。

4),检测接收到的数据和数据的反码进行比较,是否等到的数据是一样的。

afef12c1c3d1b8555935159a258737db.jpeg

6,下面直接写驱动程序

#include <linux/init.h>
#include <linux/module.h>
#include <linux/gpio.h>
#include <linux/interrupt.h>
#include <linux/ktime.h>#include <mach/gpio.h>#define IRDA_GPIO   EXYNOS4_GPX3(2)int flag = 0;               // 表示数据帧的开始
int num = 0;                // 表示数据帧里的第几位数据
static long long prev = 0;  // 64bit,记录上次的时间
unsigned int times[40];     // 记录每位数据的时间irqreturn_t 
infrared_irq_handler(int irqno, void *dev_id)
{long long now = ktime_to_us(ktime_get());unsigned int offset;int i, j, tmp;if(!flag){  // 数据开始flag = 1;prev = now;return IRQ_HANDLED;}offset = now - prev;prev = now;if((offset > 13000) && (offset < 14000)){   // 判断是否收到引导码num = 0;return IRQ_HANDLED;}if(num < 32)times[num++] = offset;if(num >= 32){for(i = 0; i < 4; i++){ // 一共4个字节tmp = 0;for(j = 0; j < 8; j++){if(times[i * 8 + j] > 2000) // 如果数据位的信号周期大于20ms,则是二进制数据1tmp |= 1 << j;}printk("%02x ", tmp);}printk("\n");flag = 0;}return IRQ_HANDLED;
}static void __exit
infrared_drv_exit(void)
{free_irq(gpio_to_irq(IRDA_GPIO), NULL);
}static int __init
infrared_drv_init(void)
{int ret = -1;ret = request_irq(gpio_to_irq(IRDA_GPIO), infrared_irq_handler, IRQF_TRIGGER_FALLING, "infrared", NULL);if(ret < 0){printk("request irq failed !\n");return ret;}return 0;
}module_init(infrared_drv_init);
module_exit(infrared_drv_exit);MODULE_LICENSE("GPL");

还有对应的Makefile:

#指定内核源码路径
KERNEL_DIR = /home/george/1702/exynos/linux-3.5#指定当前路径
CUR_DIR = $(shell pwd)#MYAPP = dht11_app
MODULE = IRDA_for_irqall:make -C $(KERNEL_DIR) M=$(CUR_DIR) modules
# arm-none-linux-gnueabi-gcc -o $(MYAPP) $(MYAPP).c
clean:make -C $(KERNEL_DIR) M=$(CUR_DIR) clean$(RM) $(MYAPP)
install:cp -raf *.ko $(MYAPP) /home/george/1702/exynos/filesystem/1702#指定编译当前目录下那个源文件
obj-m = $(MODULE).o

编译生成.ko文件之后,装载,然后进行实物测试,验证效果图如下:

6555534cad96d772fa683753087f6e59.jpeg

c72bc9fea2c7f1e0583667f51188b12f.jpeg

a6eb10eb523009e92e9763e118478f9e.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用jQuery Mobile移动开发框架将博客网站快速转化为Mobile网站

日期&#xff1a;2012-7-12 来源&#xff1a;GBin1.com 在线演示 jQuery Mobile是一个非常不错的移动端网站应用的解决方案&#xff0c;很多网站都使用jQuery Mobile来生成Mobile手机端的移动网站应用&#xff0c;在过去的GBin1博客文章中&#xff0c;我们曾经使用jQuery Mob…

NVLink技术及影响解析

1繁华的背面 最新GPU架构Pascal&#xff0c;能自己开上舞台的Audi A7&#xff0c;超过700名与会专家学者及技术人员&#xff0c;近百场学术会议和科研分享&#xff0c;连续两晚的happy hour、酒会和GTC Party……在一片喧嚣和欢乐当中&#xff0c;2014年度的GTC大会降下了帷幕。…

2022年结束了

在去年这个时候&#xff0c;我刚好也写了一篇这样的文章。再往前是2020年的总结年终了&#xff0c;肿一下斗转星移&#xff0c;我的这个公众号也陪伴着我经过了4年的时间&#xff0c;明年后&#xff0c;我也正式进入35岁程序员的行列&#xff0c;随时会受到命运对我的锤炼。庆幸…

STL容器之deque

双端队列&#xff1b;序列式容器(deque/vector)&#xff1b;底层分段连续 支持从双端进行插入和删除&#xff1b; 综合了vector和list的优点&#xff1b; 插入、删除、查找的平均时间复杂度都是O(1) 部分deque的操作如下&#xff1a; #include <stdlib.h> #include …

varnish-cache使用

Varnish Cache是一个web加速软件&#xff0c;用作web服务加速的反向代理&#xff0c;与Squid不同的是它建立在较新的系统内核调用上&#xff0c;并且主要是使用内存作为缓存&#xff0c;它现有的使用者有facebook等&#xff0c;据使用者反馈&#xff0c;其与Squid相比&#xff…

2020年文章汇总

据悉&#xff0c;深圳某工程师沦为C语言笔试枪手修改cmdline 把内存改成512MB上拉电阻的作用剖析C语言是如何画出这样的三角形的c语言画谢宾斯基三角形Linux字符设备驱动实例哦&#xff0c;这是桶排序回答一个微信好友的创业问题Linux-C编程 / 多线程 / 如何终止某个线程&#…

2018年文章汇总

Android ANR 实例分析Linux kernel计算某段代码运行时间Linux Kernel 发展和内核特点C/C函数指针与指针函数(二)老王带你理解算法复杂度O(1),O(N),O(N^2)Android NDK Tombstone/Crash 分析堆和栈的区别&#xff08;转过无数次的文章&#xff09;C语言scanf-周末杂想C语言-scanf…

Angular CLI的简单使用(1)

参考地址: https://v2.angular.cn/docs/ts/latest/cli-quickstart.html Angular CLI是一个命令行界面工具&#xff0c;它可以创建项目、添加文件以及执行一大堆开发任务&#xff0c;比如测试、打包和发布。 1. 请先在终端/控制台窗口中运行命令 node -v 和 npm -v, 如下图,没有…

在没有数据集的情况下使用数据表

使用数据适配器填充数据表 View Code using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SqlClient;namespace PopDataTable {class Program{static void Main(string[] args){string connString…

2019年文章汇总

要不要去培训机构深造一下&#xff1f;我一个37岁的程序员朋友Linux内核中的GPIO系统整理的免费资料&#xff0c;帮你年后跳槽C语言&#xff0c;字符串指针做函数参数书籍推荐过年回家抢票攻略C语言&#xff0c;函数不可返回指向栈内存的指针你还会写这段C51程序吗&#xff1f;…

linux下修改max_user_processes和open_file的最大值

从事分布式服务器开发工作的都会遇到&#xff0c;linux下open_file的值默认是1024&#xff1b;max user processes的值默认是4096&#xff0c;在实际用于中&#xff0c;这两个值严重不足&#xff0c;常常需要调整这两个值。默认配置如下&#xff1a; 可以通过以下两种方式修改&…

IP SLA的路径控制

一、定义SLA 服务水平协议&#xff08;简称&#xff1a;SLA&#xff0c;全称&#xff1a;service level agreement&#xff09;是在一定开销下为保障服务的性能和可靠性&#xff0c;服务提供商与用户间定义的一种双方认可的协定。通常这个开销是驱动提供服务质量的主要因素。简…

【linux】linux系统中常见配置文件及目录说明

1.配置文件/proc/sys/fs/file-nr 里文件里显示三个数字 [rootlocalhost logs]# cat /proc/sys/fs/file-nr 2112 0 2100000已分配文件句柄的数目 已使用文件句柄的数目 文件句柄的最大数目 上面第二项的值为0表示分配的文件…

ptmalloc,tcmalloc和jemalloc内存分配策略研究

转载&#xff1a;https://cloud.tencent.com/developer/article/1173720 操作系统内存布局 各种malloc的内存分配管理方式离不开操作系统的内存布局策略。 32位经典内存布局 32位系统下经典内存布局如上&#xff0c;程序起始的1GB地址为内核空间&#xff0c;接下来是向下增长…

Tcmalloc

Tcmalloc Ptmalloc在性能上还是存在一些问题的&#xff0c;比如不同分配区&#xff08;arena&#xff09;的内存不能交替使用&#xff0c;比如每个内存块分配都要浪费8字节内存等等&#xff0c;所以一般倾向于使用第三方的malloc。 Tcmalloc是Google gperftools里的组件之一。…

JVM自动内存管理机制——Java内存区域(下)

一、虚拟机参数配置 在上一篇《Java自动内存管理机制——Java内存区域&#xff08;上&#xff09;》中介绍了有关的基础知识&#xff0c;这一篇主要是通过一些示例来了解有关虚拟机参数的配置。 1、Java堆参数设置 a&#xff09;下面是一些简单的使用参数 其中最后一个是一个运…

PHP版选择排序法

2019独角兽企业重金招聘Python工程师标准>>> <?php// 选择排序法函数function selection_sort(&$array) {$array_length count($array); // 数组的长度$temp 0; // 交换时用到的临时变量for ($i 0; $i < $array_length - 1; $i) {// 认为数组第$i个元…

boost::stable_vector简单解析

由于vector底层实现的机制是一个动态数组&#xff0c;因此使用std::vector<T>时&#xff0c;如果海量数据量时&#xff0c;会导致vector底层的数组很大很大&#xff0c;这样就会导致database很快就会出现内存不足而导致系统停止运行或卡住&#xff0c;这时就要考虑是否用…

理解zookeeper选举机制

转载&#xff1a;https://www.cnblogs.com/shuaiandjun/p/9383655.html 一、zookeeper集群 配置多个实例共同构成一个集群对外提供服务以达到水平扩展的目的&#xff0c;每个服务器上的数据是相同的&#xff0c;每一个服务器均可以对外提供读和写的服务&#xff0c;这点和red…

使用交互环境

使用交互环境许多脚本语言的解释器都提供了交互环境&#xff0c;我们可通过此环境与计算机沟通交流。为什么叫做交互环境&#xff1f;因为我们在这里通过编程语言与计算机沟通&#xff0c;让它做任何事情&#xff0c;它都会立刻照办并给予我们反馈。运行REBOL 解释器的方式很简…