步驟1:移位寄存器簡介
什么是移位寄存器:
移位寄存器的基本目的是增加微控制器的輸入/輸出引腳數。所使用的移位寄存器可以是用于增加輸出引腳的74HC595,而74HC164是用于增加輸入引腳的移位寄存器。需要注意的最重要一點是,可以將多個移位寄存器級聯。因此,微控制器僅使用3個引腳就可以將8個電源控制到n個輸出/輸入的電源。這種級聯也可以稱為移位寄存器的菊花鏈。
移位寄存器的引腳:
移位寄存器最重要的引腳如下:
串行輸入(PIN 14):
用于移位移位寄存器下一個輸入的引腳。
RCK(引腳12):
此引腳被拉高時,將移位寄存器。
串行時鐘(PIN11):
需要拉高以將輸出設置為新的移位寄存器值,必須在SRCLK之后立即將其拉高。
QH‘(引腳9):
該引腳的意義在于可以連接到下一個移位寄存器的串行輸入(PIN14),并且菊花鏈可以增加。
移位寄存器的工作原理:
可以將移位寄存器與數據游戲進行比較沿路口移動。當移位寄存器的RCK引腳變為HIGH時,它們將移至另一個結點,因此可以使用以下原理將數據傳輸到任意數量的移位寄存器。移位寄存器可以使用串行時鐘(PIN 11)保持這些值。每當串行時鐘引腳變高時,RCK引腳就會變低,依此類推,直到傳輸所需的數據為止。
我提供了一個123D電路圖,描述了移位寄存器與Arduino的連接。以及移位寄存器工作所需的基本連接。提供的第二個123d電路圖顯示了第二個移位寄存器的連接,依此類推。
菊花鏈移位寄存器:
可以增加移位寄存器通過將QH’引腳與第二個串行輸入的移位寄存器(PIN 14)連接。因此,輸出的數量僅限于可以連接的移位寄存器的數量。選件隨附的代碼可連接多達40個以上的寄存器。我還提供了模塊的實時圖以及使用這些模塊與arduino的連接。
步驟2:模塊的組裝和焊接-1
正如我前面提到的,此Instructable具有不同的方法組裝,我使用分步焊接教程。我希望它的作用與僅提供電路并自行完成一樣有用。將來,我將嘗試使其成為蝕刻過的PCB,以便使焊接變得更加容易。第一張圖片顯示了完成的模塊。
無論如何,所生產的模塊將是4 x 3 cm的正方形,并且可以通過菊花鏈方式鏈接更多的模塊,并且可以根據需要增加輸入量。因此,讓我們開始組裝吧!!!!
步驟1:
第一步是插入LED。
注1:
請注意,應通過電源檢查led條形圖的位置,以便正確插入。來自arduino的5V電壓就足夠了,但請不要長時間連接,否則LED會短路。名為 Note1 的圖顯示了我檢查模塊的方法。請忽略圖中的電阻,直接將其連接。
第2步:
檢查后,如圖所示插入1k電阻。需要這個電阻是因為它為最終的LED提供了電阻。其次是接地的4k7電阻矩陣。有關電阻的位置,請參見該圖。我在圖中顯示了10k,但請忽略它。
注2:
該注意事項非常重要,因為只有在LED亮起時,電阻矩陣接地引腳(?)才應正確連接到接地軌。這很關鍵,因為如果矩陣反轉,LED將會變暗。
第3步:
因此,如圖所示,將電阻矩陣的菱形端(?)插入接地端。然后焊接矩陣的引腳。您也可以通過連接電源來仔細檢查LED。
步驟3:模塊的組裝和焊接-2
注3:
在插入主IC之前,只需使用指南針或刀片進行切割即可。可以使用萬用表中的連續性測試儀檢查切口。
第4步:
IC如圖所示并且使用DIP插座,以便在發生任何故障時可以更換IC。最后焊接接頭。
步驟5:
移位寄存器可以控制8個LED,但是模塊有10個LED因此,額外的兩個是由兩個公頭控制的,它們可以由Arduino控制。焊接接頭。
第6步:
需要按圖所示連接跳線。連接器的一端連接到LED條形圖,另一個連接到74HC595的第15引腳。
第7步:
接下來是電源供應您需要如圖所示連接兩個接頭并焊接接頭。
第8步:
現在插入兩個如圖所示,以下引腳上的公頭連接器。然后焊接接頭。它們可以連接到Arduino或下一個模塊。
注意4:
將圖中所示的銷釘焊接到接地導軌上。這比連接跳線要容易。
步驟4:模塊的組裝和焊接-3
第9步:
將面包板電線作為跨接線連接起來,如圖所示并將它們焊接在底部。跳線用于將Vcc發送到IC電源引腳。
步驟10:
焊接1uF電容器如圖所示,使負極側焊接到電路板的接地軌,正極軌到達引腳。只需參考先前步驟中的電路圖即可。
第11步:
使用剪刀剪切模塊并進行剪切盡可能緊湊。然后您就完成了您的第一個模塊的準備工作。
只需重復這些步驟即可創建所需的任意數量的模塊,并以菊花鏈的方式增加它們的輸入量。 LED的輸出可以發送到繼電器板上,并且僅使用Arduino的三個引腳就可以驅動任意數量的繼電器。最后一張圖顯示了完成的模塊,到目前為止,我已經制作了3個模塊。下一步,我們測試完成的模塊。
步驟5:檢查模塊
一旦完成模塊,您就可以使用此簡單代碼檢查完成的模塊。該代碼顯示了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個引腳控制24個以上輸出的代碼。
步驟6:主代碼
如圖所示連接電路。然后上傳給定的代碼,該代碼可用于控制寄存器的各個引腳。該代碼專門用于控制繼電器。它們也可以用于制造大型LED追逐器,您只需要根據應用程序更改代碼即可。
首先,我將解釋根據移位寄存器的數量需要更改的基本行。顧名思義,具有
//How many of the shift registers - change this
#define number_of_74hc595s 1
的代碼行應提供您正在使用的移位寄存器模塊的數量。該程序最多只能有40個以上的移位寄存器。
setRegisterPin(2, HIGH);
setRegisterPin(3, HIGH);
setRegisterPin(4, LOW);
setRegisterPin(5, HIGH);
setRegisterPin(7, HIGH);
writeRegisters();
這行代碼是u可以用來控制移位寄存器引腳的主要功能。 “ writeRegisters()”行是為了將數據發送到移位寄存器而需要調用的函數。假設您需要控制第三個移位寄存器模塊的第24引腳,則代碼為
setRegisterPin(24, HIGH);
假設您需要重置引腳,以使所有引腳均變低,然后功能將變為
clearRegisters();
最后,下面給出了控制引腳的總體代碼,我還附帶了該程序的代碼。因此,在此代碼中,以下引腳設置為高電平,并且可以使用清除寄存器功能將其復位。我使用3個移位寄存器模塊,因此如果使用2個移位寄存器,則必須更改代碼。如果一切順利,輸出將如上面的視頻所示。使用此基本思想,您可以設計出色的微控制器項目。
代碼:
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追逐者很有趣!
如果您已達到此測試,則說明您已成功完成模塊。因此,讓我們做一個LED追逐器不僅是為了娛樂,而且是為了進一步理解代碼。下面給出了代碼以嘗試使用新模塊。我上傳了我的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();
}
責任編輯:wv
-
移位寄存器
+關注
關注
3文章
258瀏覽量
22275 -
Arduino
+關注
關注
188文章
6470瀏覽量
187139
發布評論請先 登錄
相關推薦
評論