`
iaiai
  • 浏览: 2197880 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

 
阅读更多
网上淘到了一个红外接收器(HX1838+NEC编码红外遥控器)和一个红外遥控器,准备放到树莓派上学习一下红外控制。

不知道为什么接受器带灯的那个距离感应很近,不知道为什么,这里就不用带灯的,用下图两个,一个接收器和控制器



1.正面对准自己,然后从左到右三个头分别是如下图,插到对应的树莓派上


2.安装lirc,修改配置文件
LIRC (Linux Infrared remote control)是一个linux系统下开源的软件包。这个软件可以让Linux系统接收及发送红外线信号。
sudo apt-get install lirc

这里要重点说明一下,安装上之后网上基本上文章都是说修改/etc/lirc/hardware.conf这个文件,但是我装上lirc最新版(0.9.2)之后根本就找不到这个配置文件,修改的不是hardware.conf这文件,修改/etc/lirc/lirc_options.conf这个文件,把这个文件中对应以下几个参数修改一下
#driver          = devinput
driver		= default
#device		= /dev/lirc0
device          = auto

3.修改/boot/config.txt文件,这里26是对应bcm树莓派上的gpio接口:
dtoverlay=lirc-rpi,gpio_in_pin=26

4.重新开启lirc功能,至此lirc软件就配置完成了。
sudo /etc/init.d/lircd restart
sudo modprobe lirc_rpi


5.关闭红外线接收功能
首先关闭lirc软件,然后执行如下命令:
sudo kill $(pidof lircd)


6.测试红外接收
mode2 -d /dev/lirc0

用红外遥控器,对着接收器按下任意按键,屏幕会打印类似下面的内容,说明红外接收功能正常。
引用
space 16300
pulse 95
space 28794
pulse 80
space 19395


7.红外编码录制
irrecord --list-namespace

可查看有哪些按键名并记录下来,然后执行红外线编码录制命令
irrecord -d /dev/lirc0 ~/lircd.conf

开始时需要输入一下别名,最后会根据此名称保存对应的文件名,我这里起的:pi
按提示需要输入两次按键次数,需要多少次记不清楚了,你只要来回把按钮全按一遍一直按到提示结束,接下来就是根据上面记录下来的按键名称来点击控制器上对应的按钮,把控制器上所有按钮全部对应到一个不同的按按键名上,如果全部完成之后多按一次回车,提示结束,但这里还需要随便再按一次按钮才会保存成功,成功之后会在~/目录下生成pi.lircd.conf这个文件,只要把这个文件放到/etc/lirc/lircd.conf.d/这个目录里就行了,执行:
sudo cp ~/pi.lircd.conf /etc/lirc/lircd.conf.d/

下面是我生成的pi.lircd.conf此文件内容:
# Please take the time to finish this file as described in
# https://sourceforge.net/p/lirc-remotes/wiki/Checklist/
# and make it available to others by sending it to
# <lirc@bartelmus.de>
#
# This config file was automatically generated
# using lirc-0.9.4c(default) on Sat Feb 24 13:30:19 2018
# Command line used: -d /dev/lirc0 /home/pi/lircd.conf
# Kernel version (uname -r): 4.9.59-v7+
#
# Remote name (as of config file): pi
# Brand of remote device, the thing you hold in your hand:
# Remote device model nr:
# Remote device info url:
# Does remote device has a bundled capture device e. g., a
#     usb dongle? :
# For bundled USB devices: usb vendor id, product id
#     and device string (use dmesg or lsusb):
# Type of device controlled
#     (TV, VCR, Audio, DVD, Satellite, Cable, HTPC, ...) :
# Device(s) controlled by this remote:

begin remote

  name  pi
  bits           32
  flags SPACE_ENC|CONST_LENGTH
  eps            30
  aeps          100

  header       8994  4467
  one           583  1641
  zero          583   570
  ptrail        583
  repeat       8994  2217
  gap          107314
  toggle_bit_mask 0x0
  frequency    38000

      begin codes
          KEY_0                    0x00FF6897 0x7ED25DBC
          KEY_1                    0x00FF30CF 0x7ED25DBC
          KEY_2                    0x00FF18E7 0x7ED25DBC
          KEY_3                    0x00FF7A85 0x7ED25DBC
          KEY_4                    0x00FF10EF 0x7ED25DBC
          KEY_5                    0x00FF38C7 0x7ED25DBC
          KEY_6                    0x00FF5AA5 0x7ED25DBC
          KEY_7                    0x00FF42BD 0x7ED25DBC
          KEY_8                    0x00FF4AB5 0x7ED25DBC
          KEY_9                    0x00FF52AD 0x7ED25DBC
          KEY_CHANNEL              0x00FF629D 0x7ED25DBC
          KEY_CHANNELDOWN          0x00FFA25D 0x7ED25DBC
          KEY_CHANNELUP            0x00FFE21D 0x7ED25DBC
          KEY_PLAY                 0x00FFC23D 0x7ED25DBC
          KEY_NEXT                 0x00FF02FD 0x7ED25DBC
          KEY_PREVIOUS             0x00FF22DD 0x7ED25DBC
          KEY_VOLUMEDOWN           0x00FFE01F 0x7ED25DBC
          KEY_VOLUMEUP             0x00FFA857 0x7ED25DBC
          KEY_EQUAL                0x00FF906F 0x7ED25DBC
          KEY_A                    0x00FF9867 0x7ED25DBC
          KEY_B                    0x00FFB04F 0x7ED25DBC
      end codes

end remote


完成之后重启树莓派

8.接下来就是编写代码,我这里给出两种语言的代码,一个是c语言的,一个是python语言的代码,都是调用通过

c代码(必须要提前安装上bcm2835的库,从网上百度吧很多):
#include <bcm2835.h>
#include <stdio.h>
#include <stdlib.h>
 
#define PIN 26
#define IO bcm2835_gpio_lev(PIN)
unsigned char i,idx,cnt;
unsigned char count;
unsigned char data[4];

static int flag = 0;
int exec_cmd(unsigned char key_val){
	switch(key_val) {
		case 0x45://CH-
		       	printf("Button CH-\n");
			break;
		case 0x46://CH
			printf("Button CH\n");
			break;
		case 0x47://CH+
			printf("Button CH+\n");
			break;
		case 0x44://PREV
			printf("Button PREV\n");
			system("mpc prev");
			break;
		case 0x40://NEXT
			printf("Button NEXT\n");
			system("mpc next");
			break;
		case 0x43://PLAY/PAUSE
			printf("Button PLAY/PAUSE\n");
			if (flag == 0) {
				flag = 1;
				printf("mpc play\n");
				//system("mpc play");
			}else{
				flag = 0;
				printf("mpc pause\n");
				//system("mpc pause");
			}
			break;
		case 0x07://VOL-
			printf("Button VOL-\n");
			system("mpc volume -1");
			break;
		case 0x15://VOL+
			printf("Button VOL+\n");
			system("mpc volume +1");
			break;
		case 0x09://EQ
			printf("Button EQ\n");
			break;
		case 0x16://0
			printf("Button 0\n");
			break;
		case 0x19://100+
			printf("Button 100+\n");
			break;
		case 0x0d://200+
			printf("Button 200+\n");
			break;
		case 0x0c://1
			printf("Button 1\n");
			break;
		case 0x18://2
			printf("Button 2\n");
			break;
		case 0x5e://3
			printf("Button 3\n");
			break;
		case 0x08://4
			printf("Button 4\n");
			break;
		case 0x1c://5
			printf("Button 5\n");
			break;
		case 0x5a://6
			printf("Button 6\n");
			break;
		case 0x42://7
			printf("Button 7\n");
			break;
		case 0x52://8
			printf("Button 8\n");
			break;
		case 0x4a://9
			printf("Button 9\n");
			break;
		default:
			break;
	}
	return 0;
}

int main(int argc, char const *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<<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]);
				exec_cmd(data[2]);
			}
		}
	}

	bcm2835_close();
	return 0;
}

写好之后编译运行c文件:
gcc -Wall irm.c -o irm -lbcm2835
sudo ./irm

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

下面再说下python代码:
#!/usr/bin/python
# -*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import time

PIN = 26;

GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN,GPIO.IN,GPIO.PUD_UP)
print("irm test start...")

def exec_cmd(key_val):
    if(key_val==0x45):
        print("Button CH-")
    elif(key_val==0x46):
        print("Button CH")
    elif(key_val==0x47):
        print("Button CH+")
    elif(key_val==0x44):
        print("Button PREV")
    elif(key_val==0x40):
        print("Button NEXT")
    elif(key_val==0x43):
        print("Button PLAY/PAUSE")
    elif(key_val==0x07):
        print("Button VOL-")
    elif(key_val==0x15):
        print("Button VOL+")
    elif(key_val==0x09):
        print("Button EQ")
    elif(key_val==0x16):
        print("Button 0")
    elif(key_val==0x19):
        print("Button 100+")
    elif(key_val==0x0d):
        print("Button 200+")
    elif(key_val==0x0c):
        print("Button 1")
    elif(key_val==0x18):
        print("Button 2")
    elif(key_val==0x5e):
        print("Button 3")
    elif(key_val==0x08):
        print("Button 4")
    elif(key_val==0x1c):
        print("Button 5")
    elif(key_val==0x5a):
        print("Button 6")
    elif(key_val==0x42):
        print("Button 7")
    elif(key_val==0x52):
        print("Button 8")
    elif(key_val==0x4a):
        print("Button 9")

try:
    while True:
        if GPIO.input(PIN) == 0:
            count = 0
            while GPIO.input(PIN) == 0 and count < 200:
                count += 1
                time.sleep(0.00006)

            count = 0
            while GPIO.input(PIN) == 1 and count < 80:
                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:
                    count += 1
                    time.sleep(0.00006)

                count = 0
                while GPIO.input(PIN) == 1 and count < 40:
                    count += 1
                    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:
                 print("Get the key: 0x%02x" %data[2])
                 exec_cmd(data[2])
except KeyboardInterrupt:
    GPIO.cleanup();

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

  • 大小: 21.8 KB
  • 大小: 43.3 KB
  • 大小: 71.7 KB
  • 大小: 28.7 KB
  • 大小: 66.8 KB
分享到:
评论

相关推荐

    树莓派系列教程15:红外遥控.rar-综合文档

    树莓派系列教程15主要聚焦于如何利用红外遥控技术来控制树莓派。这个教程是树莓派学习过程中的一个重要部分,因为它涉及到硬件接口的使用以及与日常生活中的电子设备交互的能力。红外遥控(IR Remote Control)是一...

    树莓派系列教程15:红外遥控.docx-综合文档

    树莓派系列教程15专注于讲解如何利用红外遥控技术与树莓派进行交互。在这个教程中,我们将学习如何配置树莓派的硬件和软件,以便能够接收并解析红外遥控器发出的信号。 首先,红外遥控的关键在于树莓派的device ...

    树莓派智能小车 循迹 超声波避障 红外避障 红外追踪 遥控小车代码

    在本项目中,我们主要探讨的是利用树莓派(Raspberry Pi)开发一款具备循迹、超声波避障、红外避障以及红外追踪功能的智能遥控小车。树莓派是一款基于Linux系统的微型计算机,因其强大的可扩展性和低价格,被广泛...

    STM32F103C8T6开发板实验例程:红外遥控串口输出实验程序源代码.rar

    STM32F103C8T6开发板实验例程:红外遥控串口输出实验程序源代码。 1、单片机型号:STM32F103C8T6。 2、开发环境:KEIL。 3、编程语言:C语言。 4、提供配套PDF格式STM32F103C8T6单片机开发板电路原理图。

    单片机:红外遥控六足爬虫机器人设计.doc

    单片机:红外遥控六足爬虫机器人设计.doc 本文档主要介绍了单片机红外遥控六足爬虫机器人的设计,涵盖了机器人的设计、控制系统电路图、微型伺服马达原理与控制、红外遥控等方面的知识点。 一、机器人的设计 ...

    实验12:红外遥控小车.zip

    实验12:红外遥控小车.zip 这个压缩包文件主要涵盖了基于STM32微控制器的红外遥控小车设计的相关内容。STM32是意法半导体(STMicroelectronics)推出的一种基于ARM Cortex-M内核的微控制器系列,广泛应用在嵌入式...

    西门子LOGO!EIB总线案例:红外遥控操作.rar

    与EIB(欧洲安装总线,也称为KNX)总线系统相结合,实现红外遥控操作。EIB/KNX是一种国际标准的楼宇自动化网络,它允许不同设备间的通信,如照明、暖通空调、遮阳控制等。 首先,我们需要了解LOGO!EIB模块的功能。...

    STM32F103实验:红外遥控程序源代码.rar

    在这个实验中,我们将关注的是如何利用STM32F103实现红外遥控功能,这涉及到硬件接口设计、软件编程以及红外通信协议的理解。 首先,开发环境选择的是KEIL。KEIL μVision是一款强大的嵌入式开发工具,支持多种MCU...

    电子设计:树莓派入门教程

    12. **红外遥控**:教程可能会教你如何使用树莓派接收和解析红外信号,实现对家电设备的遥控。 13. **RTC**:实时时钟(RTC)教程会解释如何添加一个外接RTC模块,以保持树莓派在断电后仍然能够准确计时。 14. **...

    STC15红外遥控接收_红外遥控_stc单片机红外线遥控器解码程序_

    标题中的“STC15红外遥控接收”涉及的是基于STC15系列单片机的红外遥控系统设计。STC15系列是STC公司推出的一系列8位增强型单片机,以其低功耗、高性价比和丰富的内部资源而受到广泛应用。在红外遥控系统中,STC15...

    史上最全的红外资料(红外遥控原理)

    红外遥控系统的编码和解码过程为:红外发送端将待发送的二进制信号编码调制为一系列的脉冲串信号,通过红外发射管发射红外信号。红外接收端完成对红外信号的接收、放大、检波、整形,并解调出遥控编码脉冲。在解调...

    智能小车红外遥控的实现

    红外遥控技术是一种使用红外线进行遥控的技术,通过在遥控器中安装红外发射器,并在智能小车中安装红外接收器,实现遥控功能。红外遥控技术广泛应用于家电、汽车、机器人等领域。 二、智能小车红外遥控系统组成 ...

    红外遥控玩具小车驱动程序

    红外遥控玩具小车驱动程序 红外遥控玩具小车驱动程序是一种基于红外编码和解码技术的遥控系统,用于控制玩具小车的运动。该系统由红外编码程序、红外解码程序和小车驱动程序三部分组成。在自动模式下,小车可以完成...

    STM32 红外遥控器程序

    STM32红外遥控器程序是基于STM32微控制器实现的一种常见嵌入式应用,它涉及到红外通信技术、微控制器编程、嵌入式系统以及电路设计等多个知识点。在这个项目中,STM32作为核心处理器,负责接收和发送红外信号,实现...

    基于-单片机红外遥控系统设计.doc

    "基于单片机红外遥控系统设计" 这篇设计基于单片机的红外遥控系统设计,旨在设计一个简易的智能红外遥控系统。系统包括接收和发射两大局部,发射局部有 16 个按键,接收局部含有 8 盏彩色 LED 灯、一片二位数码管和...

    STM32 F103C8T6学习笔记12:红外遥控-红外解码~~.rar

    解码过程首先需要配置STM32的GPIO口作为红外接收传感器的输入,一般使用的是红外接收头,如TSOP系列。当红外光脉冲信号被接收头转换为电信号后,微控制器会通过中断服务程序捕获这些信号。STM32的中断系统非常强大,...

    树莓派3--NEC遥控--舵机小灯UI

    【树莓派3】是树莓派系列中的一个型号,配备了四核ARM Cortex-A53处理器,比之前的版本有显著性能提升。它内置了Wi-Fi和蓝牙功能,使其成为理想的DIY和嵌入式项目平台。在这个项目中,树莓派3作为中心处理单元,接收...

    基于单片机的红外遥控电路设计说明.doc

    基于单片机的红外遥控电路设计说明 基于单片机的红外遥控电路设计是指使用单片机作为核心控制单元,设计了一种红外多路遥控发射/接收系统,实现对多个设备的短距离无线控制。该系统具有使用方便、功耗低、抗干扰...

Global site tag (gtag.js) - Google Analytics