我的账户
我国电子DIY

科技成就未来

亲爱的游客,欢迎!

已有账号,请

如没有注册?

  • 客服电话

    在线时刻:8:00-16:00

    客服电话

    000-000-0000

    电子邮件

    ndiyadmin@163.com
  • 手机版

    电子DIY手机版

    随时随地把握网站动态

  • 官方微信

    扫描二维码

    免费获取约请码

【光立方】初级教程,含 原理图+源代码+经历

  [仿制链接]
41886 94
爱上科技 宣布于 2015-5-2 09:28:48 | 只看该作者 |阅览形式 打印 上一主题 下一主题

光立方,我在三年前从一个国外网站上就见到了。那时分刚开端玩电子,就汗水一热,开端做光立方。费了一个星期的功夫才把主题的LED显现体建立完结了,而且其时的焊接功底实在不敢恭维。(后边有图为证)

后来由于结业的原因,没有持续做下去,光立方被我作为装饰品放再书桌上。

本年上半年的时分,看到了许多人的著作,想起我那个光立方。回忆起当年的韶光,决议将它持续做完。

很顺畅,不管是硬件建立仍是软件编程。

我看了许多教程,比较来说,我最开端看的老外的比较好。他们用的元件并不是咱们常用的元件,可是上面的理论解说很重要。

假如真的想做好,有必要懂得原理,而不是一味的仿制。不知道有哪些朋友现已做过很好的教程,我把我的主意共享出来,供咱们参阅学习。

概要

首要,我的著作并没有完结多么炫的作用,我仅仅建立了一个规划的渠道。尤其是比较简略批改的显现程序,要炫的作用,完全能够咱们自己规划!!!!

第二,硬件上,可能与平常咱们所见的不同(受多个规划计划的影响,没选好一个计划),但我会介绍怎样元件替代(包括单片机、队伍驱动芯片的替换)。

第三,内容写得比较笼统,期望咱们细心看,而且多看他人著作,多看程序代码,先考虑了再问,不是说不想答复,仅仅不想答复没有考虑过的问题。

第四,规划归于睡神耗子自己所想的,所以和你曾经见过的光立方能够不相同的架构。一位网友给我看了另一种电路,确实是规划精妙。不过本规划关于规划程序,以及了解是比较简略的。能够作为初级的教程来看。

第五,规划运用了许多网络的上图片资源。由于自己在制造的时分没有留下相片,而且说实话,做得挺丑陋的!所以不多配自己的图了。

著作展现

规划的挺丑陋,各位大侠就别计较了,各位菜鸟就知道有这么几个部分组成就能够了。






这是我仿制的杜洋的光立方显现作用(懒,未仿制悉数,部分作用也欠好)

以上仅仅阐明我能造出来啊!!!

这是源文件(批改电路图的过错):

光立方.rar (275.37 KB, 下载次数: 234)



下面是重头戏。

榜首.光立方主体焊接

这个没有什么好法子,咱们渐渐,细心的焊接吧。检测焊接功夫和耐性的时刻到了。

给几个他人的图做参阅。



先找个木板钻8*8=64个孔,(什么,你没有木板和电钻。那找个替换,真不可,上纸箱板)。每个孔的距离相同,详细多长,量一下LED的负极(短的管脚)。比那个长度小大约3~5mm就差不多了(详细值,咱们量一量就行了)。

然后弯管脚。为了确保光立方是个正方体,一般状况,都是弯短脚(负极)。

留意方向恣意,可是一切的LED是一个方向,详细方向,就看个人喜好了。

8个LED焊接在一块,一共焊接8条,然后将这8条的LED灯链的一端(短引脚没焊接)焊接在一块。

为了健壮,再在中心及另一端焊接个铜线。留意,要确保铜线是焊接在负极(短管脚上)

这样,一层就完结了。

总结下,焊接的方法是将一层的负极接到一块。(当然你非要正极接一块,也是能够的)。

如此重复,一共焊接8层,然后,将相同的长管脚焊接在一起。(或许,你一层层向上盖楼也行~!~)。

你会发现每一层都会空余一个管脚未焊接,我就把这个管脚作为层的操控端用了。

