立即注册 找回密码

微雪课堂

搜索
微雪课堂 首页 树莓派 查看内容

树莓派系列教程15:红外遥控

2015-9-2 09:00| 发布者: MyMX1213| 查看: 28277| 评论: 8|原作者: MyMX1213

摘要: 上一章我们介绍了如果通过树莓派devicetree,将在ds18b20添加到linux系统中,并通过命令行读取温度数据,这一章我们也通过devicetree添加红外接收lirc为linux系统中红外遥控的软件,树莓派系统已经有这个模块,我们只 ...

上一章我们介绍了如果通过树莓派device tree,将在ds18b20添加到linux系统中,并通过命令行读取温度数据,这一章我们也通过device tree添加红外接收

lirclinux系统中红外遥控的软件,树莓派系统已经有这个模块,我们只需设置一下就而已使用。

sudo vi /boot/config.txt

在文件后面添加下面这一行

dtoverlay=lirc-rpi,gpio_in_pin=18


红外默认输出是18管脚,如果红外接收头接到其他管脚则需修改对应管脚,(管脚为BCM编码),Pioneer 600接收头默认接到18管脚故只需要添加

dtoverlay=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发送一次代码,直到遥控器按键释放。

重复码比较简单:一个9mSAGC脉冲、2.25mS间隔、560uS脉冲。

bcm2835程序:

  cpp代码:

#include <bcm2835.h>
#include <stdio.h>
#define PIN 18
#define IO bcm2835_gpio_lev(PIN)
unsigned char i,idx,cnt;
unsigned char count;
unsigned char data[4];

int main(int argc, char **argv)
{
    if (!bcm2835_init())return 1;
    bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_INPT);
    bcm2835_gpio_set_pud(PIN, BCM2835_GPIO_PUD_UP);
    printf("IRM Test Program ... \n");

    while (1)
    {	
	if(IO == 0)
	{
	    count = 0;
	    while(IO == 0 && count++ < 200)   //9ms
            delayMicroseconds(60);
			
			count = 0;
			while(IO == 1 && count++ < 80)	  //4.5ms
		    	delayMicroseconds(60);
			
			idx = 0;
			cnt = 0;
			data[0]=0;
			data[1]=0;
			data[2]=0;
			data[3]=0;
			for(i =0;i<32;i++)
			{
				count = 0;
				while(IO == 0 && count++ < 15)  //0.56ms
		    		delayMicroseconds(60);
				
				count = 0;
				while(IO == 1 && count++ < 40)  //0: 0.56ms; 1: 1.69ms
		    		delayMicroseconds(60);

				if (count > 25)data[idx] |= (1<1<cnt);
				if(cnt== 7)
				{
				    cnt=0;
 				    idx++;
				}
				else cnt++;
				if(data[0]+data[1] == 0xFF && data[2]+data[3]==0xFF)	//check	
				printf("Get the key: 0x%02x\n",data[2]);
		}
	}
    bcm2835_close();
    return 0;

}


  编译并执行,按下遥控按键,终端会显示接到到按键的键值。

gcc –Wall irm.c –o irm –lbcm2835
sudo ./irm

python程序

#!/usr/bin/python
# -*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import time

PIN = 18; 

GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN,GPIO.IN,GPIO.PUD_UP)
print('IRM Test Start ...')
try:
    while True:
        if GPIO.input(PIN) == 0:
            count = 0 
            while GPIO.input(PIN) == 0 and count < 200:  #9ms
                count += 1
                time.sleep(0.00006)

            count = 0 
            while GPIO.input(PIN) == 1 and count < 80:  #4.5ms
                count += 1
                time.sleep(0.00006)

            idx = 0 
            cnt = 0 
            data = [0,0,0,0]
            for i in range(0,32):
                count = 0 
                while GPIO.input(PIN) == 0 and count < 15:    #0.56ms
                    count += 1
                    time.sleep(0.00006)
    
                count = 0 
                while GPIO.input(PIN) == 1 and count < 40:   #0: 0.56mx
                    count += 1                               #1: 1.69ms
                    time.sleep(0.00006)

                if count > 8:
                    data[idx] |= 1>>cnt
                if cnt == 7:
                    cnt = 0
                    idx += 1
                else:
                    cnt += 1
            if data[0]+data[1] == 0xFF and data[2]+data[3] == 0xFF:  #check
                print("Get the key: 0x%02x" %data[2])
except KeyboardInterrupt:
GPIO.cleanup();

    执行,按下遥控按键,终端会显示接到到按键的键值。

sudo python irm.py

以上资料由微雪电子整理并发布,未经许可不得转载,否则追究相应责任!


315

顶一下

刚表态过的朋友 (315 人)

相关阅读

发表评论

最新评论

引用 hldgaoshuo 2017-9-26 17:01
刚开始的时候输入
sudo mode2 –d /dev/lirc0
后出现
Using driver default on device /dev/lirc0
Trying device: /dev/lirc0
Using device: /dev/lirc0
Running as regular user pi
然后按下按键,得到下面依据,并且自动退出
Partial read 8 bytes on /dev/lirc0( 其中数字8可能变为12或4 )
解决办法
将 /etc/lirc/lirc_options.config 中的 driver 从 devinput 改为 default ,之后可以正常接收。
引用 游客 2017-6-19 22:37
按照这个教程,输入之后没有数据,然后我把print放在前面,就答应了两条这个数据
01,00,00,01
00,01,00,00
引用 游客 2017-2-8 11:39
sudo python irm.py
显示:“IRM Test Start ...”
可是遥控器按任何遥控器都没反应,是怎么回事呢?
引用 waveshare-admin 2016-10-26 11:45
: 您好,我输入sudo mode2 –d /dev/lirc0之后,它说sudo: mode2: command not found,是因为什么原因呢? ...
如果没打错是可以的,可以加下技术qq咨询下:2853908288
引用 游客 2016-10-22 18:32
您好,我输入sudo mode2 –d /dev/lirc0之后,它说sudo: mode2: command not found,是因为什么原因呢? ...
引用 kaloha 2016-10-15 09:32
: 我按这个教程试,但是什么都使用遥控器按键后,什么都显示不出来
是到哪一步就不行的?有没有出错提示?
引用 游客 2016-10-14 20:05
我按这个教程试,但是什么都使用遥控器按键后,什么都显示不出来
引用 田伟 2016-8-5 23:19
doverlay=lirc-rpi,gpio_in_pin=18
dtoverlay=lirc-rpi,gpio_in_pin=18

查看全部评论(8)

树莓派

微雪官网|产品资料|手机版|小黑屋|微雪课堂. ( 粤ICP备05067009号 )

GMT+8, 2019-10-18 12:43 , Processed in 0.018208 second(s), 19 queries .

Powered by Discuz! X3.2 © 2001-2013 Comsenz Inc & Style Design

返回顶部