該項(xiàng)目主要是為帶有移位寄存器的發(fā)光二極管立方體(4*4)編寫代碼,為立方體創(chuàng)造不同的模式。
硬件組件:
Arduino Nano R3
移位寄存器75HC595
瞬時(shí)按鈕開關(guān)
發(fā)光二極管
4*4立方體:
該立方體有16條腿和4排的立方體。Les s把這些行叫做層。如何將這16條支路連接到Arduino而不占用其所有引腳的最簡(jiǎn)單方法是使用移位寄存器75HC595。
(移位寄存器75HC595)
將立方體的前8個(gè)引腳(1-8)連接到第一個(gè)移位寄存器(引腳Q0-Q7),并將其他8個(gè)引腳(9-16)連接到另一個(gè)引腳,如俯視圖中的表格所示:
(俯視立方體的腿)
下一步是用Arduino連接移位寄存器的引腳,如下所示:
引腳8(兩個(gè)移位寄存器/ GND)至阿爾杜伊諾的接地引腳
第一移位寄存器的引腳9 (Q7)至第二移位寄存器的引腳14(數(shù)據(jù))
引腳10(兩個(gè)移位寄存器/復(fù)位)至Arduino的引腳8
引腳11(兩個(gè)移位寄存器/時(shí)鐘)至Arduino的引腳9
引腳12(兩個(gè)移位寄存器/鎖存器)至Arduino的引腳10
引腳14(第一個(gè)移位寄存器/數(shù)據(jù))至Arduino的引腳11
引腳16(兩個(gè)移位寄存器/ VCC)至Arduino的5V引腳
最后一步是用Arduino連接立方體的層:
引腳4 -第0層(通過100歐姆電阻)
引腳5 -第1層(通過100歐姆電阻)
引腳6 -第2層(通過100歐姆電阻)
引腳7 -第3層(通過100歐姆電阻)
(立方體的底部)
控制led:
一層中的每個(gè)led都由一個(gè)數(shù)字表示,如下表所示:
(打開指示燈的值)
所以要打開圖層第二行的第二個(gè)led,就會(huì)設(shè)置layer = 32。要打開前兩個(gè)led,layer = 1 + 2 = 3。要打開第一行l(wèi)ed,layer = 1 + 2 + 4 + 8 = 15。
如果想將循環(huán)中的光穿過層中的所有LED,在第一步中,設(shè)置layer=b000000000000001=1,然后在循環(huán)中,將通過設(shè)置layer=layer《《1來移動(dòng)該位。或者可以設(shè)置layer=(1《《count)并在循環(huán)中增加“count”。
主回路:
當(dāng)知道如何在一層中設(shè)置led時(shí),想要控制4層。雖然只能向我們的2個(gè)移位寄存器發(fā)送關(guān)于1層的信息,但使用Arduino的主循環(huán)來非常快速地打開和關(guān)閉循環(huán)中的層,它們將在同一時(shí)刻全部改變。顯示圖層值的代碼非常簡(jiǎn)單:
SetShiftReg(layer[k]); //將層數(shù)據(jù)發(fā)送到移位寄存器
bitClear(PORTD, 4 + k); //啟用“層k”
delay(1); //對(duì)LED亮度很重要
PORTD |= B11110000; //關(guān)閉圖層
k++; if (k 》 3) k = 0; //在循環(huán)中再增加一層
在該項(xiàng)目中,使用按鈕(與接地和Arduino的引腳2連接)來改變創(chuàng)建的模式。按下按鈕設(shè)置“開始”。這個(gè)開始采用并初始化下一個(gè)模式。
然后,循環(huán)在“速度時(shí)間”值中設(shè)置的每一個(gè)時(shí)間(以毫秒為單位)后啟動(dòng)選定的模式。
關(guān)于主循環(huán)和按鈕的標(biāo)簽:
#define buttonPin 2
unsigned int layer[4] = {0, 0, 0, 0}; //65535填充層
byte k = 0;
bool start = true;
unsigned long delayTime;
int speedTime = 0;
int count;
void setup() {
InitializeShiftReg();
InitializeMyLedCube();
}
void InitializeMyLedCube() {
DDRD = B11110000; //引腳D0-D3作為輸入,D4-D7作為輸出
PORTD |= B11110000; //關(guān)閉圖層
pinMode(buttonPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(buttonPin), PushButton, FALLING);
delayTime = millis();
}
byte patternNum = 28;
byte pattern = patternNum - 1;
void loop() {
if (start) {
detachInterrupt(digitalPinToInterrupt(buttonPin));
delay(500); //等待釋放按鈕
pattern++;
if (pattern 》 patternNum) pattern = 1;
attachInterrupt(digitalPinToInterrupt(buttonPin), PushButton, FALLING);
count = 0;
}
if (((millis() - delayTime) 》 speedTime) || start) {
switch (pattern) {
case 1: LayersUpDown(); break;
case 2: FallingDot(); break;
case 3: Rain(); break;
case 4: AllCube(); break;
case 5: Cut(); break;
case 6: Cube(); break;
case 7: Diagonal(); break;
case 8: Mixer(); break;
case 9: Random(); break;
case 10: FallingLayer(); break;
case 11: LayerCut(); break;
case 12: Circle(); break;
case 13: RandomWay(); break;
case 14: SmallCube(); break;
case 15: RandomWayCube(); break;
case 16: GrowingCube(); break;
case 17: FallingLayers(); break;
case 18: GrowingLine(); break;
case 19: CircleEdges(); break;
case 20: CircleSide(); break;
case 21: RandomWayLine(); break;
case 22: RandomWaySide(); break;
case 23: DJCube(); break;
case 24: FillingCube(); break;
case 25: NanoBuilding(); break;
case 26: Curve(); break;
case 27: Snake(); break;
case 28: Julka(); break;
default: break;
}
delayTime = millis();
}
//此部分顯示在函數(shù)中設(shè)置的圖層
SetShiftReg(layer[k]); //將層數(shù)據(jù)發(fā)送到移位寄存器
bitClear(PORTD, 4 + k); //啟用“層k”
delay(1); //對(duì)LED亮度很重要
PORTD |= B11110000; //關(guān)閉圖層
k++; if (k 》 3) k = 0; //在循環(huán)中再增加一層
}
void PushButton() {
start = true;
}
“移位寄存器”標(biāo)簽:
#define latchPin 10 //端口 B2
#define clockPin 9 //端口 B1
#define dataPin 11 //端口B3
#define resetPin 8 //端口 B0
void InitializeShiftReg() {
DDRB |= B1111; //引腳D8-D11作為輸出
PORTB |= B0001; //將引腳重置為高
}
void SetShiftReg(unsigned int value) {
bitClear(PORTB, 2); //數(shù)字寫入(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, value 》》 8);
shiftOut(dataPin, clockPin, MSBFIRST, value);
bitSet(PORTB, 2); //數(shù)字寫入(latchPin, HIGH);
}
創(chuàng)建模式:
每次在“速度時(shí)間”值中設(shè)置模式的開始后,Arduino的主循環(huán)都會(huì)啟動(dòng)選定的模式。換句話說,一個(gè)模式的函數(shù)總是只改變一次層,但是主循環(huán)會(huì)重復(fù)多次。
以Rain()模式為例:
void Rain() {
if (start) {
start = false; speedTime = 200;
ClearLayers();
}
layer[0] = layer[1];
layer[1] = layer[2];
layer[2] = layer[3];
layer[3] = 1 《《 random(16);
}
只有當(dāng)打開模式時(shí),“開始”部分才會(huì)啟動(dòng)一次。它設(shè)置速度時(shí)間并關(guān)閉所有l(wèi)ed。然后,總是隨機(jī)打開頂層16個(gè)led中的一個(gè),在這個(gè)循環(huán)中,把它移到底層。
責(zé)任編輯:pj
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7246瀏覽量
91110 -
發(fā)光二極管
+關(guān)注
關(guān)注
13文章
1214瀏覽量
67318 -
移位寄存器
+關(guān)注
關(guān)注
3文章
287瀏覽量
22657
發(fā)布評(píng)論請(qǐng)先 登錄
紫外發(fā)光二極管的發(fā)光原理 紫外發(fā)光二極管的結(jié)構(gòu)

發(fā)光二極管型號(hào)有哪些_發(fā)光二極管型號(hào)大全
發(fā)光二極管型號(hào)有哪些_發(fā)光二極管型號(hào)大全
74HC595點(diǎn)亮8個(gè)發(fā)光二極管實(shí)驗(yàn)?zāi)康?/a>
閃爍式發(fā)光二極管
發(fā)光二極管(LED),發(fā)光二極管(LED)是什么意思
發(fā)光二極管的原理是什么?
有機(jī)發(fā)光二極管_什么是有機(jī)發(fā)光二極管

評(píng)論