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

2023-05-16

网上淘到了一个红外接收器(HX1838+NEC编码红外遥控器)和一个红外遥控器,准备放到树莓派上学习一下红外控制。
[img]http://dl2.iteye.com/upload/attachment/0128/9746/82f5aa5d-baf0-30eb-8373-34c197589c2d.jpg[/img]
不知道为什么接受器带灯的那个距离感应很近,不知道为什么,这里就不用带灯的,用下图两个,一个接收器和控制器
[img]http://dl2.iteye.com/upload/attachment/0128/9742/24d2a5e1-a19e-348c-85db-f44224ede92a.jpg[/img]
[img]http://dl2.iteye.com/upload/attachment/0128/9744/df539677-1c58-31f5-b94c-a6ffa923cfb2.png[/img]

1.正面对准自己,然后从左到右三个头分别是如下图,插到对应的树莓派上
[img]http://dl2.iteye.com/upload/attachment/0128/9748/84a2fa5c-a10d-3f58-8761-5df2d8ccc66b.jpg[/img]

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

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

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();

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

[img]http://dl2.iteye.com/upload/attachment/0128/9756/8c1aeb62-46c4-34d5-961c-994ce3be3cbc.png[/img]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树莓派系列教程:红外遥控 的相关文章

  • 树莓派GPIO控制

    树莓派GPIO 控制 陈拓 2018 06 09 2018 06 10 0 概述 本文介绍树莓派 Zero W的GPIO控制 xff0c 并用LED看效果 也适宜于树莓派3B 43 0 1 树莓派GPIO编号方式 功能物理引脚 从左到右 x
  • UDP编程详解

    1 1 编程准备 字节序 地址转换 1 1 1 字节序概述 字节序概念 xff1a 是指多字节数据的存储顺序 分类 xff1a 大端格式 xff1a 将低位字节数据存储在低地址 小端格式 xff1a 将高位字节数据存储在低地址 注意 xff
  • DataHub:通用的元数据搜索和发现工具(开源)

    Get Started With DataHub DataHub 作为世界上最大的专业网络和Economic Graph的运营商 xff0c LinkedIn 的数据团队一直致力于扩展其基础架构 xff0c 以满足我们不断增长的大数据生态系
  • mp4格式视频因为录制到一半断电,导致损坏能修复

    risingresearch com 可以用 xff0c 完全免费 xff0c 只是下载页面有英文 xff0c 安装后是中文的 xff0c 非常小巧 然后可能会出现缺文件头的提示 此时点击是 xff0c 然后导入一个正常录制的MP4视频 x
  • ipscan端口扫描工具

    ip端口扫描工具的英文名字是ipscan 是一款搜索局域网机器的绿色小软件 IPScan在静态IP地址环境下或者DHCP环境下 都提供完善的IP地址管理 用户也可以使用IPScanProbe自带的DHCP服务器 它能提供更高的安全和灵活的D
  • IPFS,HDFS以及http对比笔记

    分布式系统 分布式系统发展至今已有数十年 xff0c 那么分布式系统到底是什么 xff1f 实际上分布式系统并没有标准的定义 分布式系统一般的呈现方式是将硬件或软件分布在不同的网络计算机 xff0c 彼此间通过消息传递进行通信及协调 xff
  • chatgpt注意点

    1 ip地址不能是国内 2 浏览器无痕模式 xff08 浏览器不挑 xff09 3 国外的手机号激活sms 激活 20230213目前还可以注册
  • ASP.NET 连接MySQL数据库 详细步骤

    ASP NET默认的数据库是MS SQL Server xff0c 微软的数据库产品 事实上 xff0c 如果不计成本因素的话 xff0c Windows Server 43 IIS 43 MS SQL Server 43 ASP NET是
  • Apache Skywalking介绍

    Apache Skywalking介绍 1 基本介绍 Apache Skywalking是一款APM工具 xff08 Application Performance Management 应用性能管理 xff09 2 安装部署 官网地址 x
  • 常用的法律检索类网站

    1 中国裁判文书网 xff1a http wenshu court gov cn xff0c 共公布全国各级法院生效裁判文书1 2亿篇 xff0c 可以检索 查看 下载裁判文书 2 中国司法案例网 xff1a http anli court
  • 重要代码备份

    文书 xff1a button 61 document getElementsByClassName 34 a xzBox 34 for let i 61 0 i lt 61 14 i 43 43 setTimeout 61 gt butt
  • 在 Visio 绘图中剪裁线条和形状

    编辑绘图或图表 在 34 开始 34 选项卡上 xff0c 单击 34 编辑 34 组中 34 选择 34 xff0c 然后单击 列表中的 34 全 选 34 单击 34 开发工具 34 选项卡 在 34 形状设计 34 组中 xff0c
  • 定时器/计数器介绍

    第一次在学习定时器的时候模模糊糊 xff0c 在做过一些题目之后对定时器有了更新的理解 xff0c 现在整理一下 xff0c 做笔记使用 目录 一 基础知识 定时器的作用 xff1a 定时器的实质 xff1a 定时器的工作原理 xff1a
  • Win10下安装Framework 3.5

    不同于 VC 43 43 运行库 xff0c NET Framework 是支持向下兼容的 xff0c 即 xff1a NET Framework 4 8 向下兼容至 4 0 NET Framework 3 5 SP1 向下兼容至 2 0
  • linux串口通信

    linux下串口通信与管理 linux下的串口与windows有一些区别 xff0c 下面将介绍一下linux下串口通信管理 查看是否支持USB串口 xff1a lsmod grep usbserial 如果没有信息 xff1a sudo
  • UP-magic的口袋机arm挂载u盘

    查看U盘信息 fdisk l mount t vfat dev mmcblk0p1 mnt sdcard 挂载U盘 mount命令格式 xff1a mount 参数 设备名称 挂载点 其他参数 mount t vfat dev sdb1 m
  • dell t630服务器风扇控制笔记记录(耗时一天)

    1 打开虚拟控制台得用IE xff1b 2 Dell PowerEdge T640 加装显卡之后风扇狂转问题解决 知乎 感谢知乎Billy xff0c 操作步骤 xff1a 1 查看iDrac版本 xff0c 必须在3 30 30 30及以
  • 安装autogpt中出现的问题及安装autogpt的小白教程

    ImportError DLL load failed while importing numpy ops The specified module could not be found 解决方案 xff1a Latest supporte
  • UBUNTU下NFS配置(用于嵌入式开发)

    1 NFS简介 NFS xff08 Network File System xff09 即网络文件系统 xff0c 是FreeBSD支持的文件系统中的一种 xff0c 它允许网络中的计算机之间共享资源 在NFS的应用中 xff0c 本地NF
  • Ubuntu 18.04 下 uhd+gnuradio 安装指南

    sudo apt get y install git swig cmake doxygen build essential libboost all dev libtool libusb 1 0 0 libusb 1 0 0 dev lib

随机推荐