[教程]8x8点阵的驱动 Arduino Matrix LED with 74HC595 x2
先上完工图,是一个笑脸http://v.youku.com/v_show/id_XNDc4MjIzOTAw.html
http://v.youku.com/v_show/id_XNDc4MjIzOTAw.html
一.硬件清单
1. Arduino Mangox1
2. Matrix LED 8x8x1
3. 220欧姆电阻 x8
4. 74HC595 x2
5. 迷你面包板 x3
6. 面包线一堆{:soso_e136:}
关于点阵LED这里说一下,发现网上主要有两种规格16Pin和24Pin的
其接线方式和针脚的对应方式如图
二. 硬件接线
原理图
接线图
迷你面包板接线图
最终的实际测试效果如图
三. Arduino软件编程
代码参考了官方教程的ShiftOut[链接]
稍加修改,实现一个笑脸
//**************************************************************//
//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);
}
四.扩展阅读
Arduino官方教程ShiftOut:http://www.arduino.cc/en/Tutorial/ShiftOut
LED Matrix animator tool:http://www.bleq.nl/arduino/
BTW:我使用的硬件设计来自于此作者,但是软件还没消化好,希望有感兴趣的朋友一起研究!{:soso_e113:} 哈哈,顶一个,这个图形生成软件好! 不错的教程。
我听说扫描时频率极快,快到不加限流电阻led也不会烧。又发现大号点阵下面的空间可以放下两片直插595,于是为了追求小体积,就有了这个,还不知道能不能成功
Micky 发表于 2012-11-22 11:22 static/image/common/back.gif
不错的教程。
我听说扫描时频率极快,快到不加限流电阻led也不会烧。又发现大号点阵下面的空间可以放下两 ...
谢谢分享,我正在考虑把面包板转成洞洞板
关于限流电阻的事情,可以参考这个帖子。
http://www.thebox.myzen.co.uk/Tutorial/LEDs.html :P如果这个点阵用MAX7219驱动估计会更好呢,还有64级调亮度,不过成本比595高 用洞洞板+最小系统估计就能做出那个表情方块了,是不是可以用红外或触摸开关来切换,而不是采用延时间隔的方式? 限流电阻一事我也想不明白,arduino可以提供3V和5V,直接接上不就完事了么? 早上在淘宝发现一宝贝“MAX7219 点阵模块 显示模块 DIY套件 Arduino模块 单片机控制模块”不知道楼主怎么看,如果可行我打算搞几个回来试试。 Micky 发表于 2012-11-22 11:22 static/image/common/back.gif
不错的教程。
我听说扫描时频率极快,快到不加限流电阻led也不会烧。又发现大号点阵下面的空间可以放下两 ...
成功了吗? 2片595是不是有点奢侈,扫描片用138不是更好,就是需要多占3pin的输出 长长牙齿 发表于 2012-12-3 11:25 static/image/common/back.gif
2片595是不是有点奢侈,扫描片用138不是更好,就是需要多占3pin的输出
595也不是很贵吧? 我在网上也看过138+595的方案。不仅是占IO的问题,代码量也增加了很多。最重要的是我看中是否有成型的上位机方案,所以最终选了595x2
不过说效果的话建议用MAX系列专业的LED驱动,呵呵,价格就更高啦 max系列不算太贵,而且可以串联,我订的三块板子刚到。 幻生幻灭 发表于 2012-12-3 17:37 static/image/common/back.gif
595也不是很贵吧? 我在网上也看过138+595的方案。不仅是占IO的问题,代码量也增加了很多。最重要的是我看 ...
要说代码量的话,有一种计数器的芯片,给一个CLK,输出就下一脚变高电平,太适合做扫描了,那个代码量应该是最小的吧。 长长牙齿 发表于 2012-12-3 23:19 static/image/common/back.gif
要说代码量的话,有一种计数器的芯片,给一个CLK,输出就下一脚变高电平,太适合做扫描了,那个代码量应该 ...
这个不太熟悉,可以发方案大家研究一下
不过我觉得最简单的方案还是bg5cdu用的MAX,呵呵 http://playground.arduino.cc//Main/MAX72XXHardware
MAX72系列芯片的官方资料