如何在Arduino上使用八个大型红色LED而不需要放弃8个输出引脚

电子说

1.3w人已加入

描述

概述

在本课程中,您将学习如何在Arduino上使用八个大型红色LED而不需要放弃8个输出引脚!

Arduino

尽管您可以将八个LED分别连接一个Arduino引脚上的电阻(就像我们在第2课中对RGB LED所做的那样),您很快就会开始用尽Arduino上的引脚。如果您没有与duino连接的东西很多,则可以这样做-但通常我们需要按钮,传感器,伺服器等,在您不知道它的情况下,您就没有管脚了。因此,您将使用名为 74HC595串行到并行转换器的芯片,而不是这样做。该芯片具有八个输出(完美)和三个输入,可用于一次将数据馈入其中。

该芯片使驱动LED的速度稍慢一些(您每秒只能将LED更换大约500,000次,而不是每秒8,000,000次),但它的确非常快,比人类可以检测到的速度还要快,所以值得!

零件

要构建本课中描述的项目,您将需要以下零件。

零件 数量

Arduino

5mm红色LED 8

Arduino

270电阻(红色,紫色,棕色条纹) 8

Arduino

74HC595移位寄存器

1

Arduino

半面包板 1

Arduino

Arduino Uno R3 1

Arduino

跳线束 1

面包板布局

由于我们要连接八个LED和八个电阻,因此实际上需要进行很多连接。

Arduino

将74HC595芯片放在第一位可能是最容易的,因为几乎所有其他东西都可以连接对此。如此放置,以使小U形槽口朝向面包板的顶部。芯片的引脚1位于该凹口的左侧。

arduino的数字4进入移位寄存器的引脚14

arduino的数字5进入移位寄存器的引脚12

来自arduino的数字6进入移位寄存器的#11引脚

除了‘595的所有输出之一,所有输出都位于芯片的左侧,因此,为了便于连接,

在芯片之后,将电阻器放置到位。您需要小心,不要使电阻的引线相互接触。在将电源连接到Arduino之前,应该再次检查这一点。如果发现很难在不接触引线的情况下布置电阻器,则有助于缩短引线,使其更靠近面包板的表面。然后,将LED放在面包板上。

更长的正极LED引线必须全部朝向芯片,无论面包板位于面包板的哪一侧。

现在仅需连接跳线,如上所示。不要忘了从IC的引脚8到面包板GND列的引脚。

稍后加载列出的草图并尝试一下。每个LED都应依次点亮,直到所有LED都点亮,然后它们都熄灭并重复该循环。

74HC595移位寄存器

在阅读代码之前,让我们快速看一下芯片的功能,以便我们可以理解代码的功能。

该芯片属于一种移位寄存器。

Arduino

移位寄存器可保存八个存储单元,每个存储单元可以是1或0。

设置每个存储单元这些值的开或关,我们使用芯片的“数据”和“时钟”引脚输入数据。

时钟引脚需要接收八个脉冲。在每个脉冲时,如果数据引脚为高电平,则将1压入移位寄存器。否则,它为0。当接收到所有八个脉冲时,然后启用“锁存”引脚会将这八个值复制到锁存寄存器。这是必要的,否则当将数据加载到移位寄存器中时,错误的LED会闪烁。该芯片还具有OE(输出使能)引脚,该引脚用于一次启用或禁用所有输出。您可以将其连接到具有PWM功能的Arduino引脚,并使用“ analogWrite”控制LED的亮度。该引脚为低电平有效,因此我们将其连接至GND。

Arduino代码

Arduino包含一个名为“ shiftOut”的特殊功能,该功能专门用于将数据发送到移位寄存器。

这是完整的草图,

下载:文件

复制代码

/*

Adafruit Arduino - Lesson 4. 8 LEDs and a Shift Register

*/

int latchPin = 5;

int clockPin = 6;

int dataPin = 4;

byte leds = 0;

void setup()

{

pinMode(latchPin, OUTPUT);

pinMode(dataPin, OUTPUT);

pinMode(clockPin, OUTPUT);

}