如上图所示,会发现每一层相同方位的LED的正极(长管脚,赤色所指的)衔接在一起,信任聪明的童鞋,知道怎样操控光立方的某一个灯亮了:

在正极上加正电压,在层的操控端上加负电压即可了。

第二:显现原理

为了下面层驱动与阵列驱动的解说,想阐明一下光立方的显现原理。

玩过LED点阵或多位数码管的童鞋,更简略了解——对,动态扫描原理。

其实不同层的灯是不可能同是亮的。那么人怎样感觉亮呢,只需LED等闪得足够快,就能够了。人眼的视觉暂留大约24帧/秒(这也是为什么电影大多是这个值,请检查你电影文件的特点)。那么只需你能够将LED灯闪到这个速度就没问题了。关于电路来书,μs(奇妙)级是很简略完结的,所以,这不是问题。

光立方其实就适当于64*8的LED点阵。你理论上只能让一层(64)的灯能够随意亮灭(一向坚持,而且不彼此搅扰)。

当必定的速度,先点亮榜首层,然后再点亮第二层……一向循环,就到达你要的作用了。

写得笼统,不明白得童鞋,去看看LED点阵,或许多位数码管的显现原理就能够。

第三:层驱动电路

层选,是要求这一层的操控端加负电压(由于这一层的负极都接一块了)。那么咱们很简略的想用三极管的开关作用就能够了。对我就直接运用的三极管。

****有热心网友发现了我的过错,8550是PNP型三极管,而我写文章,画电路都写的NPN,我检查了下,是我自己的忽略,实在规划是PNP,程序也是依照PNP写的。在此,十分感谢给予批判协助的人。*******

MCU是单片机操控,一般要串个电阻,用来限流,这儿讲原理,就不画了(详细去看附件中的原理图)。Layer_x指某一层的操控端。加了一个上拉电阻,确保平常状态下操控端处在高电压(那样就不会亮灯了。)

当MCU输出高时,PNP三极管就导通了,Layerer_x就衔接到地上,那么层选就翻开了。

PNP型三极管有许多,比方我用的便是S8550,信任许多童鞋是用过的。

有些童鞋说,他们见他人用的不是三极管,而是ULN2803。我曾经是没用过的,查了查:是八路NPN达林顿衔接晶体管,也便是说其实里边就适当于集成了8个三极管,用起来更便利。所以,咱们手头有什么就用什么呗。

啥,ULN2803怎样用?看下图,我懒得画封装图了,用一个插座替代了,管脚次序可没有改,别照抄啊!!!!

我的规划里,用了16个S8550,2个一组。原因是为了避免一个三极管承受不了这么大的电流(64个LED灯的电流)。

第四.阵列驱动

这是我起的姓名,也便是一层64个灯的驱动。

64个灯,驱动那是适当麻烦了,用单片机直接驱动是不现实的,管脚不行,电流太大。那么咱们考虑拓宽单片机的IO口。

用许多芯片是能够用的:例如HC164, HC377,HC573,HC574,HC595等等。只需有8位输出就能够。咱们用的比较多的应该是HC573,开始的时分我照着葫芦画瓢,非要买HC574。它俩没有什么大差异,仅仅锁存的信号不相同算了。

借用一个574的图(573相同的接法,CLK改为HC573的LE即可)。有八片HC574,每一个HC574能够输出8位,这样就能够一起输出64位了,对应64个灯。

HC138是为了节约管脚的,我图省劲,就直接用单片机的管脚接每个片子。

数据线是共用的,一次给一个片子写数据,轮番写,将一切的片子写完。那么阵列驱动数据就完结了。

当使能输出(许多片子有OE端),层选翻开时,就能够点亮特定的灯了。

附HC164和HC595的驱动图。这两个片子都是串行转并行了,运用的单片机管脚更少一些!!

留意:一切输出端要加限流电阻,至于加多大,要看你的LED灯了。一般状况下的直插LED灯,赤色的加的电阻大一些,绿色的小一些,实际状况自己测验就能够了。

必定要先核算一下你需求多大的电流,由于这联络到你选用多大电流的电源。

