树莓派红外接收解码实验-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9358|回复: 0

树莓派红外接收解码实验

[复制链接]
发表于 2016-7-13 15:27 | 显示全部楼层 |阅读模式
本帖最后由 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文件中我们可以找到详细说明。

1.JPG

安装lirc软件
$sudo apt-get install lirc
运行$ lsmod 查看设备是否已经启动。若没有启动可以运行
2.JPG
$sudo modprobe lirc_rpi加载驱动。
$sudo mode2 -d /dev/lirc0 按遥控器 看看有没有类似的脉冲输出。
3.JPG

如有接到到脉冲测lirc正常使用
采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的"0";以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的"1
4.png
协议:
上述“0”“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射,如下图。
5.png
一个命令只发送一次,即使遥控器上的按键一直按着。但是会每110mS发送一次代码,直到遥控器按键释放。重复码比较简单:一个9mSAGC脉冲、2.25mS间隔、560uS脉冲。
6.png
7.png
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]
执行 按下遥控器按键 终端会显示接收到的按键的键值。
8.JPG

接线效果图
9.JPG
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-7-4 11:15 , Processed in 0.086656 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表