有没有发现你的Arduino控制器的端口总是不够用?一些并行数据传输的设备总是会占用很多的端口,一大团乱糟糟的连接线,会让你大伤脑筋。如果你想用普通的4位LED数码管显示一个时钟,那么你需要用到8+4=12个端口!这对于Arduino UNO R3这样的,只余12个数字端口的小板子来说,还剩下什么?
我们当然不会那么做,因为那样做你就像被绑在大树上一般。有更聪明的方法,那就是让数据串行,比较突出的代表是SPI总线串行通信方式,遵守SPI总线协议。
SPI是Motorola公司推出的一种同步串行通讯方式,是一种四线同步总线,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线(SDO、SDI、SCLK、CS),如果你只有一个SPI设备时,那你可以只用两根线(SDO、SCLK),节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,如今越来越多的芯片集成了这种通信协议因其硬件功能很强,与SPI总线有关的软件就相当简单,使CPU有更多的时间处理其他事务。
下面就向大家介绍两款国外SPI总线接口的Arduino LED显示器,体会一下SPI的好处。(注:测试环境为:win7下Arduino IDE 1.0.5+奥松机器人Arduino UNO R3+奥松机器人Arduino sensor Shield V5.0)
图1 Arduino UNO R3 与Arduino sensor Shield V5.0
第一款,4位LED数码管模块,呵呵,别担心 ,此管非彼管,不是普通的了,是具有SPI接口的4位LED数码管模块,因为现在只用了一个模块,所以,它的连接线可以最简化到除了电源线、地线以外,就只有SDO、SCLK这两条线!是不是so easy?但它可是简约而不简单哦。
图2 SPI接口4位LED数码管正面图 图3 SPI接口4位LED数码管背面图
它采用了一块TM1637专用LED控制芯片,属于开源硬件,在网上可以找到它的Arduino库。模块采用SPI 串行接口,能够控制6位的8段LED数码管,可以在Arduino程序中设定8级可调的辉度,方便应用于不同明暗程度的场合;与Arduino控制器的连接也很方便,毕竟才两根线嘛,而且还可以在Arduino程序中更改端口号,真是太人性化了!
好吧,那先来看看怎么选择它的辉度的:
图4 Arduino 程序文件中可更改辉度相关数据
在Arduino程序文件中,找到tm1637.set(BRIGHT_TYPICAL);其中值就是辉度值,可以设定为0-7的任意整数,0表示最暗。
下面两图为辉度为0与7时的对比。
图5 SPI接口Digit Display模块的辉度0与辉度7的对比图
再来看看如修改端口?
图6 Arduino 程序文件中可自定义相关SPI端口号
第二款,10位LED Bar,它采用了一块YM9221专用LED控制芯片,也属于开源硬件,在网上可以找到它的Arduino库。模块亦采用SPI 串行接口,这款显示器与上面介绍的相比,缺点在于:1.辉度不可自由调节,是通过三个精密电阻给定的;2.SPI端口的修改也不够方便,要到Arduino库LED_Bar.h中修改最多6条语句才行。优点在于:1.其将可控的12段LED分成三部分,也就是说,可以分段给定辉度值;2.它是具有SPI全功能的模块,板上已给出SPI输入输出的口线位置,想级联,那是相当容易。
图7 SPI接口LED Bar模块正面图 图8 SPI接口LED Bar 模块反面图
下面说明一下如何更改LED Bar 的SPI端口,这里要跟你的Arduino板子对应,参考Arduino原理图与AVR芯片相关的引脚名称。
图9 Arduino 程序文件中更改SPI总线端口相关数据
悄悄地说一句:与这两款相似功能的产品即将由奥松机器人推出,敬请关注奥松机器人的官网 :)
说了这么多新的SPI总线芯片模块,再来比较一下采用国内较为通用的74HC595芯片的SPI总线接口LED模块吧,就拿现在奥松机器人推出的一款SPI LED Module V1.0来说,它用了8片SPI芯片,一位LED一个,成本是大了点。但优点是电流足够强大,实际上它用的LED也是个头不小,挺配套,呵呵;芯片自带缓冲,可静态显示 ,无抖动感;3.3V,5V电压通吃;应用起来也挺方便,不用去海搜Arduino库了,清一色的自定义即可,接口也是适配于Arduino 传感器扩展板的。
图10 SPI LED Module V1.0
顺便给出一个它的显示程序,功能是静态显示01234567,供大家参考。
//Pin connected to ST_CP of 74HC595
int latchPin = 4;
//Pin connected to SH_CP of 74HC595
int clockPin = 3;
////Pin connected to DS of 74HC595
int dataPin = 2;
int tab[]=
{
0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f
};
void setup() {
//set pins to output because they are addressed in the main loop
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
for(int i = 0; i < 8; i++)// shut off all the segments before being displayed
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST,0xff);
digitalWrite(latchPin, HIGH);
delay(10);
}
}
void loop()
{
for(int i = 0; i < 8; i++)// display 0-7
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST,tab[7-i]);
digitalWrite(latchPin, HIGH);
delay(1000);
}
while(1)//stop refresh the registers,then the numbers display steady
{
digitalWrite(latchPin, HIGH);
}
}
图11 SPI LED Module V1.0显示0-7
下面是相关链接
8位静态数码管级联的视频演示 http://v.youku.com/v_show/id_XNDU1MTMyOTA0.html
8位静态数码管 扩展显示模块 http://www.alsrobot.cn/goods-97.html
Arduino UNO R3 http://www.alsrobot.cn/goods-141.html
Arduino 传感器扩展板v5.0 http://www.alsrobot.cn/goods-147.html
什么是SPI http://baike.baidu.com/view/245026.htm
近期新闻
热门新闻
奥松智能微信