×

Grove IR通用远程项目

消耗积分:0 | 格式:zip | 大小:0.01 MB | 2022-12-29

刘辉

分享资料个

描述

请参阅我的ArduinoBasics 博客上的原始项目帖子

该项目将普通的 Keyes 红外 (IR) 遥控器转换为可编程的通用遥控器。

使用 Arduino UNO 和各种 Seeedstudio Grove 模块,只需按下 Keyes 遥控器上的一个按钮即可将其转换为精确的索尼 IR 信号组合。如果需要,您可以从多个遥控器分配信号组合。一个示例组合可以是:

  • 打开电视,然后切换频道。
  • 打开电视、音响系统和空调。
  • 将音量调高 3 倍。

只需按下 Keyes 遥控器的一个按钮,就会出现整个索尼信号级联。该项目可以针对其他 IR 方法进行定制,但是,您可能需要修改 Arduino 代码以适应它们。

所需零件

 

 
poYBAGOrwuGAcFQNAAF1cvpqhrM702.png
所需零件
 

可以在此处找到有关 Grove 模块的更多信息:

**请注意:Grove Base 扩展板在模拟端有 14 个引脚,在数字端有 18 个引脚。检查您的 Arduino UNO(或兼容板)上的引脚数量,以确保防护罩能够很好地位于顶部。与具有 Arduino Duemilanove 排针布局的 Arduino 板不兼容。

开发环境

虽然有许多Arduino IDE 替代品,但我建议您为该项目使用官方 Arduino IDE 。我使用了适用于 Windows 10 的官方 Arduino IDE 应用程序 (v1.8.5)。确保在此处获取适用于您的操作系统的最新版本

需要图书馆

Arduino 代码中将使用以下库:

电线库

Wire库用于 Grove LCD 屏幕的 I2C 通信,并内置于 Arduino IDE 中 - 此库无需额外下载

IRLib2 库

IRLib2库实际上是一组 IR 库,可以从 GitHub 下载 - 这里在这个项目中,我将发送和接收NEC 和 Sony IR 远程信号。所需的库(在集合中)将是:

  • IRLibRecv.h
  • IRLibDecodeBase.h
  • IRLibSendBase.h
  • IRLib_P01_NEC.h
  • IRLib_P02_Sony.h
  • IRLibCombo.h

rgb_lcd.h库简化了液晶屏的操作从 GitHub下载rgb_lcd.h 库。将 rgb_lcd.h 库 ZIP 文件安装到 Arduino IDE 中:

  • 加载 Arduino IDE
  • 导航到Sketch > Include library > Add.ZIP library...
  • 选择从 GitHub 下载的 zip 文件,然后按“打开”按钮
  • 通过导航到检查它是否正确安装

文件 > 示例 > Grove-LCD RGB 背光

Arduino代码

最好在进行任何连接之前将 Arduino 代码上传到威廉希尔官方网站 板。这样你就可以防止 Arduino 意外地向组件发送电流。该代码在我的 GitHub 存储库中可用或者您可以查看代码部分。此代码是为 Arduino UNO 编写的,如果您使用不同的开发板,可能需​​要修改。

连接说明

如果您使用的是 Grove Base Shield (v2)。连接非常简单。使用下表作为指南。请注意,上面的代码假设有以下连接。

 
pYYBAGOrwuaAJFQQAABFXMxF-_Y070.png
连接表
 

 

根据上表,您将使用 Grove 通用 4 针带扣电缆,并将一侧连​​接到 Grove 底座屏蔽上的 D2,另一侧连接到 Grove 红外发射器。底座护罩上的 D3 将连接到 Grove 红外线接收器,依此类推。您可以将 16x2 LCD 模块连接到 Grove 底座屏蔽上四个 I2C 连接器中的任何一个。

如果您没有 Grove Base 扩展板,您可以选择使用母对公跳线(连同面包板)。但是只获得底座屏蔽并使用通用连接器会更容易。

 
pYYBAGOrwuqAIWjdAAFIoj6d_FQ247.jpg
连接
 

项目说明

当你给 Arduino 通电时,首先出现在 LCD 屏幕上的是:

 
poYBAGOrwu6AVatpAABVKgUcgq4119.png
按按钮开始
 

 

按下 Grove 按钮(连接到 D5)后,它会显示以下消息:

 
pYYBAGOrwvKAf_W0AABIXZMAVv4139.png
凯斯信号#1
 

 

