概述
在本课程中,您将学习如何在Arduino上使用八个大型红色LED而不需要放弃8个输出引脚!
尽管您可以将八个LED分别连接一个Arduino引脚上的电阻(就像我们在第2课中对RGB LED所做的那样),您很快就会开始用尽Arduino上的引脚。如果您没有与duino连接的东西很多,则可以这样做-但通常我们需要按钮,传感器,伺服器等,在您不知道它的情况下,您就没有管脚了。因此,您将使用名为 74HC595串行到并行转换器的芯片,而不是这样做。该芯片具有八个输出(完美)和三个输入,可用于一次将数据馈入其中。
该芯片使驱动LED的速度稍慢一些(您每秒只能将LED更换大约500,000次,而不是每秒8,000,000次),但它的确非常快,比人类可以检测到的速度还要快,所以值得!
零件
要构建本课中描述的项目,您将需要以下零件。
零件 数量
5mm红色LED 8
270电阻(红色,紫色,棕色条纹) 8
74HC595移位寄存器
1
半面包板 1
Arduino Uno R3 1
跳线束 1
面包板布局
由于我们要连接八个LED和八个电阻,因此实际上需要进行很多连接。
将74HC595芯片放在第一位可能是最容易的,因为几乎所有其他东西都可以连接对此。如此放置,以使小U形槽口朝向面包板的顶部。芯片的引脚1位于该凹口的左侧。
arduino的数字4进入移位寄存器的引脚14
arduino的数字5进入移位寄存器的引脚12
来自arduino的数字6进入移位寄存器的#11引脚
除了‘595的所有输出之一,所有输出都位于芯片的左侧,因此,为了便于连接,
在芯片之后,将电阻器放置到位。您需要小心,不要使电阻的引线相互接触。在将电源连接到Arduino之前,应该再次检查这一点。如果发现很难在不接触引线的情况下布置电阻器,则有助于缩短引线,使其更靠近面包板的表面。然后,将LED放在面包板上。
更长的正极LED引线必须全部朝向芯片,无论面包板位于面包板的哪一侧。
现在仅需连接跳线,如上所示。不要忘了从IC的引脚8到面包板GND列的引脚。
稍后加载列出的草图并尝试一下。每个LED都应依次点亮,直到所有LED都点亮,然后它们都熄灭并重复该循环。
74HC595移位寄存器
在阅读代码之前,让我们快速看一下芯片的功能,以便我们可以理解代码的功能。
该芯片属于一种移位寄存器。
移位寄存器可保存八个存储单元,每个存储单元可以是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
-
led
+关注
关注
240文章
23047浏览量
656903 -
Arduino
+关注
关注
187文章
6456浏览量
186478
发布评论请先 登录
相关推荐
评论