void loop()

{

leds = 0;

updateShiftRegister();

delay(500);

for (int i = 0; i 《 8; i++)

{

bitSet(leds, i);

updateShiftRegister();

delay(500);

}

}

void updateShiftRegister()

{

digitalWrite(latchPin, LOW);

shiftOut(dataPin, clockPin, LSBFIRST, leds);

digitalWrite(latchPin, HIGH);

} /*

Adafruit Arduino - Lesson 4. 8 LEDs and a Shift Register

*/

int latchPin = 5;

int clockPin = 6;

int dataPin = 4;

byte leds = 0;

void setup()

{

pinMode(latchPin, OUTPUT);

pinMode(dataPin, OUTPUT);

pinMode(clockPin, OUTPUT);

}

void loop()

{

leds = 0;

updateShiftRegister();

delay(500);

for (int i = 0; i 《 8; i++)

{

bitSet(leds, i);

updateShiftRegister();

delay(500);

}

}

void updateShiftRegister()

{

digitalWrite(latchPin, LOW);

shiftOut(dataPin, clockPin, LSBFIRST, leds);

digitalWrite(latchPin, HIGH);

}

我们要做的第一件事是定义将要使用的三个引脚。这些是Arduino数字输出,将连接到74HC595的锁存器,时钟和数据引脚。

下载:file

复制代码

int latchPin = 5;

int clockPin = 6;

int dataPin = 4; int latchPin = 5;

int clockPin = 6;

int dataPin = 4;

接下来,定义了一个名为“ leds”的变量。这将用于保持当前打开或关闭LED的模式。 “字节”类型的数据表示使用八位数字。每个位都可以打开或关闭,因此非常适合跟踪我们八个LED中的哪个打开或关闭。

下载:文件

复制代码

byte leds = 0; byte leds = 0;

“设置”功能仅设置了我们正在使用的三个引脚

下载:文件

复制代码

void setup()

{

pinMode(latchPin, OUTPUT);

pinMode(dataPin, OUTPUT);

pinMode(clockPin, OUTPUT);

} void setup()

{

pinMode(latchPin, OUTPUT);

pinMode(dataPin, OUTPUT);

pinMode(clockPin, OUTPUT);

}

“循环”功能最初通过将变量“ leds”的值设置为0来关闭所有LED。然后调用“ updateShiftRegister”发送“ leds” ’模式到移位寄存器,以便所有LED熄灭。稍后我们将处理‘updateShiftRegister’的工作方式。

循环功能暂停半秒钟,然后使用‘for’循环和变量‘i’从0到7开始计数。每次,它使用Arduino函数‘bitSet’来设置控制变量‘leds’中的LED的位。然后它还会调用‘updateShiftRegister’,以便leds更新以反映变量‘leds’中的内容。

然后,在‘i’递增之前,有半秒的延迟,下一个LED点亮。

下载:文件

复制代码

void loop()

{

leds = 0;

updateShiftRegister();

delay(500);

for (int i = 0; i 《 8; i++)

{

bitSet(leds, i);

updateShiftRegister();

delay(500);

}

} void loop()

{

leds = 0;

updateShiftRegister();

delay(500);

for (int i = 0; i 《 8; i++)

{

bitSet(leds, i);

updateShiftRegister();

delay(500);

}

}

函数‘updateShiftRegister’首先将LatchPin设置为低电平,然后在再次将‘latchPin’置于高电平之前调用Arduino函数‘shiftOut’。它有四个参数,前两个是分别用于数据和时钟的引脚。

第三个参数指定要从哪个数据端开始。我们将从最右边的位开始,这就是所谓的“最低有效位”(LSB)。

最后一个参数是要移入移位寄存器的实际数据。

下载:文件

复制代码

void updateShiftRegister()

{

digitalWrite(latchPin, LOW);

shiftOut(dataPin, clockPin, LSBFIRST, leds);

digitalWrite(latchPin, HIGH);

} void updateShiftRegister()

