本帖最后由 xiansen_shun 于 2016-7-13 15:30 编辑
本次做的是红外接收实验
我们通过device tree 添加红外接收lirc 为Liunx系统中的红外遥控的代码 ,树莓派中已经有这个模块,我们只是需要设置一下就可以使用。
$sudo vi /boot/config.txt
在文件的最后一行添加下面的这一行代码。
$doverlay=lirc-rpi,gpio_in_pin=18
红外默认输出是18管脚,如果红外接收头接到其他管脚则需修改对应管脚,(管脚为BCM编码),Pioneer 600接收头默认接到18管脚故只需要添加
$doverlay=lirc-rpi
在/boot/overlay/README文件中我们可以找到详细说明。
安装lirc软件
$sudo apt-get install lirc
运行$ lsmod 查看设备是否已经启动。若没有启动可以运行
$sudo modprobe lirc_rpi加载驱动。
$sudo mode2 -d /dev/lirc0 按遥控器 看看有没有类似的脉冲输出。
如有接到到脉冲测lirc正常使用
采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的"0";以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的"1 协议: 上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射,如下图。
一个命令只发送一次,即使遥控器上的按键一直按着。但是会每110mS发送一次代码,直到遥控器按键释放。重复码比较简单:一个9mS的AGC脉冲、2.25mS间隔、560uS脉冲。
python 代码
[mw_shl_code=python,true]#!/usr/bin/python
# -*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import time
ERROR = 0xFE
PIN = 18
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(PIN, GPIO.IN, GPIO.PUD_UP)
def getKey():
byte = [0, 0, 0, 0];
if IRStart() == False:
time.sleep(0.11); # One message frame lasts 108 ms.
return ERROR;
else:
for i in range(0, 4):
byte = getByte();
if byte[0] + byte[1] == 0xff and byte[2] + byte[3] == 0xff:
return byte[2];
else:
return ERROR;
def IRStart():
timeFallingEdge = [0, 0];
timeRisingEdge = 0;
timeSpan = [0, 0];
GPIO.wait_for_edge(PIN, GPIO.FALLING);
timeFallingEdge[0] = time.time();
GPIO.wait_for_edge(PIN, GPIO.RISING);
timeRisingEdge = time.time();
GPIO.wait_for_edge(PIN, GPIO.FALLING);
timeFallingEdge[1] = time.time();
timeSpan[0] = timeRisingEdge - timeFallingEdge[0];
timeSpan[1] = timeFallingEdge[1] - timeRisingEdge;
if timeSpan[0] > 0.0085 and \
timeSpan[0] < 0.0095 and \
timeSpan[1] > 0.004 and \
timeSpan[1] < 0.005:
return True;
else:
return False;
def getByte():
byte = 0;
timeRisingEdge = 0;
timeFallingEdge = 0;
timeSpan = 0;
for i in range(0, 8):
GPIO.wait_for_edge(PIN, GPIO.RISING);
timeRisingEdge = time.time();
GPIO.wait_for_edge(PIN, GPIO.FALLING);
timeFallingEdge = time.time();
timeSpan = timeFallingEdge - timeRisingEdge;
if timeSpan > 0.0016 and timeSpan < 0.0018:
byte |= 1 << i;
return byte;
print('IRM Test Start ...')
try:
while True:
key = getKey();
if(key != ERROR):
print("Get the key: 0x%02x" %key)
except KeyboardInterrupt:
GPIO.cleanup();
[/mw_shl_code]
执行 按下遥控器按键 终端会显示接收到的按键的键值。
接线效果图
|