×

128x64 LED平板显示器开源分享

消耗积分:0 | 格式:zip | 大小:0.47 MB | 2023-06-26

mintsy

分享资料个

描述

在看到我最近的项目(Servo Motor Art)获得的大量意见后,我决定我可能应该分享我的其他一些基于 Arduino 的项目。圣诞节时,我把它放在我的前院里来招待附近的孩子们。我知道它曝光过度 - 太多对比度等,但你可以明白这个想法:

 

我在这里包括用于迷宫解算器和圣诞节表演的软件,以及万圣节表演和其他几个应用程序。它们都包含在一个 Zip 文件中,您可以下载。

这实际上是我的第三个 LED 显示屏。要查看历史并更多地了解这些东西是如何工作的,我提供了一个链接。这是补充阅读,但确实为您提供了一些有关这些面板如何工作以及如何对它们进行编程的有趣信息:LED 显示屏背景

我还提供了另一个链接。这是购买面板的数据表。我的显示器实际上由 4 个面板组成,但这将为您提供有关这些面板操作的一些深入信息:LDP-6432 数据表(我们的面板实际上是型号 P7.62v2,而不是 LDP-6432,但数据上面的表格很好,因为差异只是物理尺寸。)

实体建筑

我有 4 个面板,每个面板有 64 个横向 LED 和 32 个纵向 LED。我将它们两个横向安装,两个向下安装,以获得 128 个 LED 横向和 64 个 LED 高度的显示器。它们安装在一块 2 英尺乘 4 英尺的泡沫绝缘材料上。我开始使用沉重的胶合板框架,但最终的结果非常重且难以移动。所以我换成了一块 2 英尺乘 4 英尺的泡沫绝缘材料。泡沫被涂成黑色乳胶黑色。它必须是乳胶,因为普通喷漆会溶解泡沫!(我很难找到!)所有面板的背面都有螺丝安装座,您可以将支架拧入其中。我使用了男性/女性对峙,所以两个可以拧在一起。然后我将它们推入泡沫中,直到外部支座完全位于泡沫内部。当一切都在正确的位置时,我把它们拉出来,在每个孔中放一些埃尔默胶水,然后更换面板。这种方法可将面板牢固且永久地固定到位。 但是,在完成电气连接之前不要使用胶水,尤其是 5 伏电源。 在将面板粘合到位后,尤其难以连接电源。将支架插入泡沫时要小心,以将面板紧紧地固定在一起。如果将它们紧紧地推在一起,它们会形成一个连续的大面板,但在面板之间留有间隙会产生非常不理想的外观。

 
pYYBAGPjQw2ACYeyAACZJTiAYrM545.jpg
正面展示了 4 个安装在泡沫上的面板,带有手柄和支架
 

我将 L 形支架放在连接 1 x 2 英寸木头的底部以形成支架。我还在顶部附上了一个把手。由于将任何东西固定到这种泡沫上都有些问题,我使用了超大螺丝并用 Elmer 胶水将它们固定在泡沫中。这种方法效果出奇的好。我可以通过顶部的单个手柄携带整个东西,而且我从来没有从相当脆弱的泡沫中拉出任何东西。

电子硬件

正如我已经说过的,硬件非常简单。四个面板均为双 LED、三色 64 x 32 像素 LED 显示屏。每个像素由一个红色和绿色 LED 组成。四个面板各有 2048 个像素和 4096 个可单独寻址的 LED 元件。每个面板都包含移位寄存器威廉希尔官方网站 ,因此所有 4096 个 LED 都可以仅通过 12 条 I/O 线进行控制。像素可以显示为黑色(即完全不亮)、红色、绿色或黄色(红色+绿色)。

我将面板两横两下安装,以获得横跨 128 个 LED 和高 64 LED 的显示器。

 
poYBAGPjciSATFQDAAPIXgF-WOg887.jpg
背面
 

上面的照片显示了其余的硬件。Arduino Mega 安装在支架上,但除此之外,一切都只是热粘在泡沫上。(在低温下使用 2 温度胶枪。高温会熔化泡沫!)从 Mega 出来的电线迷宫然后分开,一半到顶部的两个面板,一半到底部面板。每个面板都配有 16 针带状电缆。一个用于将顶部的两个面板菊花链在一起。另一个用于菊花链底部的两个。另外两个连接到左侧面板的输入端,然后穿过泡沫上的孔到达背面,我们在此处使用面包板跳线连接到 Mega。

注意来自电源的红色和黑色电线。它们穿过其他孔到达每个面板中央的 5 伏电源端子。虽然看起来有点奇怪,但我使用 USB 充电器为 Mega 供电。(照片中它没有插入充电器。)当我想连接到我的电脑进行编程时,这让我很容易拔掉它并连接USB延长线。

软件

天哪,我从哪里开始?我有大量用于此面板的软件。显然,其中一些对于特定应用程序来说是非常独特的,就像所有生成和解决迷宫的软件一样。但棘手的是为显示器本身提供动力的下划线例程,并且这些东西在每个特定应用程序中重复出现。这里最有趣的两件事是刷新显示的子例程,以及显示静态和滚动文本的子例程。

让我们从刷新子例程开始。这通常由定时中断调用,但由于我稍后会讲到的原因,我们在这里将 Mega 推到了极限,定时中断不起作用。这里使用 Mega 是因为它有很多 I/O 端口,但主要是因为它有 8K 字节的 RAM。虽然我可以存储每个双色 LED 的状态是两位,但使用整个字节会更快。但是对于 8192 个双色 LED,我们不得不在一个字节中存储多个 LED 状态。(否则,我们将在这张表上使用 100% 的 RAM!)

尝试刷新 16384 个单色 LED 已经够糟糕了,但是当刷新过程必须解压缩存储在单个字节中的多个 LED 的数据时,它会花费太长时间。即使使用直接端口访问和大量调整,完整的刷新周期也需要大约 19 毫秒。所以我们是按需刷新,而不是定时中断。Mega 完成了这项工作,但只是勉强!

第二个有趣的主题是显示文本并滚动它。我使用 8 x 8 位字体,它存储在程序内存中的表格中。我的静态和滚动文本子例程采用“Hello”之类的字符串输入,并将其转换为可在面板上显示的字体表中的数据流。让它滚动是一个额外的复杂问题,但子例程可以处理所有这些。你只需告诉它你想要滚动的字符串,你想要它滚动的位置,以及你想要滚动的颜色。

我在一个 ZIP 文件中包含了许多不同的程序或 Arduino 草图。它们都是多文件草图,在 Arduino IDE 中显示为一堆不同的选项卡。每个都包含一些特定于该特定应用程序的代码,以及显示本身的代码,例如文本字体和刷新例程。ZIP 中的 READ_ME 文件解释了有关该软件的更多详细信息。


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

评论(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:'128x64 LED平板显示器开源分享',//标题 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);