树莓派控制红外线收发

上淘宝买了两个红外线模块,一个是接收器,另一个是发送器。

问了卖家,没有资料,但是根据电路板上打印的信息,似乎是标准的模块。于是先插上树莓派试试看。

看宝贝描述,这个模块是给Arduino用的,于是搜索了一下Arduino相关的资料,发现github上有

Arduino-IRremote这个项目,里面有各种协议包括NEC红外协议的实现。

举个例子,代码里面发送NEC的实现:

这里先发送一个头部,然后按比特发送数据,

比特为1发560us的PWM,然后等待1690us

比特位0的时候发送560us的PWM,然后等待560us

最后发送一个560us的PWM结束

手头上有一块树莓派和一个美的空调,所以先用这两个硬件下手,实际上使用STM32会更方便,因为树莓派自带了操作系统,控制硬件没有STM32这种单片机方便。后续准备将程序移植到STM32上面。

解析器

要知道美的空调的编码,首先要做一个解析器。实际上,使用逻辑分析仪也可以得知。一开始并没有拆开遥控器看看,先用IR接收器做了一个解析器。

代码传上去了,见:

https://github.com/tanhangbo/RaspberryIR

做解析器的时候首先要了解红外头的工作原理,首先它里面有一个滤波器,有38K数据的时候输出‘1‘,没有38K数据的时候输出‘0‘。外部供电3.3V。接下来就要对输入的数据进行处理了。

首先对其产生的跳变进行响应,这里就注册了一个中断,INT_EDGE_BOTH表示不论下降沿和上升沿都进行响应,这样就可以采集到数据了:

wiringPiISR(IR_INPUT, INT_EDGE_BOTH, &ir_int)

接下来要对响应做计数。一开始用gettimeofday测试了一下,并不准确,查资料得知树莓派的ARM芯片内部有一个1MHZ的时钟可以用来做计数器。不过因为树莓派有linux操作系统,直接访问时钟地址是不行的。

首先要打开datasheet(网上可以搜到)

BCM2835-ARM-Peripherals.pdf

里面提到了两种timer:

其中System Timer的定义

ARM timer的定义:

看它的描述还是使用System Timer比较好。

首先要知道System Timer的地址。

这里写的是 0x7E003000,但是看图说话(第5页),还是要转换成为0x20003000:

转换好之后就要解决怎么用了。首先想到的就是写一个驱动,不过写驱动需要花一些时间调试,搞不好kernel搞挂了,为了简单一点,这里有一个比较portable的办法,就是使用mmap直接读取/dev/mem的信息。详情见代码。

于是根据这个思路作了一个获取时间间隔的一个API:

long long int get_timer_diff()
{
long long int ret;
ret =  *timer - prev_timer;
prev_timer = *timer;
return ret;
}

这里为什么要用long long?因为这个timer是64bit的。

解析分为三步:1.解析波形,2.解析bit,3.解析Byte

解析完成之后就拿到我需要的东西了。

拿着遥控器对着红外头测试,发现美的空调的格式如下:

0xb2,0x4d,0xf5,0x0a,0xa5,0x5a

接下来查找了网上的资料,发现它的格式实际上是这个样子的:

http://www.geek-workshop.com/thread-5707-1-1.html

发射器

接下来做一个发射器,俗话说,上山容易下山难,编码容易解码难,过了解码这个步骤,编码也挺容易了,不过做发射器的时候还是有一些问题需要考虑的。

做发射器的时候需要打开树莓派的PWM,并且使用1MHZ的时钟做一个API:

void delay_us(int us)
{
long long int prev_timer;
prev_timer = *timer;
while (*timer - prev_timer < us)
;
}
 

这样就可以逐个将数据发送出去了。其中开关PWM的时候发现一个问题,关闭PWM倒是很快,开启PWM有延时。于是在开启之前将关闭PWM的时间缩短解决。如果能直接控制UART,我想可以用UART模拟一样的波形,利用RTS-CTS快速关断,比PWM的效果好。

接下来已经接近成功了,用两个IR模块对测,解析器也能解析出正确的结果,但是空调就是不给面子,一直没反应。于是拆开空调遥控器用逻辑分析仪抓包,同时也用逻辑分析器抓取IR发送器的包,最后调的波形差不多,空调还是没有反应。这个问题后面再看看。

波形

抓到的遥控器波形(管脚端),手工查看,得知:

0110010 01001101 00011111 11100000 01001000 10110111L (同一个波形发两次)

第一个bit是MSB:

B2 4D 1F E0 48 B7

屏幕上显示的是24度,和前面提到的资料一致。

