有屏幕的地方就有Bad Apple!!--基于arduino的led视频显示

[复制链接]

0

主题

0

帖子

118

积分

二氧化硅

Rank: 2

积分
118
查看: 2735回复: 0 发表于 2018-12-10 00:05:53   只看该作者
本帖最后由 sjZhu 于 2018-12-13 17:51 编辑

      神说:”要有光。“,于是这世界上便有了光。可既然有了光,那么这世界上就肯定有发光的东西,于是就有了屏幕。就这样,在坊间就流传着这样的一个传说:在每一个可以发光的地方,人们总会在上面发现一串神秘的连续图案,而这些神秘的图案中,开头和结尾总会有一个苹果的阴影。于是人们把那个神秘图案唤作Bad Apple。这就是”有屏幕的地方就有Bad Apple“的来历。(楼主注:以上一段话为无限只猴子在无限时间内打出的这么一段逻辑条理清楚的话,不代表本楼主的意见。)                        原本在高考完之后想在假期做一个Bad apple!!玩玩,后来买了新的游戏本,就义无反顾地去反恐了(捂脸)。后来开学后,学校举办了一个课外科技作品大赛(说到这里肯定就会朋友知道我是哪个大学的了),就趁着这个机会,以此为题做了一个作品出来。
      下面开始介绍制作流程:
一、硬件篇——级联LED点阵屏的制作
      说实话,淘宝上的LED点阵屏要多大的就有多大的,完全不用如此大动干戈地去制作一个点阵屏出来,但既然是课外作品制作,不从头做起就挺没意思的,于是准备了级联LED点阵的材料:
Arduino Uno R3;74hc595;多个8*8LED点阵;74hc154。
      思路大致如下:
      LED点阵屏主要有静态显示与动态扫描两种驱动方式。静态显示的展示效果好,但存在占用端口多以及点阵内部构造导致的相邻LED同时点亮的问题,因此选用动态扫描的驱动方式。
      Arduino Uno R3的作用是通过串口与上位机联系获取每帧图像,并对点阵屏进行驱动和显示,此处的代码放在软件篇。
      在这里我选用了74595和74154两种数字逻辑芯片。74595是一种8位串行输入,并行输出的移位寄存器,如果玩过单片机的话应该对此芯片并不陌生,此处便不再介绍。74154是一种4-16线译码器。74154有4个高位有效的地址输入端,通过输入4位二进制数,来控制相应的输出端进行低位输出。例如在74154的DCBA四个输入端输入L,L,H,H四个电平,即为输入0011,那么Y3端就输出低电平,其余输出端仍然输出高电平。下面贴上74HC154的真值表:
      从表中可以看到只有当G1,G2两个使能端同时输入低电平时,74154才有效,因此设计电路时需要将G1,G2两个输入端都接地。我们通过改变四个地址输入端的输入电平,即可控制单行LED的点亮,从而通过行扫的方式实现点阵的动态扫描。
      在市面上同时存在着共阴和共阳两种8*8点阵,两种点阵所设计的电路也稍有不同。此处楼主选用的LED点阵是1088BS,一种共阳LED点阵。至于LED的限流电阻,我在设计时并没有选择加入。因为动态扫描主要通过LED的余晖与人眼的视觉残留来进行视频的显示,所以单个LED的点亮时间很短,也就没有加限流电阻的需要。

      下面贴出LED点阵的原理图:
原理图.png
原理图看起来很简单,于是我就拿起了洞洞板焊起了点阵,最终也做出了一个半成品。
放一下初版点阵的正面:


IMG_20181213_092433.jpg
看起来还可以是吧,那反面可就emmmmm
前方注意!高能预警!!!!!









IMG_20181213_092446.jpg
在这里说一下,我当时买材料是手残买了一块双面板,因此为防止焊锡在反面短路而没有直接在洞洞板上直接走锡,而是采用飞线的方式。但这个飞线的密度。。。。。。emmmmm,怒砸板子。反正最后调试了半天也没有效果。之后就采用画PDB的方式。
这是画的PCB文件:
pcb1.png pcb2.png
所以大佬们就不要在意什么元件把标号压住,布线走出了45度角等问题了,萌新我第一次打板也是心惊胆战的。

最后做出的实物:
IMG_20181213_092750.jpg
这里说一下排针旁为什么单独焊上了杜邦线而不是插上杜邦线的。因为在一开始调试时点阵屏出现了严重的拖影问题,我估计是杜邦线太长导致的信号之间电磁不兼容问题,后来就在某大佬的提示下把杜邦线截掉一半焊上去了,最后拖影问题完美解决。
最后放上实物链接图:
IMG_20181213_092950.jpg

二、软件篇
       这里我采用的是MATLAB作上位机软件用来将视频每一帧转化为二进制储存在bin文件中,之后通过串口向下位机发送每一帧的图像数据,下位机再控制点阵的显示。
下面放出代码:
1、 图像的二值化处理
二值化.png

在这里我并没有用到常用的字模提取软件,是因为从视频中提取出每帧图像的操作太过繁琐,且楼主没有找到在我电脑上可堪一用的批量提取字模的软件,于是就用万能的matlab做了一个图像二值化的程序出来。
2、 上位机程序
先在前面说明一下,在这里上位机控制发送每一帧数据的操作是:当下位机显示完当前帧后,再向上位机发送返回值;上位机收到返回之后在发送下一帧数据,从而实现单帧数据的发送。
上位机1.png 上位机2.png

3、 下位机程序
下位机1.png
下位机2.png
三、显示篇
由于arduino UNO R3的MCU是ATMEGA328p,一个8位的单片机。因此它的速度并不高,从而导致两帧显示之间等待串口输入的时间过长,亮度和频闪现象比较严重。但是楼主并没有找到合适的优化方案,所以欢迎各位大佬指教。
下面放出最终效果:
前方高能!!!全损音质,瞎眼操作!!!!










好像放不出视频,那把网址贴上来吧:http://v.youku.com/v_show/id_XMz ... j.8428770.3416059.1

最后放出原理图和源码文件:
bad apple.rar (104.74 KB, 下载次数: 4)
上位机1.png
上位机2.png

bad apple.rar

104.74 KB, 下载次数: 7, 下载积分: 积分 -1

快速回复 返回顶部 返回列表