极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 30659|回复: 35

[教程]8x8点阵的驱动 Arduino Matrix LED with 74HC595 x2

[复制链接]
发表于 2012-11-21 22:43:29 | 显示全部楼层 |阅读模式
先上完工图,是一个笑脸
IMG_3189.JPG


http://v.youku.com/v_show/id_XNDc4MjIzOTAw.html

一.硬件清单
1. Arduino Mango  x1
2. Matrix LED 8x8  x1
3. 220欧姆电阻     x8
4. 74HC595          x2
5. 迷你面包板       x3
6. 面包线一堆{:soso_e136:}

关于点阵LED这里说一下,发现网上主要有两种规格16Pin和24Pin的
LedMatrix 16Pin.jpg
LEDmatrix 24Pin.jpg

其接线方式和针脚的对应方式如图
LED.png

二. 硬件接线
原理图
sketch.png

接线图
MANGO.png

迷你面包板接线图
board.png

最终的实际测试效果如图
IMG_3184.JPG

三. Arduino软件编程
代码参考了官方教程的ShiftOut[链接]
稍加修改,实现一个笑脸
Smile.png

[pre lang="arduino" line="1" file="MatrixLED"]//**************************************************************//
//  Name    : shiftOutCode, Dual Binary Counters                 //
//  Author  : Carlyn Maw, Tom Igoe                               //
//  Date    : 25 Oct, 2006                                       //
//  Version : 1.0                                                //
//  Notes   : Code for using a 74HC595 Shift Register            //
//          : to count from 0 to 255                             //
//**************************************************************//

//Leo tested with smile(Loop() changed) 2012.11.21

//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;



void setup() {
  //Start Serial for debuging purposes       
  Serial.begin(9600);
  //set pins to output because they are addressed in the main loop
  pinMode(latchPin, OUTPUT);

}

void loop() {
  //Smile for 8x8 Matrix LED
  digitalWrite(latchPin, 0);
  shiftOut(dataPin, clockPin, B01111111);  //mask(col)
  shiftOut(dataPin, clockPin, B00111100);  //row
  digitalWrite(latchPin, 1);

  digitalWrite(latchPin, 0);
  shiftOut(dataPin, clockPin, B10111111);  //mask(col)
  shiftOut(dataPin, clockPin, B01000010);  //row
  digitalWrite(latchPin, 1);

  digitalWrite(latchPin, 0);
  shiftOut(dataPin, clockPin, B11011111);  //mask(col)
  shiftOut(dataPin, clockPin, B10100101);  //row
  digitalWrite(latchPin, 1);

  digitalWrite(latchPin, 0);
  shiftOut(dataPin, clockPin, B11101111);  //mask(col)
  shiftOut(dataPin, clockPin, B10000001);  //row
  digitalWrite(latchPin, 1);

  digitalWrite(latchPin, 0);
  shiftOut(dataPin, clockPin, B11110111);  //mask(col)
  shiftOut(dataPin, clockPin, B10100101);  //row
  digitalWrite(latchPin, 1);

  digitalWrite(latchPin, 0);
  shiftOut(dataPin, clockPin, B11111011);  //mask(col)
  shiftOut(dataPin, clockPin, B10011001);  //row
  digitalWrite(latchPin, 1);

  digitalWrite(latchPin, 0);
  shiftOut(dataPin, clockPin, B11111101);  //mask(col)
  shiftOut(dataPin, clockPin, B01000010);  //row
  digitalWrite(latchPin, 1);

  digitalWrite(latchPin, 0);
  shiftOut(dataPin, clockPin, B11111110);  //mask(col)
  shiftOut(dataPin, clockPin, B00111100);  //row
  digitalWrite(latchPin, 1);


}

void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
  // This shifts 8 bits out MSB first,
  //on the rising edge of the clock,
  //clock idles low

  //internal function setup
  int i=0;
  int pinState;
  pinMode(myClockPin, OUTPUT);
  pinMode(myDataPin, OUTPUT);

  //clear everything out just in case to
  //prepare shift register for bit shifting
  digitalWrite(myDataPin, 0);
  digitalWrite(myClockPin, 0);

  //for each bit in the byte myDataOut�
  //NOTICE THAT WE ARE COUNTING DOWN in our for loop
  //This means that %00000001 or "1" will go through such
  //that it will be pin Q0 that lights.
  for (i=7; i>=0; i--)  {
    digitalWrite(myClockPin, 0);

    //if the value passed to myDataOut and a bitmask result
    // true then... so if we are at i=6 and our value is
    // %11010100 it would the code compares it to %01000000
    // and proceeds to set pinState to 1.
    if ( myDataOut & (1<<i) ) {
      pinState= 1;
    }
    else {       
      pinState= 0;
    }

    //Sets the pin to HIGH or LOW depending on pinState
    digitalWrite(myDataPin, pinState);
    //register shifts bits on upstroke of clock pin  
    digitalWrite(myClockPin, 1);
    //zero the data pin after shift to prevent bleed through
    digitalWrite(myDataPin, 0);
  }

  //stop shifting
  digitalWrite(myClockPin, 0);
}
[/code]

