0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

454398 来源:网络整理 作者:网络整理 2019-11-20 11:09 次阅读

步骤1:移位寄存器简介

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

什么是移位寄存器:

移位寄存器的基本目的是增加微控制器的输入/输出引脚数。所使用的移位寄存器可以是用于增加输出引脚的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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 移位寄存器
    +关注

    关注

    2

    文章

    258

    浏览量

    22228
  • Arduino
    +关注

    关注

    187

    文章

    6463

    浏览量

    186621
收藏 人收藏

    评论

    相关推荐

    stm32与Arduino的比较

    在微控制器的世界里,STM32和Arduino是两经常被提及的名字。STM32是一系列由STMicroelectronics生产的高性能微控制器,而
    的头像 发表于 11-19 15:45 163次阅读

    放大倍数指的是物体的什么的放大倍数

    放大倍数是一物理学和光学领域中常见的概念,它描述了通过显微镜、望远镜或其他放大设备观察物体时,物体的尺寸相对于其原始尺寸的放大程度。 一、放大倍数的定义 放大倍数(Magnifica
    的头像 发表于 07-30 14:15 1494次阅读

    示波器衰减倍数与探头衰减倍数之间的关系

    示波器衰减倍数与探头衰减倍数之间是电子测量中一重要而又容易混淆的概念。在本文中,我们将探讨示波器衰减倍数与探头衰减倍数之间的关系,以及它们
    的头像 发表于 07-29 11:40 975次阅读
    示波器衰减<b class='flag-5'>倍数</b>与探头衰减<b class='flag-5'>倍数</b>之间的关系

    为什么可以将一GPIO引脚同时配置为输入输出模式呢?

    的一系列高低电平。 那么对于GPIO6而言,在发送起始信号的时候,是输出模式,接收信号的时候是输入模式,也就是说需要将一引脚同时配置为输入输出模式。 我注意到,在gpio_mod
    发表于 06-05 07:37

    ESP32C3使用GPIO2,8,9任意一引脚输出低电平时功耗会增加,怎么解决?

    如题,这三引脚当我使用其中任意一输出低电平时功耗会增加,大概几百ua左右。输出高电平则一切正常,未见功耗增加。其他
    发表于 06-05 06:36

    STM8S003F3上电后怎么默认I/O引脚输出低电平?

    MCU型号:STM8S003F3。 问题描述:一空程序的MCU上电后输出高电平,通过程序配置I/O引脚输出低电平,但这样的话会有一
    发表于 05-10 08:23

    如何用Arduino制作一简易自动喂鱼器

    制作硬件电路了。 第2步:电路图和程序 我们可以将电路分为两部分,第一部分是步进电机,另一部分是超声波传感器。 将步进电机连接到驱动器,然后根据下面的说明将驱动器引脚连接到Arduino: In1
    发表于 03-28 11:25

    用STM32F407控制器遥控控制3直流电机,PWM引脚输出电压达不到驱动器的控制电压为什么?

    请教各位大拿,我用STM32F407控制器遥控控制3直流电机,分别模拟汽车的转向电机、制动电机、油门电机,程序没有问题,原车上都调试过了,采用4
    发表于 03-20 08:07

    arduino控制步进电机代码

    中,我们将详细介绍如何使用Arduino控制步进电机的代码。 步进电机通常用于需要精确控制角度和位置的应用中,例如3D打印机、数控铣床和机
    的头像 发表于 02-14 16:29 1876次阅读

    arduino中while循环怎么跳出

    执行某段代码的情况。然而,如何在合适的时机跳出 while 循环是一需要注意的问题。本文将详细介绍 Arduino 中 while 循环的基本概念,以及如何使用不同的技巧跳出该循环来实现代码
    的头像 发表于 02-14 16:22 2385次阅读

    ESP32与Arduino板之间的区别差异

    Arduino板包括一ATmega328P8位微控制器,具有0至13数字引脚。这些
    的头像 发表于 02-02 14:36 6898次阅读
    ESP32与<b class='flag-5'>Arduino</b>板之间的区别差异

    AD9914的倍频倍数怎样计算的?

    AD9914的倍频倍数怎样计算的?手册上是这样说的:设置PLL的反馈分频器。分频器范围为8×至255xx。 位[15:8] = 0000 = 8
    发表于 12-12 08:20

    使用按钮依次切换8输出且可控制输出通道

    本案例使用按钮依次切换8输出且可控制输出通道,比如控制指示灯,可以输入序号来点亮该序号指示灯,
    的头像 发表于 12-04 15:52 679次阅读
    使用按钮依次切换<b class='flag-5'>8</b><b class='flag-5'>个</b><b class='flag-5'>输出</b>且可<b class='flag-5'>控制</b><b class='flag-5'>输出</b>通道

    放大倍数可调的放大器的设计

    放大倍数的设计需要考虑放大器的输入信号、放大倍数输出信号之间的关系。在放大器中,输入信号经过放大后得到一更大的输出信号。放大
    的头像 发表于 12-01 15:29 2032次阅读

    AD8368上下限截止频率是通过HPFL和DECL两引脚控制的吗?

    AD8368上下限截止频率是通过HPFL和DECL两引脚控制的吗,因为datasheet里面有两公式。 还有就是那自动增益控制是怎么实
    发表于 11-27 06:08