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

之前在《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 玩家刘磊编写好的程序,适配随板赠送的遥控器可直接使用。

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

“); break; case 0x46://CH printf(“Button CH

“); break; case 0x47://CH+ printf(“Button CH+

“); break; case 0x44://PREV printf(“Button PREV

“); system(“mpc prev”); break; case 0x40://NEXT printf(“Button NEXT

“); system(“mpc next”); break; case 0x43://PLAY/PAUSE printf(“Button PLAY/PAUSE

“); if (flag == 0) { flag = 1; system(“mpc play”); } else { flag = 0; system(“mpc pause”); } break; case 0x07://VOL- printf(“Button VOL-

“); system(“mpc volume -1”); break; case 0x15://VOL+ printf(“Button VOL+

“); system(“mpc volume +1”); break; case 0x09://EQ printf(“Button EQ

“); break; case 0x16://0 printf(“Button 0

“); break; case 0x19://100+ printf(“Button 100+

“); break; case 0x0d://200+ printf(“Button 200+

“); break; case 0x0c://1 printf(“Button 1

“); break; case 0x18://2 printf(“Button 2

“); break; case 0x5e://3 printf(“Button 3

“); break; case 0x08://4 printf(“Button 4

“); break; case 0x1c://5 printf(“Button 5

“); break; case 0x5a://6 printf(“Button 6

“); break; case 0x42://7 printf(“Button 7

“); break; case 0x52://8 printf(“Button 8

“); break; case 0x4a://9 printf(“Button 9

“); 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 …

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