步驟1:移位寄存器簡(jiǎn)介
什么是移位寄存器:
移位寄存器的基本目的是增加微控制器的輸入/輸出引腳數(shù)。所使用的移位寄存器可以是用于增加輸出引腳的74HC595,而74HC164是用于增加輸入引腳的移位寄存器。需要注意的最重要一點(diǎn)是,可以將多個(gè)移位寄存器級(jí)聯(lián)。因此,微控制器僅使用3個(gè)引腳就可以將8個(gè)電源控制到n個(gè)輸出/輸入的電源。這種級(jí)聯(lián)也可以稱為移位寄存器的菊花鏈。
移位寄存器的引腳:
移位寄存器最重要的引腳如下:
串行輸入(PIN 14):
用于移位移位寄存器下一個(gè)輸入的引腳。
RCK(引腳12):
此引腳被拉高時(shí),將移位寄存器。
串行時(shí)鐘(PIN11):
需要拉高以將輸出設(shè)置為新的移位寄存器值,必須在SRCLK之后立即將其拉高。
QH‘(引腳9):
該引腳的意義在于可以連接到下一個(gè)移位寄存器的串行輸入(PIN14),并且菊花鏈可以增加。
移位寄存器的工作原理:
可以將移位寄存器與數(shù)據(jù)游戲進(jìn)行比較沿路口移動(dòng)。當(dāng)移位寄存器的RCK引腳變?yōu)镠IGH時(shí),它們將移至另一個(gè)結(jié)點(diǎn),因此可以使用以下原理將數(shù)據(jù)傳輸?shù)饺我鈹?shù)量的移位寄存器。移位寄存器可以使用串行時(shí)鐘(PIN 11)保持這些值。每當(dāng)串行時(shí)鐘引腳變高時(shí),RCK引腳就會(huì)變低,依此類推,直到傳輸所需的數(shù)據(jù)為止。
我提供了一個(gè)123D電路圖,描述了移位寄存器與Arduino的連接。以及移位寄存器工作所需的基本連接。提供的第二個(gè)123d電路圖顯示了第二個(gè)移位寄存器的連接,依此類推。
菊花鏈移位寄存器:
可以增加移位寄存器通過(guò)將QH’引腳與第二個(gè)串行輸入的移位寄存器(PIN 14)連接。因此,輸出的數(shù)量?jī)H限于可以連接的移位寄存器的數(shù)量。選件隨附的代碼可連接多達(dá)40個(gè)以上的寄存器。我還提供了模塊的實(shí)時(shí)圖以及使用這些模塊與arduino的連接。
步驟2:模塊的組裝和焊接-1
正如我前面提到的,此Instructable具有不同的方法組裝,我使用分步焊接教程。我希望它的作用與僅提供電路并自行完成一樣有用。將來(lái),我將嘗試使其成為蝕刻過(guò)的PCB,以便使焊接變得更加容易。第一張圖片顯示了完成的模塊。
無(wú)論如何,所生產(chǎn)的模塊將是4 x 3 cm的正方形,并且可以通過(guò)菊花鏈方式鏈接更多的模塊,并且可以根據(jù)需要增加輸入量。因此,讓我們開(kāi)始組裝吧?。。?!
步驟1:
第一步是插入LED。
注1:
請(qǐng)注意,應(yīng)通過(guò)電源檢查led條形圖的位置,以便正確插入。來(lái)自arduino的5V電壓就足夠了,但請(qǐng)不要長(zhǎng)時(shí)間連接,否則LED會(huì)短路。名為 Note1 的圖顯示了我檢查模塊的方法。請(qǐng)忽略圖中的電阻,直接將其連接。
第2步:
檢查后,如圖所示插入1k電阻。需要這個(gè)電阻是因?yàn)樗鼮樽罱K的LED提供了電阻。其次是接地的4k7電阻矩陣。有關(guān)電阻的位置,請(qǐng)參見(jiàn)該圖。我在圖中顯示了10k,但請(qǐng)忽略它。
注2:
該注意事項(xiàng)非常重要,因?yàn)橹挥性贚ED亮起時(shí),電阻矩陣接地引腳(?)才應(yīng)正確連接到接地軌。這很關(guān)鍵,因?yàn)槿绻仃嚪崔D(zhuǎn),LED將會(huì)變暗。
第3步:
因此,如圖所示,將電阻矩陣的菱形端(?)插入接地端。然后焊接矩陣的引腳。您也可以通過(guò)連接電源來(lái)仔細(xì)檢查L(zhǎng)ED。
步驟3:模塊的組裝和焊接-2
注3:
在插入主IC之前,只需使用指南針或刀片進(jìn)行切割即可??梢允褂?a href="http://ttokpm.com/v/tag/796/" target="_blank">萬(wàn)用表中的連續(xù)性測(cè)試儀檢查切口。
第4步:
IC如圖所示并且使用DIP插座,以便在發(fā)生任何故障時(shí)可以更換IC。最后焊接接頭。
步驟5:
移位寄存器可以控制8個(gè)LED,但是模塊有10個(gè)LED因此,額外的兩個(gè)是由兩個(gè)公頭控制的,它們可以由Arduino控制。焊接接頭。
第6步:
需要按圖所示連接跳線。連接器的一端連接到LED條形圖,另一個(gè)連接到74HC595的第15引腳。
第7步:
接下來(lái)是電源供應(yīng)您需要如圖所示連接兩個(gè)接頭并焊接接頭。
第8步:
現(xiàn)在插入兩個(gè)如圖所示,以下引腳上的公頭連接器。然后焊接接頭。它們可以連接到Arduino或下一個(gè)模塊。
注意4:
將圖中所示的銷釘焊接到接地導(dǎo)軌上。這比連接跳線要容易。
步驟4:模塊的組裝和焊接-3
第9步:
將面包板電線作為跨接線連接起來(lái),如圖所示并將它們焊接在底部。跳線用于將Vcc發(fā)送到IC電源引腳。
步驟10:
焊接1uF電容器如圖所示,使負(fù)極側(cè)焊接到電路板的接地軌,正極軌到達(dá)引腳。只需參考先前步驟中的電路圖即可。
第11步:
使用剪刀剪切模塊并進(jìn)行剪切盡可能緊湊。然后您就完成了您的第一個(gè)模塊的準(zhǔn)備工作。
只需重復(fù)這些步驟即可創(chuàng)建所需的任意數(shù)量的模塊,并以菊花鏈的方式增加它們的輸入量。 LED的輸出可以發(fā)送到繼電器板上,并且僅使用Arduino的三個(gè)引腳就可以驅(qū)動(dòng)任意數(shù)量的繼電器。最后一張圖顯示了完成的模塊,到目前為止,我已經(jīng)制作了3個(gè)模塊。下一步,我們測(cè)試完成的模塊。
步驟5:檢查模塊
一旦完成模塊,您就可以使用此簡(jiǎn)單代碼檢查完成的模塊。該代碼顯示了led追蹤器和其他一些有趣的模式。此代碼基本上是用于檢查模塊并確保其正常工作的。
代碼:
int data = 11;
int clock = 12;
int latch = 8;
// the animation sequence for the LED display
// first column is the LED status in binary form, second column is the timing in milliseconds
byte patterns[48] = {
B00000001, 100,
B00000010, 100,
B00000100, 100,
B00001000, 100,
B00010000, 100,
B00100000, 100,
B01000000, 100,
B10000000, 100,
B01000000, 100,
B00100000, 100,
B00010000, 100,
B00001000, 100,
B00000100, 100,
B00000010, 100,
B00000001, 100,
B00011000, 200,
B00100100, 200,
B01000010, 200,
B10000001, 200,
B01000010, 200,
B10100101, 200,
B01011010, 200,
B00100100, 200,
B00011000, 200
};
// variables used for status
int pattern_index = 0;
int pattern_count = sizeof(patterns) / 2;
void setup()
{
// setup the serial output if needed
Serial.begin(9600);
// define the pin modes
pinMode( data, OUTPUT);
pinMode(clock, OUTPUT);
pinMode(latch, OUTPUT);
}
void loop()
{
// activate the patterns
digitalWrite(latch, LOW);
shiftOut(data, clock, MSBFIRST, patterns[pattern_index*2]);
digitalWrite(latch, HIGH);
// delay for the timing
delay(patterns[(pattern_index*2) + 1]);
// move to the next animation step
pattern_index ++;
// if we‘re at the end of the animation loop, reset and start again
if (pattern_index 》 pattern_count) pattern_index = 0;
}
如果一切順利,那么您將獲得與給定視頻相同的輸出。在下一步中,我將向您展示如何菊花鏈它們以及僅使用Arduino的3個(gè)引腳控制24個(gè)以上輸出的代碼。
步驟6:主代碼
如圖所示連接電路。然后上傳給定的代碼,該代碼可用于控制寄存器的各個(gè)引腳。該代碼專門(mén)用于控制繼電器。它們也可以用于制造大型LED追逐器,您只需要根據(jù)應(yīng)用程序更改代碼即可。
首先,我將解釋根據(jù)移位寄存器的數(shù)量需要更改的基本行。顧名思義,具有
//How many of the shift registers - change this
#define number_of_74hc595s 1
的代碼行應(yīng)提供您正在使用的移位寄存器模塊的數(shù)量。該程序最多只能有40個(gè)以上的移位寄存器。
setRegisterPin(2, HIGH);
setRegisterPin(3, HIGH);
setRegisterPin(4, LOW);
setRegisterPin(5, HIGH);
setRegisterPin(7, HIGH);
writeRegisters();
這行代碼是u可以用來(lái)控制移位寄存器引腳的主要功能。 “ writeRegisters()”行是為了將數(shù)據(jù)發(fā)送到移位寄存器而需要調(diào)用的函數(shù)。假設(shè)您需要控制第三個(gè)移位寄存器模塊的第24引腳,則代碼為
setRegisterPin(24, HIGH);
假設(shè)您需要重置引腳,以使所有引腳均變低,然后功能將變?yōu)?/p>
clearRegisters();
最后,下面給出了控制引腳的總體代碼,我還附帶了該程序的代碼。因此,在此代碼中,以下引腳設(shè)置為高電平,并且可以使用清除寄存器功能將其復(fù)位。我使用3個(gè)移位寄存器模塊,因此如果使用2個(gè)移位寄存器,則必須更改代碼。如果一切順利,輸出將如上面的視頻所示。使用此基本思想,您可以設(shè)計(jì)出色的微控制器項(xiàng)目。
代碼:
int SER_Pin = 11; //pin 14 on the 75HC595
int RCLK_Pin = 8; //pin 12 on the 75HC595
int SRCLK_Pin = 12; //pin 11 on the 75HC595
//How many of the shift registers - change this
#define number_of_74hc595s 3
//do not touch
#define numOfRegisterPins number_of_74hc595s * 8
boolean registers[numOfRegisterPins];
void setup(){
pinMode(SER_Pin, OUTPUT);
pinMode(RCLK_Pin, OUTPUT);
pinMode(SRCLK_Pin, OUTPUT);
//reset all register pins
clearRegisters();
writeRegisters();
}
//set all register pins to LOW
void clearRegisters(){
for(int i = numOfRegisterPins - 1; i 》= 0; i--){
registers[i] = LOW;
}
writeRegisters();
}
//Set and display registers
//Only call AFTER all values are set how you would like (slow otherwise)
void writeRegisters(){
digitalWrite(RCLK_Pin, LOW);
for(int i = numOfRegisterPins - 1; i 》= 0; i--){
digitalWrite(SRCLK_Pin, LOW);
int val = registers[i];
digitalWrite(SER_Pin, val);
digitalWrite(SRCLK_Pin, HIGH);
}
digitalWrite(RCLK_Pin, HIGH);
}
//set an individual pin HIGH or LOW
void setRegisterPin(int index, int value){
registers[index] = value;
}
void loop(){
setRegisterPin(0, LOW);
setRegisterPin(1, HIGH);
setRegisterPin(2, LOW);
setRegisterPin(3, HIGH);
setRegisterPin(4, LOW);
setRegisterPin(5, HIGH);
setRegisterPin(6, LOW);
setRegisterPin(7, HIGH);
setRegisterPin(8, LOW);
setRegisterPin(9, HIGH);
setRegisterPin(10, LOW);
setRegisterPin(11, HIGH);
setRegisterPin(12, LOW);
setRegisterPin(13, HIGH);
setRegisterPin(14, LOW);
setRegisterPin(15, HIGH);
setRegisterPin(16, LOW);
setRegisterPin(17, HIGH);
setRegisterPin(18, LOW);
setRegisterPin(19, HIGH);
setRegisterPin(20, LOW);
setRegisterPin(21, HIGH);
setRegisterPin(22, LOW);
setRegisterPin(23, HIGH);
writeRegisters();
delay(500);
clearRegisters();
setRegisterPin(0, HIGH);
setRegisterPin(1, LOW);
setRegisterPin(2, HIGH);
setRegisterPin(3, LOW);
setRegisterPin(4, HIGH);
setRegisterPin(5, LOW);
setRegisterPin(6, HIGH);
setRegisterPin(7, LOW);
setRegisterPin(8, HIGH);
setRegisterPin(9, LOW);
setRegisterPin(10, HIGH);
setRegisterPin(11, LOW);
setRegisterPin(12, HIGH);
setRegisterPin(13, LOW);
setRegisterPin(14, HIGH);
setRegisterPin(15, LOW);
setRegisterPin(16, HIGH);
setRegisterPin(17, LOW);
setRegisterPin(18, HIGH);
setRegisterPin(19, LOW);
setRegisterPin(20, HIGH);
setRegisterPin(21, LOW);
setRegisterPin(22, HIGH);
setRegisterPin(23, LOW);
writeRegisters();
delay(500);
clearRegisters();
}
步驟7:LED追逐者很有趣!
如果您已達(dá)到此測(cè)試,則說(shuō)明您已成功完成模塊。因此,讓我們做一個(gè)LED追逐器不僅是為了娛樂(lè),而且是為了進(jìn)一步理解代碼。下面給出了代碼以嘗試使用新模塊。我上傳了我的LED追逐器的視頻。
代碼:
int SER_Pin = 11; //pin 14 on the 75HC595
int RCLK_Pin = 8; //pin 12 on the 75HC595
int SRCLK_Pin = 12; //pin 11 on the 75HC595
//How many of the shift registers - change this
#define number_of_74hc595s 3
//do not touch
#define numOfRegisterPins number_of_74hc595s * 8
boolean registers[numOfRegisterPins];
void setup(){
Serial.begin(9600);
pinMode(SER_Pin, OUTPUT);
pinMode(RCLK_Pin, OUTPUT);
pinMode(SRCLK_Pin, OUTPUT);
//reset all register pins
clearRegisters();
writeRegisters();
}
//set all register pins to LOW
void clearRegisters(){
for(int i = numOfRegisterPins - 1; i 》= 0; i--){
registers[i] = LOW;
}
writeRegisters();
}
//Set and display registers
//Only call AFTER all values are set how you would like (slow otherwise)
void writeRegisters(){
digitalWrite(RCLK_Pin, LOW);
for(int i = numOfRegisterPins - 1; i 》= 0; i--){
digitalWrite(SRCLK_Pin, LOW);
int val = registers[i];
digitalWrite(SER_Pin, val);
digitalWrite(SRCLK_Pin, HIGH);
}
digitalWrite(RCLK_Pin, HIGH);
}
//set an individual pin HIGH or LOW
void setRegisterPin(int index, int value){
registers[index] = value;
}
void loop(){
for(int i = 0;i 《 numOfRegisterPins;i++)
{
setRegisterPin(i , HIGH);
Serial.println(i);
writeRegisters();
delay(70);
clearRegisters();
}
clearRegisters();
for(int i = 24; i 》 0; i--)
{
setRegisterPin(i , HIGH);
writeRegisters();
Serial.println(i);
delay(70);
clearRegisters();
}
clearRegisters();
}
責(zé)任編輯:wv
-
移位寄存器
+關(guān)注
關(guān)注
2文章
258瀏覽量
22212 -
Arduino
+關(guān)注
關(guān)注
187文章
6461瀏覽量
186524
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論