这是按下并从 Keyes 遥控器向红外接收器(连接到 D2)发送信号的提示。Arduino 将解码 Keyes 远程信号,将值存储在数组中,并在 LCD 上短暂显示信号。LCD 现在应该显示一条消息:

 
poYBAGOrwvWAKuGWAABJw6LItKQ535.png
索尼信号 #1
 

 

此消息提示按下并将第一个信号从索尼遥控器发送到红外线接收器。Arduino 将解码索尼遥控信号并将其存储在不同的阵列中,并在 LCD 上短暂显示。在此过程的这一步,您可以选择最多向红外接收器发送三个 Sony 信号组合。您可以发送的最小 Sony 信号数为零。告诉 Arduino 您不想在此步骤中向接收器发送任何进一步的 Sony 信号的方法是按下 Grove 按钮(连接到 D5)。Arduino 被编程为接收总共 5 个 Keyes 信号,每个信号最多可以与 3 个 Sony 信号组合配对。记录完所有信号组合后,您将收到一条消息:

 
poYBAGOrwviATUy_AABXqVStm1c164.png
记录模式完成
 

Arduino 现在将进入最终的“通用远程模式”。在此模式下,它将侦听之前记录的任何 5 Keyes IR 远程信号,并将发送相关的 Sony 信号组合作为回报。例如,如果您按下 Keyes 遥控器上的数字 1,您可能会收到它,这样 Arduino 就会传输索尼信号组合以打开电视并跳转到特定频道。LCD 将显示每个正在传输的信号。您将知道您处于“通用遥控器”模式,因为 LCD 将显示:

 
poYBAGOrwvqAIjKFAABRXPpCE20800.png
收听信号......
 

虽然你可能想在这个阶段扔掉你的索尼遥控器(因为你不再需要它)......我会坚持以防万一。信号不会永久存储。当 Arduino 断电时,它们会消失。但它不一定是那样的。您可以轻松修改代码以将其存储在 eeprom 存储器或其他内容中。这不是您可以更改的唯一内容。从技术上讲,您可以记录任何遥控器的信号,但是,您可能需要包含其他库或代码以适应备用遥控器符号。您还可以修改 LCD 屏幕上的文本消息,使之对您更有意义。LCD 每行只能显示 16 个字符。因此,当您想出有创意的字幕时,请记住这一点。我还想提一下我选择不使用 Seeedstudio 的 IR 库的原因,是因为它占用了太多内存。他们的图书馆可能容纳范围广泛的符号体系。我选择了 IRLib2 库,因为我只能选择我使用的符号体系(索尼和 NEC)。从而减少运行项目所需的内存总量。事实上,我发现许多 Seeedstudio 的库都非常耗费内存。我最初想创建一个手势控制的遥控器。但由于累积内存需求,库组合消除了这种可能性。我发现许多 Seeedstudio 的库非常耗费内存。我最初想创建一个手势控制的遥控器。但由于累积内存需求,库组合消除了这种可能性。我发现许多 Seeedstudio 的库非常耗费内存。我最初想创建一个手势控制的遥控器。但由于累积内存需求,库组合消除了这种可能性。

请注意:上面的 LCD 屏幕截图是使用Alexander Avtanski 的“ LCD 屏幕截图生成器”生成的。

 
pYYBAGOrwv2AQ-n9AAFtmAiC-WU993.jpg
项目在行动
 

 

 
poYBAGOrwwCAZzNXAAFHuQgO2zE761.jpg
LCD 和按钮
 

 

 
poYBAGOrwwqAQQvvAADU5e7hJPM384.jpg
Grove 红外接收器
 

结论

IRLib2 库是该项目成功的关键。如果没有那个图书馆,这个项目会困难十倍。我对这种记录/回放技术的有效性感到非常惊讶。用便宜又讨厌的 Keyes 遥控器操作我的 SONY 电视感觉很奇怪。这是非常超现实的。当我选择以这种方式控制我的电视时,我可以从我的其他遥控器之一使用红外信号轻松记录信号。随着越来越多的设备可以通过遥控器进行控制,我将越来越多地考虑将这个项目变成我家里的永久装置。手势控制的遥控器本来不错,但是,看来我现在必须为该模块找到其他用途。

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'Grove IR通用远程项目',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);