红外遥控c语言,HiFiBox DAC + RuneAudio 红外遥控方案(C语言实现)

fb5333278618142513810a427a99aff9.png

之前在《HiFiBox DAC 自定义红外遥控配置教程》中介绍了树莓派上红外遥控的编码学习和使用,并且实现了遥控控制音乐播放的功能。

以上方案是基于 lirc 提供的软件实现。有树莓派玩家提供了一种通过编程实现红外读取的方法(C语言实现),此方法在树莓派2B、RuneAudio_rpi2_rp3_0.4-beta_20160321 版本上验证通过。这里的红外接收方法和代码也可以用于树莓派的其他红外模块,期待大家举一反三的应用。

如果你是 HiFi DAC + RuneAudio 玩家,自己也懒得折腾,可以在修改好config.txt启用红外接收功能之后,直接下载已经编译好了的 irm 程序运行。那也就意味着你只需要从这里开始往下配置就好了:)

用 SSH 工具登录系统(默认用户名 root 密码 rune)

安装 gcc 编译器

pacman -Sy

pacman -S gcc

如果以上过程出错或更新很慢,可以遵循下面的方法修改软件源(可选步骤)。

nano /etc/pacman.d/mirrorlist

在第一个行添加中科大的软件源(树莓派3B对应armv7h,其他版本请参考这里修改)

Server = http://mirrors.ustc.edu.cn/archlinuxarm/armv7h/$repo

下载并安装 bcm2835

wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.52.tar.gz

tar zxvf bcm2835-1.52.tar.gz

cd bcm2835-1.52

./configure

make

make check

make install

P.S.树莓派实验室建议你这样用make命令,用于保存安装信息日志,这样需要卸载的时候方便查看哪些文件安装在了系统目录中,例如/usr/lib下的库文件

make >& LOG_make &

make install >& LOG_install &

修改 config.txt

nano /boot/config.txt

修改 /boot/config.txt 中的如下配置,如果这两行备注释了请取消其注释

dtoverlay=lirc-rpi

dtparam=gpio_in_pin=26

红外接收程序

以下是 HiFiBox DAC 玩家刘磊编写好的程序,适配随板赠送的遥控器可直接使用。

bbd73114b2e1c90115f8dc25c97352dd.png

#include

#include

#include

#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;

system("mpc play");

} else {

flag = 0;

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<

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;

}

编译程序,测试

编译程序,得到 irm 这个文件之后就可以执行了。可用遥控器测试,能输出编码即正常。

gcc -Wall irm.c -o irm -lbcm2835

sudo chmod +x irm

sudo ./irm

如果你是 HiFiBox DAC + RuneAudio 玩家,自己也懒得折腾上面那些步骤,可以在修改好config.txt启用红外接收功能之后,直接下载已经编译好了的 irm 程序(for rpi 2b)运行。那也就意味着你只需要从这里开始往下配置就好了:)

设置开机自动启动

加入到开机启动,修改 rc-local.service(原始文件备份)

cp irm /usr/bin/irm

cp /usr/lib/systemd/system/rc-local.service /usr/lib/systemd/system/rc-local.service.backup

nano /usr/lib/systemd/system/rc-local.service

修改为以下内容:

[Unit]

Description=/etc/rc.local Compatibility

ConditionPathExists=/etc/rc.local

[Service]

Type=forking

ExecStart=/etc/rc.local

TimeoutSec=0

StandardOutput=tty

RemainAfterExit=yes

SysVStartPriority=99

[Install]

WantedBy=multi-user.target

开机自启动该 service

systemctl enable rc-local.service

现在添加 rc.local 文件

touch /etc/rc.local

nano /etc/rc.local

#!/bin/bash

/usr/bin/irm &

exit 0

授权、重启系统。

chmod +x /etc/rc.local

reboot

完成!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值