树莓派下Java实现红外接收

树莓派下Java实现红外接收

1.前言

因为技术路线限定,需要通过Java实现在树莓派下用CHQ1838红外接收器获取到红外遥控器的输入。对Java下控制树莓派的红外接收进行了一些技术探索,通过多次尝试最后实现了相关功能,在此记录一下填坑的过程。

2.最初思路:仿单片机程序实现

因早已在单片机上实现过红外接收头接收遥控器的输入,结合对红外接收头的时序的了解,构思了最初的实现思路。
CHQ1838红外接收器时序图
仿照单片机程序的实现,通过延长度时判断输入管脚的高低电平来获取到输入值是0还是1,以下是之前在单片机使用中断实现的代码。

	//由波形判断收到信号,确认IR信号出现
	while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
	{delay(1);}
	for (j=0;j<4;j++)//收集四组数据
	{ 
		for (k=0;k<8;k++)//每组数据有8位
		{
			while (IRIN)//等 IR 变低电平,跳过4.5ms的前导高电平信号
			{delay(1);}
			while (!IRIN)//等 IR 变为高电平
			{delay(1);}
			while (IRIN) //计算IR高电平时长
			{
				delay(1);
				N++;           
				if (N>=30)//过长
				{ EX0=1;return;}//0.14ms计数过长自动离开。
			}//高电平计数完毕                
			IRCOM[j]=IRCOM[j] >> 1;//数据最高位补“0”
			if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}//数据最高位补“1”
			N=0;
		}
	}

确定了这个思路后就开工,通过Java下的Pi4j对树莓派的IO口进行控制,刚开始实现就发现了难题,因为Java的没办法实现红外接收时序中微秒范围内的严格定时限制,所以根本无法获取到正常的红外输入。

3.另辟蹊径:新的构思

此路不通只能另寻他法,通过搜索也没有找到任何Java下的实现方法。别无他路,只能从源头开始思考,树莓派各种介绍标准获取红外输入方法都是通过安装lirc,配置后,通过mode2测试获取到红外的输入。

mode2 -d /dev/lirc0

穷尽所有的办法后,唯一思路只能Java调用mode2获取其输出的信息,通过输出的信息值来截取判断红外接收到的输入。

4.站巨人肩:修改实现

重新确定思路后,再次开工,正准备写时无意中在Pi4j的pi4j-example-crowpi中发现有Java接收红外输入的demo,CrowPi是一款集成树莓派的和具备一些常用模块的学习机,其本质还是树莓派,pi4j-example-crowpi是Pi4j专门针对其的例子。研究了一下其中的红外接收实现与自己构思的思路一致,真是英雄所见略同!
原demo的地址详见Pi4j
https://github.com/Pi4J/pi4j-example-crowpi
实现类在\src\main\java\com\pi4j\crowpi\components\IrReceiverComponent.java
调用验证在\src\main\java\com\pi4j\crowpi\applications\IrReceiverApp.java
下面下载链接是个人经过修改的代码实现,如有需要可自行下载
https://download.csdn.net/download/ccxx12589/87338760
翻译了其中的注释,修改为适应Java1.8的实现,注释了log减少了依赖,整合为单个文件即可实现接收功能。
在树莓派下使用IDEA进行运行测试程序验证,按下遥控器相应按钮获取的输出键值均正确。
IR接收验证

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值