查看: 5399|回复: 0

树莓派红外接收解码实验

[复制链接]
  • TA的每日心情
    奋斗
    2016-2-2 10:49
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 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 代码

    kittenblock中小学创客名师推荐的图形化编程软件

    #!/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();
    
    
    

    执行 按下遥控器按键 终端会显示接收到的按键的键值。
    8.JPG

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

    本版积分规则

    热门推荐

    【原创】全球最小口袋3D打印机mini one直播教程贴
    【原创】全球最小口袋3D打
    最近闲得蛋疼,没事搞个掌上3D打印机,先放效果图吧。 搞了半天,终于能正常打印,
    Blink——Arduino的Hello World!
    Blink——Arduino的Hello
    本教程节选自《Arduino程序设计基础》 Arduino编程基础(零)——Blink,Arduino的He
    ATmega2560-16AU刷BootLoader好慢
    ATmega2560-16AU刷BootLoa
    各位朋友,ATmega2560-16AU刷BootLoader好慢,有没有比较快的办法,一块板子要5分钟左
    【Arduino】108种传感器模块系列实验(104)---MAX30102手腕心率
    【Arduino】108种传感器模
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    Arduino MEGA 与UNO 通过nRF24L模块通讯
    Arduino MEGA 与UNO 通过n
    之前在深水宝很“实惠”的店铺买了一些原件,随手砍了esp8266以及nRF24L*3 因为缺
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表