当前位置:首页  <  应用教程  <  【创客学堂】基于Arduino与SPI总线接口的LED显示器...
【创客学堂】基于Arduino与SPI总线接口的LED显示器
编辑:Techie 2013-08-30 浏览次数:2728

Arduino连接了并行设备后,还剩下什么?

    有没有发现你的Arduino控制器的端口总是不够用?一些并行数据传输的设备总是会占用很多的端口,一大团乱糟糟的连接线,会让你大伤脑筋。如果你想用普通的4位LED数码管显示一个时钟,那么你需要用到8+4=12个端口!这对于Arduino UNO R3这样的,只余12个数字端口的小板子来说,还剩下什么?
我们当然不会那么做,因为那样做你就像被绑在大树上一般。有更聪明的方法,那就是让数据串行,比较突出的代表是SPI总线串行通信方式,遵守SPI总线协议
SPI是Motorola公司推出的一种同步串行通讯方式,是一种四线同步总线,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线(SDO、SDI、SCLK、CS),如果你只有一个SPI设备时,那你可以只用两根线(SDO、SCLK),节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,如今越来越多的芯片集成了这种通信协议因其硬件功能很强,与SPI总线有关的软件就相当简单,使CPU有更多的时间处理其他事务。


Arduino连接了SPI接口后,还会剩下很多


    下面就向大家介绍两款国外SPI总线接口Arduino  LED显示器,体会一下SPI的好处。(注:测试环境为:win7下Arduino IDE 1.0.5+奥松机器人Arduino UNO R3+奥松机器人Arduino sensor Shield V5.0


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?但它可是简约而不简单哦。
 

SPI接口4位LED数码管正面图     SPI接口4位LED数码管背面图
          图2 SPI接口4位LED数码管正面图                图3 SPI接口4位LED数码管背面图

    它采用了一块TM1637专用LED控制芯片,属于开源硬件,在网上可以找到它的Arduino库。模块采用SPI 串行接口,能够控制6位的8段LED数码管,可以在Arduino程序中设定8级可调的辉度,方便应用于不同明暗程度的场合;与Arduino控制器的连接也很方便,毕竟才两根线嘛,而且还可以在Arduino程序中更改端口号,真是太人性化了!


我选择,我喜欢


    好吧,那先来看看怎么选择它的辉度的:
 

Arduino 程序文件中可更改辉度相关数据 
图4 Arduino 程序文件中可更改辉度相关数据


 
    在Arduino程序文件中,找到tm1637.set(BRIGHT_TYPICAL);其中值就是辉度值,可以设定为0-7的任意整数,0表示最暗。
下面两图为辉度为0与7时的对比。


 SPI接口Digit Display模块的辉度0与辉度7的对比图

图5  SPI接口Digit Display模块的辉度0与辉度7的对比图


    再来看看如修改端口
 

 
Arduino 程序文件中可自定义相关SPI端口号

图6 Arduino 程序文件中可自定义相关SPI端口号

    第二款,10位LED Bar,它采用了一块YM9221专用LED控制芯片,也属于开源硬件,在网上可以找到它的Arduino库。模块亦采用SPI 串行接口,这款显示器与上面介绍的相比,缺点在于:1.辉度不可自由调节,是通过三个精密电阻给定的;2.SPI端口的修改也不够方便,要到Arduino库LED_Bar.h中修改最多6条语句才行。优点在于:1.其将可控的12段LED分成三部分,也就是说,可以分段给定辉度值;2.它是具有SPI全功能的模块,板上已给出SPI输入输出的口线位置,想级联,那是相当容易。

SPI接口LED Bar模块正面图        SPI接口LED Bar 模块反面图
 

      图7 SPI接口LED Bar模块正面图                  图8 SPI接口LED Bar 模块反面图

    下面说明一下如何更改LED Bar SPI端口,这里要跟你的Arduino板子对应,参考Arduino原理图与AVR芯片相关的引脚名称。


Arduino 程序文件中更改SPI总线端口相关数据 
 

图9 Arduino 程序文件中更改SPI总线端口相关数据
 
 

    悄悄地说一句:与这两款相似功能的产品即将由奥松机器人推出,敬请关注奥松机器人的官网 :)

SPI在国内


说了这么多新的SPI总线芯片模块,再来比较一下采用国内较为通用的74HC595芯片的SPI总线接口LED模块吧,就拿现在奥松机器人推出的一款SPI LED  Module V1.0来说,它用了8片SPI芯片,一位LED一个,成本是大了点。但优点是电流足够强大,实际上它用的LED也是个头不小,挺配套,呵呵;芯片自带缓冲,可静态显示 ,无抖动感;3.3V,5V电压通吃;应用起来也挺方便,不用去海搜Arduino库了,清一色的自定义即可,接口也是适配于Arduino 传感器扩展板的。


SPI LED Module V1.0 
 

图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);
  }


SPI LED Module V1.0显示0-7 
 

图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