电子说
步骤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
全部0条评论
快来发表一下你的评论吧 !