概述
在本課程中,您將學(xué)習(xí)如何在Arduino上使用八個(gè)大型紅色LED而不需要放棄8個(gè)輸出引腳!
盡管您可以將八個(gè)LED分別連接一個(gè)Arduino引腳上的電阻(就像我們在第2課中對RGB LED所做的那樣),您很快就會開始用盡Arduino上的引腳。如果您沒有與duino連接的東西很多,則可以這樣做-但通常我們需要按鈕,傳感器,伺服器等,在您不知道它的情況下,您就沒有管腳了。因此,您將使用名為 74HC595串行到并行轉(zhuǎn)換器的芯片,而不是這樣做。該芯片具有八個(gè)輸出(完美)和三個(gè)輸入,可用于一次將數(shù)據(jù)饋入其中。
該芯片使驅(qū)動(dòng)LED的速度稍慢一些(您每秒只能將LED更換大約500,000次,而不是每秒8,000,000次),但它的確非常快,比人類可以檢測到的速度還要快,所以值得!
零件
要構(gòu)建本課中描述的項(xiàng)目,您將需要以下零件。
零件 數(shù)量
5mm紅色LED 8
270電阻(紅色,紫色,棕色條紋) 8
74HC595移位寄存器
1
半面包板 1
Arduino Uno R3 1
跳線束 1
面包板布局
由于我們要連接八個(gè)LED和八個(gè)電阻,因此實(shí)際上需要進(jìn)行很多連接。
將74HC595芯片放在第一位可能是最容易的,因?yàn)閹缀跛衅渌麞|西都可以連接對此。如此放置,以使小U形槽口朝向面包板的頂部。芯片的引腳1位于該凹口的左側(cè)。
arduino的數(shù)字4進(jìn)入移位寄存器的引腳14
arduino的數(shù)字5進(jìn)入移位寄存器的引腳12
來自arduino的數(shù)字6進(jìn)入移位寄存器的#11引腳
除了‘595的所有輸出之一,所有輸出都位于芯片的左側(cè),因此,為了便于連接,
在芯片之后,將電阻器放置到位。您需要小心,不要使電阻的引線相互接觸。在將電源連接到Arduino之前,應(yīng)該再次檢查這一點(diǎn)。如果發(fā)現(xiàn)很難在不接觸引線的情況下布置電阻器,則有助于縮短引線,使其更靠近面包板的表面。然后,將LED放在面包板上。
更長的正極LED引線必須全部朝向芯片,無論面包板位于面包板的哪一側(cè)。
現(xiàn)在僅需連接跳線,如上所示。不要忘了從IC的引腳8到面包板GND列的引腳。
稍后加載列出的草圖并嘗試一下。每個(gè)LED都應(yīng)依次點(diǎn)亮,直到所有LED都點(diǎn)亮,然后它們都熄滅并重復(fù)該循環(huán)。
74HC595移位寄存器
在閱讀代碼之前,讓我們快速看一下芯片的功能,以便我們可以理解代碼的功能。
該芯片屬于一種移位寄存器。
移位寄存器可保存八個(gè)存儲單元,每個(gè)存儲單元可以是1或0。
設(shè)置每個(gè)存儲單元這些值的開或關(guān),我們使用芯片的“數(shù)據(jù)”和“時(shí)鐘”引腳輸入數(shù)據(jù)。
時(shí)鐘引腳需要接收八個(gè)脈沖。在每個(gè)脈沖時(shí),如果數(shù)據(jù)引腳為高電平,則將1壓入移位寄存器。否則,它為0。當(dāng)接收到所有八個(gè)脈沖時(shí),然后啟用“鎖存”引腳會將這八個(gè)值復(fù)制到鎖存寄存器。這是必要的,否則當(dāng)將數(shù)據(jù)加載到移位寄存器中時(shí),錯(cuò)誤的LED會閃爍。該芯片還具有OE(輸出使能)引腳,該引腳用于一次啟用或禁用所有輸出。您可以將其連接到具有PWM功能的Arduino引腳,并使用“ analogWrite”控制LED的亮度。該引腳為低電平有效,因此我們將其連接至GND。
Arduino代碼
Arduino包含一個(gè)名為“ shiftOut”的特殊功能,該功能專門用于將數(shù)據(jù)發(fā)送到移位寄存器。
這是完整的草圖,
下載:文件
復(fù)制代碼
/*
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);
}
我們要做的第一件事是定義將要使用的三個(gè)引腳。這些是Arduino數(shù)字輸出,將連接到74HC595的鎖存器,時(shí)鐘和數(shù)據(jù)引腳。
下載:file
復(fù)制代碼
int latchPin = 5;
int clockPin = 6;
int dataPin = 4; int latchPin = 5;
int clockPin = 6;
int dataPin = 4;
接下來,定義了一個(gè)名為“ leds”的變量。這將用于保持當(dāng)前打開或關(guān)閉LED的模式。 “字節(jié)”類型的數(shù)據(jù)表示使用八位數(shù)字。每個(gè)位都可以打開或關(guān)閉,因此非常適合跟蹤我們八個(gè)LED中的哪個(gè)打開或關(guān)閉。
下載:文件
復(fù)制代碼
byte leds = 0; byte leds = 0;
“設(shè)置”功能僅設(shè)置了我們正在使用的三個(gè)引腳
下載:文件
復(fù)制代碼
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
} void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
“循環(huán)”功能最初通過將變量“ leds”的值設(shè)置為0來關(guān)閉所有LED。然后調(diào)用“ updateShiftRegister”發(fā)送“ leds” ’模式到移位寄存器,以便所有LED熄滅。稍后我們將處理‘updateShiftRegister’的工作方式。
循環(huán)功能暫停半秒鐘,然后使用‘for’循環(huán)和變量‘i’從0到7開始計(jì)數(shù)。每次,它使用Arduino函數(shù)‘bitSet’來設(shè)置控制變量‘leds’中的LED的位。然后它還會調(diào)用‘updateShiftRegister’,以便leds更新以反映變量‘leds’中的內(nèi)容。
然后,在‘i’遞增之前,有半秒的延遲,下一個(gè)LED點(diǎn)亮。
下載:文件
復(fù)制代碼
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);
}
}
函數(shù)‘updateShiftRegister’首先將LatchPin設(shè)置為低電平,然后在再次將‘latchPin’置于高電平之前調(diào)用Arduino函數(shù)‘shiftOut’。它有四個(gè)參數(shù),前兩個(gè)是分別用于數(shù)據(jù)和時(shí)鐘的引腳。
第三個(gè)參數(shù)指定要從哪個(gè)數(shù)據(jù)端開始。我們將從最右邊的位開始,這就是所謂的“最低有效位”(LSB)。
最后一個(gè)參數(shù)是要移入移位寄存器的實(shí)際數(shù)據(jù)。
下載:文件
復(fù)制代碼
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);
}
如果要關(guān)閉而不是打開LED之一,則可以在“ leds”變量上調(diào)用類似的Arduino函數(shù)(bitClear) 。這會將“ leds”的位設(shè)置為0,然后您只需跟隨它調(diào)用“ updateShiftRegister”即可更新實(shí)際的LED。
亮度控制
我未提到的74HC595的一個(gè)引腳是稱為“輸出使能”的引腳。這是針腳13,在面包板上,它永久接地。該引腳用作開關(guān),可以啟用或禁用輸出-唯一需要注意的是它是“低電平有效”(接地以啟用)。因此,如果將其連接到5V,則所有輸出均關(guān)閉。而如果將其接地,則應(yīng)該打開的那些輸出打開,應(yīng)該關(guān)閉的那些輸出關(guān)閉。
我們可以將此引腳與“ analogWrite”功能一起使用,我們在第3課中使用了該功能。 ,以使用PWM控制LED的亮度(另請參閱第3課)。
要做的是,更改與74HC595引腳13的連接,以代替將其接地,將其連接到Arduino的引腳3。
下面的草圖將在所有LED點(diǎn)亮后逐漸將它們逐漸熄滅。
下載:文件
復(fù)制代碼
/*
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”掃描燈,就像在電視連續(xù)劇《騎士騎士》中KITT的前部以及在《 Battle Start Galactica》系列中的Cylons上那樣。 li》
制作電子骰子。將6個(gè)LED排列為兩列,每列三個(gè)LED,中間一個(gè)LED。提示–看一下稱為“隨機(jī)”的Arduino函數(shù)。
74HC595的一大優(yōu)點(diǎn)是,您可以通過菊花鏈?zhǔn)竭B接它們以增加數(shù)量。您可以控制的LED。有關(guān)74HC595的更高級用法的其他指導(dǎo),請查看使用‘shiftOut’的Arduino官方文檔http://arduino.cc/zh/Tutorial/ShiftOut
責(zé)任編輯:wv
-
led
+關(guān)注
關(guān)注
242文章
23690瀏覽量
670594 -
Arduino
+關(guān)注
關(guān)注
188文章
6490瀏覽量
190041
發(fā)布評論請先 登錄
如何在iMX8MM EVK上啟用紅外接收器?
STM32CubeMx使用ADC時(shí),只需要將通道進(jìn)行配置,不需要對引腳進(jìn)行模擬輸入嗎?
DLP4710在使用的過程中,不需要內(nèi)置的光源,如何去掉這三個(gè)光源?
ADS7886只用cs就直接控制輸出了,不需要在spi在發(fā)送一個(gè)空數(shù)據(jù)啟動(dòng)時(shí)鐘了?
使用ADS1299開發(fā)套件時(shí),如何為八個(gè)通道輸入提供一個(gè)共同的外部參考?
不需要點(diǎn)表的工業(yè)網(wǎng)關(guān)應(yīng)用案例:如何提升工業(yè)企業(yè)生產(chǎn)效率與質(zhì)量?

TPA6130A2如果不需要I2C功能,是否可以將I2C的兩個(gè)引腳懸空?
C語言為什么不需要包含stdio.h
“不需要點(diǎn)表的工業(yè)網(wǎng)關(guān)” 深控技術(shù)物聯(lián)網(wǎng)解決方案

不需要點(diǎn)表的工業(yè)網(wǎng)關(guān),究竟有多大潛力?

評論