怎样仅使用3个Arduino引脚控制8个输出数量的倍数所需的硬件和代码

电子说

1.3w人已加入

描述

步骤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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分