四.扩展阅读
Arduino官方教程ShiftOut:http://www.arduino.cc/en/Tutorial/ShiftOut
LED Matrix animator tool:http://www.bleq.nl/arduino/
arduino_matrix_editor_0.2.png
BTW:我使用的硬件设计来自于此作者,但是软件还没消化好,希望有感兴趣的朋友一起研究!{:soso_e113:}
回复

使用道具 举报

发表于 2012-11-21 23:52:47 | 显示全部楼层
哈哈,顶一个,这个图形生成软件好!
回复 支持 反对

使用道具 举报

发表于 2012-11-22 11:22:39 | 显示全部楼层
不错的教程。

我听说扫描时频率极快,快到不加限流电阻led也不会烧。又发现大号点阵下面的空间可以放下两片直插595,于是为了追求小体积,就有了这个,还不知道能不能成功

8x8_orin.JPG
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-22 13:00:07 | 显示全部楼层
Micky 发表于 2012-11-22 11:22
不错的教程。

我听说扫描时频率极快,快到不加限流电阻led也不会烧。又发现大号点阵下面的空间可以放下两 ...

谢谢分享,我正在考虑把面包板转成洞洞板

关于限流电阻的事情,可以参考这个帖子。
http://www.thebox.myzen.co.uk/Tutorial/LEDs.html

点评

595的最大输出电流也就30mA,不用担心  发表于 2013-7-27 11:18
回复 支持 反对

使用道具 举报

发表于 2012-11-22 13:05:55 | 显示全部楼层
如果这个点阵用MAX7219驱动估计会更好呢,还有64级调亮度,不过成本比595高

点评

呵呵,手里只有595,文章最后的LED Matrix animator tool就是用74HC595做的多亮度,不过是软实现,我还没消化明白=_=!  发表于 2012-11-22 15:11
回复 支持 反对

使用道具 举报

发表于 2012-11-28 16:25:54 | 显示全部楼层
用洞洞板+最小系统估计就能做出那个表情方块了,是不是可以用红外或触摸开关来切换,而不是采用延时间隔的方式?

点评

是的  发表于 2012-11-28 20:00
回复 支持 反对

使用道具 举报

发表于 2012-11-29 10:05:57 | 显示全部楼层
限流电阻一事我也想不明白,arduino可以提供3V和5V,直接接上不就完事了么?

点评

呵呵,我也不专业。可以看下4楼的点评链接。  发表于 2012-11-29 17:00
回复 支持 反对

使用道具 举报

发表于 2012-11-30 09:22:13 | 显示全部楼层
早上在淘宝发现一宝贝“MAX7219 点阵模块 显示模块 DIY套件 Arduino模块 单片机控制模块”不知道楼主怎么看,如果可行我打算搞几个回来试试。

点评

推荐MAX。个人感觉比74HC595好,毕竟MAX的是专门的LED驱动芯片。呵呵  发表于 2012-11-30 12:34
回复 支持 反对

使用道具 举报

发表于 2012-12-3 11:24:28 | 显示全部楼层
Micky 发表于 2012-11-22 11:22
不错的教程。

我听说扫描时频率极快,快到不加限流电阻led也不会烧。又发现大号点阵下面的空间可以放下两 ...

成功了吗?
回复 支持 反对

使用道具 举报

发表于 2012-12-3 11:25:39 | 显示全部楼层
2片595是不是有点奢侈,扫描片用138不是更好,就是需要多占3pin的输出
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-12-3 17:37:45 | 显示全部楼层
长长牙齿 发表于 2012-12-3 11:25
2片595是不是有点奢侈,扫描片用138不是更好,就是需要多占3pin的输出

595也不是很贵吧? 我在网上也看过138+595的方案。不仅是占IO的问题,代码量也增加了很多。最重要的是我看中是否有成型的上位机方案,所以最终选了595x2

不过说效果的话建议用MAX系列专业的LED驱动,呵呵,价格就更高啦
回复 支持 反对

使用道具 举报

发表于 2012-12-3 21:31:01 | 显示全部楼层
max系列不算太贵,而且可以串联,我订的三块板子刚到。

点评

关注: ]  发表于 2012-12-4 09:02
回复 支持 反对

使用道具 举报

发表于 2012-12-3 23:19:20 | 显示全部楼层
幻生幻灭 发表于 2012-12-3 17:37
595也不是很贵吧? 我在网上也看过138+595的方案。不仅是占IO的问题,代码量也增加了很多。最重要的是我看 ...

要说代码量的话,有一种计数器的芯片,给一个CLK,输出就下一脚变高电平,太适合做扫描了,那个代码量应该是最小的吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-12-4 09:05:15 | 显示全部楼层
长长牙齿 发表于 2012-12-3 23:19
要说代码量的话,有一种计数器的芯片,给一个CLK,输出就下一脚变高电平,太适合做扫描了,那个代码量应该 ...

这个不太熟悉,可以发方案大家研究一下
不过我觉得最简单的方案还是bg5cdu用的MAX,呵呵
回复 支持 反对

使用道具 举报

发表于 2012-12-12 10:50:52 | 显示全部楼层
http://playground.arduino.cc//Main/MAX72XXHardware
MAX72系列芯片的官方资料

点评

很好的官方资料 : )  发表于 2012-12-12 14:22
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2019-6-26 22:28 , Processed in 0.066693 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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