{

digitalWrite(latchPin, LOW);

shiftOut(dataPin, clockPin, LSBFIRST, leds);

digitalWrite(latchPin, HIGH);

}

如果要关闭而不是打开LED之一,则可以在“ leds”变量上调用类似的Arduino函数(bitClear) 。这会将“ leds”的位设置为0,然后您只需跟随它调用“ updateShiftRegister”即可更新实际的LED。

亮度控制

我未提到的74HC595的一个引脚是称为“输出使能”的引脚。这是针脚13,在面包板上,它永久接地。该引脚用作开关,可以启用或禁用输出-唯一需要注意的是它是“低电平有效”(接地以启用)。因此,如果将其连接到5V,则所有输出均关闭。而如果将其接地,则应该打开的那些输出打开,应该关闭的那些输出关闭。

我们可以将此引脚与“ analogWrite”功能一起使用,我们在第3课中使用了该功能。 ,以使用PWM控制LED的亮度(另请参阅第3课)。

要做的是,更改与74HC595引脚13的连接,以代替将其接地,将其连接到Arduino的引脚3。

下面的草图将在所有LED点亮后逐渐将它们逐渐熄灭。

下载:文件

复制代码

/*

Adafruit Arduino - Lesson 4. 8 LEDs and a Shift Register - Brightness

*/

int latchPin = 5;

int clockPin = 6;

int dataPin = 4;

int outputEnablePin = 3;

byte leds = 0;

void setup()

{

pinMode(latchPin, OUTPUT);

pinMode(dataPin, OUTPUT);

pinMode(clockPin, OUTPUT);

pinMode(outputEnablePin, OUTPUT);

}

void loop()

{

setBrightness(255);

leds = 0;

updateShiftRegister();

delay(500);

for (int i = 0; i 《 8; i++)

{

bitSet(leds, i);

updateShiftRegister();

delay(500);

}

for (byte b = 255; b 》 0; b--)

{

setBrightness(b);

delay(50);

}

}

void updateShiftRegister()

{

digitalWrite(latchPin, LOW);

shiftOut(dataPin, clockPin, LSBFIRST, leds);

digitalWrite(latchPin, HIGH);

}

void setBrightness(byte brightness) // 0 to 255

{

analogWrite(outputEnablePin, 255-brightness);

}

/*

Adafruit Arduino - Lesson 4. 8 LEDs and a Shift Register - Brightness

*/

int latchPin = 5;

int clockPin = 6;

int dataPin = 4;

int outputEnablePin = 3;

byte leds = 0;

void setup()

{

pinMode(latchPin, OUTPUT);

pinMode(dataPin, OUTPUT);

pinMode(clockPin, OUTPUT);

pinMode(outputEnablePin, OUTPUT);

}

void loop()

{

setBrightness(255);

leds = 0;

updateShiftRegister();

delay(500);

for (int i = 0; i 《 8; i++)

{

bitSet(leds, i);

updateShiftRegister();

delay(500);

}

for (byte b = 255; b 》 0; b--)

{

setBrightness(b);

delay(50);

}

}

void updateShiftRegister()

{

digitalWrite(latchPin, LOW);

shiftOut(dataPin, clockPin, LSBFIRST, leds);

digitalWrite(latchPin, HIGH);

}

void setBrightness(byte brightness) // 0 to 255

{

analogWrite(outputEnablePin, 255-brightness);

}

其他要做的事情

一旦您知道如何使用74HC595,那么使用许多LED可以做很多事情。您可以尝试以下操作:

制作“ Larson Scanner”扫描灯,就像在电视连续剧《骑士骑士》中KITT的前部以及在《 Battle Start Galactica》系列中的Cylons上那样。 li》

制作电子骰子。将6个LED排列为两列,每列三个LED,中间一个LED。提示–看一下称为“随机”的Arduino函数。

74HC595的一大优点是,您可以通过菊花链式连接它们以增加数量。您可以控制的LED。有关74HC595的更高级用法的其他指导,请查看使用‘shiftOut’的Arduino官方文档http://arduino.cc/zh/Tutorial/ShiftOut

责任编辑:wv

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分