当然,一般状况下,最多亮64个LED(瞬间只能亮64个)。一般的充电器类都能到达这个电流水平(什么,你要用电池!别扯了***)。

第五.操控板

能够选用的单片机是许多的。

考虑管脚够用,至少也要十几个IO口吧。用个DIP40,LQFP32妥妥的。

51.AVR.PIC……随意哪个都能够,便利、易学、好买上挑选,用STC的51就行了。我用了库存的STC12C5A60S2,信任这个单片机许多人都在用。

当然你用STC89C系列或许STC15系列也是能够的,他们差异在守时上,我运用的是守时器,你能够用STC给的东西来批改守时时刻。


第六.程序

信任许多人都不喜爱这个。

见许多童鞋做好的电路,处处找程序。为了不改程序,能照搬电路就照搬。当出了问题也不知道是硬件仍是软件的问题。

好吧,刚好我是苦逼的程序员。好歹也写了两年程序。

以下是解说,其实讲得欠好,由于自己的水平,还有程序这事便是多磨多练的功夫。

我用的是KEILC51,信任许多童鞋,看到这么多文件就傻了。不必忧虑,文件多了,许多文件你底子不必了解。

Main,是主程序。App是运用文件,comAssistant是串口帮手,stc12cIntProcess是中止函数。还有一堆displayxx是显现作用函数。

简略的说,主程序调用APP文件中的函数,App函数又调用displayxx(xx表明01,02什么的)函数,来显现特效。

由于我运用的是HC574+MCU层选,可是有许多其他方法能够运用。批改app.c文件中的CubeLoop函数即可。由于各种计划许多,如有需求,请留言讨教之。

我将显现作用规划成8*8的数组。由于数组元素是unsigned char(uint8_t)型,也便是说每一位表明一个LED灯。你只需在displayxx函数里批改cubeBuf[8][8]这个数组即可。 阐明一下,这个数组是怎样对应的光立方的LED的。数组每一个元素(char型),对应每一层一切相同方位的LED灯(即正极相连的),请看第7图那个赤色对应的一条灯链。 还有,我为了便利规划,将更新显现最小的单位是100ms,即0.1s。也便是说,你想显现改写的速度最快是100ms,其实这个时刻是相对比较长了,能够改短一点,程序在stc12cIntProcess.c中第61行:

if(++cubeCounter>10)

{

cubeCounter = 0;

cubeUpdateFlag = TRUE;

}

把10改小一点就能够了。




参加人数 3奉献 +8 刀币 +20 收起 理由
逆天小白兔 + 8 + 5
中心小学 + 5 赞一个!
diyhome + 10 支撑DIY精力!

检查悉数评分总评分 : 奉献 +8 刀币 +20

保藏
保藏26
共享
共享
支撑
支撑2
对立
对立0

精彩谈论94

