问题来源
近期一直在自学嵌入式,自从在Arduino上实现红外遥控功能后,就琢磨的怎么把这些功能移植到树莓派Raspbian上,关于红外遥控的环境配置已经在博文:树莓派Raspberry红外遥控IR remote control环境搭建中提到了,在此不多赘述。此处主要实现将所有代码放入.c的文本中,编译运行实现遥控功能。详细过程如下
下载并安装BCM2835库
- 下载
BCM官方网站下载最新的BCM2835库文件,下载链接http://www.airspayce.com/mikem/bcm2835/bcm2835-1.59.tar.gz。直接用树莓派下载或者其他电脑下载后,在用ftp传到树莓派中。
-
安装
注意将下列代码中安装包的名字修改成与所下载的文件名称一致,及替换XX所指代的内容
1.进入包含下载的安装包(bcm2835-1.59.tar.gz)的目录,
2.解压文件tar xvzf bcm2835-1.XX.tar.gz
3.进入解压文件
cd bcm2835-1.XX
4.配置
./configure
5.从源码生成新的安装包
make
6.执行检查
sudo make check
7.安装BCM2835库
sudo make install
说明:树莓派3b CPU应该是BCM2835,但为什么还是安装BCM2835的库?这个百度有说明,详细的我也搞不清,反正是在终端查CPU型号,返回的BCM2835。据说BCM2835与
BCM2837 差不多。
- 过程图
程序代码
网络上网友一般在这个程序之前都进行遥控器按下信号与实际信息匹配,红外线编码录制命令,可百度相关教程。此处我只想验证能否用遥控器控制元件功能,暂时不管各按钮与实际名称与键值对应关系。下列代码复制于树莓派系列教程:红外遥控,感谢waterseason这位网友(如有涉及版权问题,请联系我删除这段代码)。上面的注释是我加上去的。
#include <bcm2835.h> //需要包含的库文件
#include <stdio.h>
#include <stdlib.h>
//红外接收传感器使用的引脚pin口,BCM编号
#define PIN 22
#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;
}
实验结果图
参考资料
https://blog.csdn.net/jh1513/article/details/90692093
https://blog.csdn.net/waterseason/article/details/84916642
http://www.waveshare.net/study/article-622-1.html
https://www.cnblogs.com/cj2014/p/3848887.html