遥控器的波形并不完美,我自己产生的波形完美的多,不知道为什么对遥控器没有效果,

时间: 2024-10-12 04:03:45

树莓派控制红外线收发的相关文章

极客大讲堂:手把手教你用树莓派控制红绿灯

涉及硬件:树莓派以及相关套件.LED红绿灯 涉及知识:电路实验板.CanaKit 当准备好以上,我们就可以开始啦.使用树莓派进行LED原型控制. 首先要明白的是,接入所有的电线.电阻器以及工具包附带的指示灯需要谨慎操作,毕竟如果你设置操作不当将有可能损坏你的硬件. 为了简化与树莓派和LED的接触,也为了方便编写控制代码,我决定编写一个叫做Pi交通灯的小玩意,这是用树莓派控制LED的第一步. 有了这个“红绿灯”之后,你要做的就只是把这个小装置直接插到树莓派的GPIO接口上.你不需要担心连接到线路板

利用树莓派控制步进电机——C语言

电路连接方式请看另一篇博文:[利用树莓派控制步进电机--pythony语言] /****************************************************** * File name: stepMotor.c * Author: Jason Dai * Date: 2015/01/26 ******************************************************/ #include <wiringPi.h> #include <

编写NDIS驱动,完全控制网卡收发报文

在windows上面,利用网卡做自定义报文的收发,Winpcap是唯一选择,目前自己编写驱动来实现相关功能的基本找不到. Winpcap对于接收的报文只是复制,并不阻断报文向操作系统提交,因此还是影响了操作系统,导致操作系统时不时的发出一些报文来,而这些报文又可能会干扰我们的测试过程,为了突破这个限制,我重新实现了相关的驱动,做到了以下几个功能: 1  和Winpcap一样出色的报文接收和发送功能.函数接口类似,原来的代码不用大修改. 2  接收后的报文不会转交到操作系统. 3  操作系统发出的

dsp28377控制DM9000收发数据

首先感谢上一篇转载文章的作者给出的参考,下面是一些自己在调试过程中的一些步骤: 首先把代码贴上来: //---------------------------------------------------------------------------------------------//DSP28377 利用EMIF控制网口DM9000芯片收发数据//----------------------------------------------------------------------

dsp28377控制DM9000收发数据——第二版程序,能够实现手术功能,但是容易掉帧;使用读取中断寄存器的方式判断中断

G:\controlSUITE\device_support\F2837xD\v180\F2837xD_examples_Cpu1\emif1_16bit_asram\cpu01\emif1_16bit_asram.c 2016年11月22日 20:35//---------------------------------------------------------------------------------------------//DSP28377 利用EMIF控制网口DM9000芯

树莓派控制舵机资料

舵机介绍:http://www.51hei.com/mcu/2672.html 树莓派PWM函数介绍:http://shumeipai.nxez.com/2014/11/13/rpi-gpio-module-pwm-basic-function.html 舵机角度和占空比对应的关系动画. 对应关系如下,范围为-90°到+90°.为了方便计算,可以将其映射到0-180° 角度 20ms内脉冲宽度 占空比 映射后角度 -90° 0.5ms 2.5% 0° -45° 1ms 5.0% 45° 0° 1

用树莓派控制8*8led矩阵显示红心

话不多说,直接列代码,采用每行扫描显示的方式,led矩阵接口可查参考资料,对应连接相应的树莓派GPIO口. import RPi.GPIO as GPIOimport time PIN_A=11PIN_B=12PIN_C=13PIN_D=15PIN_E=16PIN_F=18PIN_G=22PIN_H=24 PIN_a=29PIN_b=31PIN_c=33PIN_d=35PIN_e=37PIN_f=32PIN_g=36PIN_h=38 GPIO.setmode(GPIO.BOARD) GPIO.s

树莓派控制数码管显示

1. 效果显示 2. 硬件设备 在某宝上买了一个4位共阴数码管.4个数字公用一个阴极,一共12个引脚.其中6,8,9,12是共阴引脚. 每个数字由 a-g 7个二极管和一个点dp.因为是在网上买的没有详细的器件手册,所以只能自己测试引脚与数码管上二极管的对应关系. 通过上图可以看出12号引脚对应的是第一位数字的共阴引脚,1号引脚对应数字e.依次测试,结果如下: 2.

利用树莓派控制步进电机——Python语言

步进电机的优点在于它能够被精确定位,正向或反向一次性转动"一步",并且也能够连续转动. #!/usr/bin/env python ######################################################### # File name: stepMotor.py # Author: Jason Dai # Date: 2015/01/26 ########################################################