跳转到指定楼层
引荐
 楼主| 爱上科技 宣布于 2015-5-2 09:29:07 | 只看该作者
  1. /* Extern Fuction -------------------------------------------------------------*/

  2. extern bool_t Display01(void);

  3. extern bool_t Display02(void);

  4. extern bool_t Display03(void);

  5. extern bool_t Display04(void);

  6. extern bool_t Display05(void);

  7. extern bool_t Display06(void);

  8. extern bool_t Display07(void);

  9. app.c文件中的void CubeBufReload()函数式调用显现函数的当地。

  10. /*Reload graphical or switch grahical*/

  11. switch(cubeGraphical)

  12. {

  13. case GRAPH_01:

  14. if( TRUE == Display01())

  15. {

  16. cubeGraphical = GRAPH_02;

  17. cubeStage = 0xFF;

  18. }

  19. break;

  20. case GRAPH_02:

  21. if( TRUE == Display02())

  22. {

  23. cubeGraphical = GRAPH_03;

  24. cubeStage = 0xFF;

  25. }

  26. break;

  27. case GRAPH_03:

  28. if( TRUE == Display03())

  29. {

  30. cubeGraphical = GRAPH_04;

  31. cubeStage = 0xFF;

  32. }

  33. break;

  34. case GRAPH_04:

  35. if( TRUE == Display04())

  36. {

  37. cubeGraphical = GRAPH_01;

  38. cubeStage = 0xFF;

  39. }

  40. break;

  41. case GRAPH_05:

  42. if( TRUE == Display05())

  43. {

  44. cubeGraphical = GRAPH_06;

  45. cubeStage = 0xFF;

  46. }

  47. break;

  48. case GRAPH_06:

  49. if( TRUE == Display06())

  50. {

  51. cubeGraphical = GRAPH_07;

  52. cubeStage = 0xFF;

  53. }

  54. break;

  55. case GRAPH_07:

  56. if( TRUE == Display07())

  57. {

  58. cubeGraphical = GRAPH_01;

  59. cubeStage = 0xFF;

  60. }

  61. break;

  62. default:

  63. cubeGraphical = GRAPH_01;

  64. cubeStage = 0xFF;

  65. break;

  66. }

  67. 函数很长,不必看这么多,看一个即可。

  68. case GRAPH_07:

  69. if( TRUE == Display07())

  70. {

  71. cubeGraphical = GRAPH_01;

  72. cubeStage = 0xFF;

  73. }

  74. break;

  75. 当时显现作用为DISPLAY07,假如显现完(TRUE==)建立,切换为显现作用GRAPH_01,cubeStage==0XFF指将显现阶段定位到:显现作用的榜首个显现(显现作用是一连串的显现组成)。CubeStage==0xFF不明白得童鞋,就照抄就能够了。

  76. 持续,显现作用函数的格局也是好了解的,例如Display01()

  77. bool_t Display01(void)

  78. {

  79. uint8_t i,j;

  80. bool_t endFlag = FALSE;

  81. switch(cubeStage)

  82. {

  83. case 0: //Clear all

  84. for(i = 0;i<8;i++)

  85. {

  86. for(j=0;j<8;j++)

  87. {

  88. cubeBuf[i][j] = 0x00;

  89. }

  90. }

  91. break;

  92. case 1:

  93. cubeBuf[0][7] = 0x01;

  94. break;

  95. case 2:

  96. cubeBuf[0][6] = 0x01;

  97. break;

  98. case 3:

  99. cubeBuf[0][5] = 0x01;

  100. break;

  101. case 4:

  102. cubeBuf[0][4] = 0x01;

  103. cubeBuf[0][7] = 0x00;

  104. break;

  105. case 5:

  106. cubeBuf[0][3] = 0x01;

  107. cubeBuf[0][6] = 0x00;

  108. break;

  109. case 6:

  110. cubeBuf[0][2] = 0x01;

  111. cubeBuf[0][5] = 0x00;

  112. break;

  113. case 7:

  114. cubeBuf[0][1] = 0x01;

  115. cubeBuf[0][4] = 0x00;

  116. break;

  117. case 8:

  118. cubeBuf[0][0] = 0x01;

  119. cubeBuf[0][3] = 0x00;

  120. break;

  121. case 9:

  122. cubeBuf[1][0] = 0x01;

  123. cubeBuf[0][2] = 0x00;

  124. break;

  125. case 10:

  126. cubeBuf[2][0] = 0x01;

  127. cubeBuf[0][1] = 0x00;

  128. break;

  129. case 11:

  130. cubeBuf[3][0] = 0x01;

  131. cubeBuf[0][0] = 0x00;

  132. break;
  133. case 12:

  134. cubeBuf[4][0] = 0x01;

  135. cubeBuf[1][0] = 0x00;

  136. break;

  137. case 13:

  138. cubeBuf[5][0] = 0x01;

  139. cubeBuf[2][0] = 0x00;

  140. break;

  141. case 14:

  142. cubeBuf[6][0] = 0x01;

  143. cubeBuf[3][0] = 0x00;

  144. break;

  145. case 15:

  146. cubeBuf[7][0] = 0x01;

  147. cubeBuf[4][0] = 0x00;

  148. break;

  149. case 16:

  150. cubeBuf[7][0] = 0x03;

  151. cubeBuf[4][0] = 0x00;

  152. break;

  153. case 17:

  154. cubeBuf[7][0] = 0x07;

  155. cubeBuf[5][0] = 0x00;

  156. break;

  157. case 18:

  158. cubeBuf[7][0] = 0x0F;

  159. cubeBuf[6][0] = 0x00;

  160. break;

  161. case 19:

  162. cubeBuf[7][0] = 0x1F;

  163. break;

  164. case 20:

  165. cubeBuf[7][0] = 0x3F;

  166. break;

  167. case 21:

  168. cubeBuf[7][0] = 0x7F;

  169. break;

  170. case 22:

  171. cubeBuf[7][0] = 0xFF;

  172. break;

  173. case 25:

  174. endFlag = TRUE;

  175. break;

  176. default:

  177. break;

  178. }

  179. return endFlag;

  180. }

