随着你对Arduino的深入理解和应用,相信很快就会遇到Arduino端口不够用的情况了。比如你可能需要在你的项目里控制更多的LED或者继 电器,但却发现12似乎是一个很难超越的数字;或者你的声音项目里需要更多的电位器,但是Arduino板上6个模拟输入接口的限制却让你捉襟见肘。
如果此时Arduino的处理能力还尚能满足你的要求,只是接口数目不够,能够采用的一种办法就是对Arduino的数字端口和模拟端口进行扩展。 下图就是一个Arduino数字输出端口扩展板,利用它原理上你可以将Arduino上的3个数字输出端口扩展成8个数字输出端口,通俗说来就是3个换8 个;-)
实验这块板最简单的办法是用三根数字连接线,分别将该扩展板上的SCK,RCK和SER引脚与传感器扩展板上的数字I/O的8、9和10号引脚相连接:
相应的测试代码如下所示:
int dataPin = 8; // SER
int latchPin = 9; // RCK
int clockPin = 10; // SCK
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
for (int j = 0; j < 255; j++) {
// start transmit data
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, j);
// end transmit data
digitalWrite(latchPin, HIGH);
delay(500);
}
}
上述代码中最核心的是对函数shiftOut()的调用,它的作用往扩展板上的8个数字引脚上写一个字节,该字节的每一位分别对应扩展板上8个数字输出I/O引脚中的一个。除此之外,shiftOut()函数在调用之前需要调用digitalWrite()将RCK置低,调用完成之后再置高,这是由芯片的控制时序决定的:-) 程序运行时的效果相当于一个递增的计数器,在扩展板的8个输出端口上分别接8个LED灯,可以看到相应的累加效果:
如果读到这你以为一切就结束了的话,那可就大错特错了;-)除了单个使用之外,这一扩展板其实是可以通过相应的连接线实现级连的。也就是说,如果两块相连的话,你就可以用Arduino上的三个数字I/O端口扩展出16个数字输出端口,如果三块相连的话,你就可以用Arduino上的三个数字I/O端口扩展出24个数字输出端口来。理认上讲这样的扩展是可以一直做下去的,但受限于处理器的处理能力和电源大小、外部干扰等的影响,这样的扩展在实际应用中当然是有一定限制的,至于是多少嘛 ,那就得由实际的应用场景来决定了。
下面来看两块数字输出扩展板如果级联使用。在上述接好的电路的基础上,我们只需要再用一根数字输出扩展板连接线,将第一块数字输出扩展板上的输出端口(OUTPUT),与第二块数字输出扩展板上的输入端口(INPUT)连接起来,电路部分就算完成了:
程序部分我们对上面的程序做一点点小的修改,由于是两块数字输出扩展板,因此我们需要分别调用两次shiftOut()函数,来为两块数字输出扩展板分别设置不同的值:
int dataPin = 8; // SER
int latchPin = 9; // RCK
int clockPin = 10; // SCK
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
for (int j = 0; j < 255; j++) {
// start transmit data
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, j);
shiftOut(dataPin, clockPin, MSBFIRST, 255 - j);
// end transmit data
digitalWrite(latchPin, HIGH);
delay(500);
}
}
需要注意的是,我们为数字输出扩展板提供的数据,其实是一级一级推到不同的扩展板上的,也就是说上面的两条shiftOut()函数执行完之后,第一条shitfOut()函数所指定的值其实被写到了第二块扩展板上,而第二条shiftOut()函数所指定的值则写到了第一块扩展板上。
上述代码在运行时的效果相当于在第二块扩展板上实现了一个递增的计数器,在第一块扩展板上实现了一个递减的计数器,如果你还不是那不明白的话,那就接上16个LED好好观察一下效果吧,另外适时补充一下二进制数据的基本常识可能也是必要的;-)
No tags





howie · 2008/10/16 at 10:25 PM
哇,新照片拍的很漂亮 ~~
feng · 2008/10/20 at 1:52 PM
(*^__^*) 好人! 很人性化的设计
docbai · 2008/10/22 at 4:50 PM
我是北师大的老师,对你的产品很感兴趣,听说你在北京有办公室也作销售请告我地址,我准备前去购买。我的电话13439119691
多谢!
白明