仿制代码
至于显现作用的规划,批改displayxx.c文件即可。每一个文件中都只要一个bool_t Display01(void)程序,其间序号01对应displayxx.c文件的序号。该函数名必定要在display.h中声明,这样app.c文件才干调用。

这个有25个显现面组成的。

也便是每一个显现面都逗留100ms,当然,你能够让多个显现面显现一个作用。

留意的是最终一个显现面必定要有这句话endFlag = TRUE;,这是阐明这个显现作用完毕了。

这样,程序我就解说完了,不过很笼统,咱们想了解,就多研讨程序,不明白就问。

我稍讲一下编译的问题,许多童鞋常常问为什么编译不出来,其实IDE现已奉告的很清楚了。不明白就去网上搜搜,再不明白留言,至于像undefined这种编译过错最好不要问了。。。

还有许多人找不到代码的方位——啥,用查找啊!KEIL东西栏有个望远镜的哪里有个输入框便是,windows下的程序基本上都是ctrl+F键能够直接调用查找的!还有,盯梢函数,你看到一个函数,不知道函数体在哪里?点击到函数名中,右击选“go to define……”就能够了。睡神耗子先帮你到这了。

还有一个要害的当地,做显现库。也便是怎样给cubeBuf[][]赋值。咱们自己去研讨下,看看显现出来什么姿态就能够了。我写的显现函数是对应视频的显现作用。

能够确认的是cubeBuf[][]一切元素赋值为0xFF,便是光立方全亮,都是0x01就只显现一层,最上层或最基层,都是0x00,光立方全平息。

附件中有取模软件,兼容我的程序。有点笼统。咱们要好好培育自己的立体感。。。
93#
郑嘉顺 宣布于 2019-7-2 20:13:20 | 只看该作者
谢谢楼主共享。            
92#
528 宣布于 2019-5-25 14:51:04 | 只看该作者
这个东西自己做仍是凶猛的,我之前玩过他人做的16x16x16的  四千多颗灯,十分炫酷
91#
JerryQin 宣布于 2018-7-28 20:54:20 | 只看该作者
不能用洞洞板做嘛,不过也是凶猛
90#
zlx1120 宣布于 2018-7-26 11:27:56 | 只看该作者
大赞,高手!谢谢楼主共享
89#
ChenAn 宣布于 2018-6-3 15:33:53 | 只看该作者
感谢共享嘻嘻嘻嘻
88#
bhzjr 宣布于 2018-5-29 19:11:35 | 只看该作者
楼主辛苦了,下来看看。
87#
123qweasdzxc 宣布于 2018-5-19 20:53:53 | 只看该作者

大赞,高手!感谢共享
86#
123qweasdzxc 宣布于 2018-5-14 19:45:26 | 只看该作者

谢谢楼主共享         
85#
凶暴自己人 宣布于 2018-5-1 20:58:29 | 只看该作者
感谢楼主资料完整共享!
84#
yechuan220 宣布于 2018-4-19 12:43:52 | 只看该作者
楼主高手!感谢共享
您需求登录后才干够回帖 登录 | 注册

本版积分规矩

重视咱们
我国电子DIY官方微信

客服电话:000-000-0000

客服邮箱:776513803@qq.com

周一至周五 9:00-18:00

公司地址:深圳市南山区美丽湾大厦B座

Powered by X3.4@ 2001-2013