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

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

    关注

    3

    文章

    336

    浏览量

    23174
  • Arduino
    +关注

    关注

    190

    文章

    6515

    浏览量

    195969
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【求清单】STM32 硬件采购清单(纯软件视角,适配代码开发)

    纯软件开发者,无硬件基础,需基于 STM32 开发【无人打窝船的电机控制 + GPS 定位程序,lore通讯,带陀螺仪,需要能跑通代码硬件
    发表于 12-02 10:44

    ‌AMC8Vx08 8通道16位模拟控制器技术文档总结

    ) 和两 16 位 IDAC,可配置为控制输出电流生成电路 (IDAC+)。AMC8Vx08还包括一MUXOUT
    的头像 发表于 10-23 13:46 396次阅读
    ‌AMC<b class='flag-5'>8</b>Vx08 <b class='flag-5'>8</b>通道16位模拟<b class='flag-5'>控制</b>器技术文档总结

    如何用Arduino Nano/UNO R3开发板给另一Arduino IDE不能下载的Arduino Nano/UNO R3开发板重新烧录引导程序bootlaoder

    本文介绍了如何用能够Arduino IDE下载的Arduino Nano/UNO R3开发板给另一Arduino IDE不能下载的
    的头像 发表于 08-08 20:16 3062次阅读
    如何用<b class='flag-5'>Arduino</b> Nano/UNO R<b class='flag-5'>3</b>开发板给另一<b class='flag-5'>个</b><b class='flag-5'>Arduino</b> IDE不能下载的<b class='flag-5'>Arduino</b> Nano/UNO R<b class='flag-5'>3</b>开发板重新烧录引导程序bootlaoder

    使用CCU4产生3PWM信号,在引脚 P0.8 上看不到任何 PWM 输出,为什么?

    您好,我想使用 CCU4 产生 3 PWM 信号。一切都已配置,引脚 P0.4,P0.6 和 P0.8 用作CCU40.OUT1、 CCU40.OUT0 和CCU40.OUT2,但我在引脚
    发表于 07-14 07:01

    《ESP32S3 Arduino开发指南》第二章 Arduino基础知识

    地进行可开发。3、开放性Arduino硬件原理图、电路图、IDE软件及核心库文件都是开源的,在开源协议范围内可以任意修改原始设计及相应代码。4、社区和第三方支持
    发表于 05-13 09:28

    有源晶振四引脚是如何分布与定义的

    源晶振的引脚朝下,以正视的角度,按照逆时针方向依次为2脚、3脚和4脚。 基于封装外形的引脚识别 : 正方的DIP-8封装 :打点的是1脚,各引脚
    的头像 发表于 04-10 17:20 1224次阅读
    有源晶振四<b class='flag-5'>个</b><b class='flag-5'>引脚</b>是如何分布与定义的

    LPC553x MCU具有硬件I3C外设,“PUR” 上拉电阻控制引脚是否提供100引脚封装?

    LPC553x MCU 具有硬件 I3C 外设。“PUR” 上拉电阻控制引脚是否提供 100 引脚
    发表于 04-07 06:52

    LM3489 具有使能引脚的迟滞 PFET 降压控制器数据手册

    稳定性问题。PFET 架构 还允许低元件数量以及超低压差、100% 占空比运行。 另一优点是在轻负载下高效运行,而不会增加输出纹波。一 专用使能
    的头像 发表于 04-02 10:46 593次阅读
    LM3489 具有使能<b class='flag-5'>引脚</b>的迟滞 PFET 降压<b class='flag-5'>控制</b>器数据手册

    开源项目!基于 RP2040 自制一”空心时钟”

    步进电机及驱动板(约3美元/套)。 – 微控制器:RP2040 开发板,PicoBit、RP2040-Zero 或兼容产品。 – 磁铁:三 8x3mm 钕磁铁。 – 螺丝:2mm 平
    发表于 02-24 10:19

    用于 SPI 绝对编码器的 Arduino 示例代码

    (SPI) 通信来配置和读取 [Same Sky] 的 [AMT22 绝对编码器] 的数据。该教程将提供所需硬件和软件、关键设置要求以及单圈和多圈输出选项的示例代码包和说明。以下是
    的头像 发表于 01-26 21:35 1297次阅读
    用于 SPI 绝对编码器的 <b class='flag-5'>Arduino</b> 示例<b class='flag-5'>代码</b>

    同一74AHC138控制输出8GPIO口是可以同时输出的吗?

    前端DSP没有足够的GPIO口来驱动4IC:TPS7A8300,现在想使用SN74AHC138来使GPIO口由3复用为8 请问,同一
    发表于 01-23 06:41

    AN-951: 使用SigmaDSP内置GPIO引脚进行硬件控制

    电子发烧友网站提供《AN-951: 使用SigmaDSP内置GPIO引脚进行硬件控制.pdf》资料免费下载
    发表于 01-15 15:40 0次下载
    AN-951: 使用SigmaDSP内置GPIO<b class='flag-5'>引脚</b>进行<b class='flag-5'>硬件</b><b class='flag-5'>控制</b>

    LMP90100放大倍数大于等于16后计算的电压不对,是哪里出了问题?

    。?????? 与问题一比修改了是否使用缓冲。 问题3 数据输出速度214.65SPS,放大倍数16,使用缓冲(CH0_CONFIG=0x79) 负输入VIN1,正输入VIN0,
    发表于 01-10 08:24

    蓝桥杯的第一项目,点亮一LED

    第一节IO简介GPIO是通用输入/输出端口的简称,是STM32可控制引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、
    的头像 发表于 01-02 21:02 1070次阅读
    蓝桥杯的第一<b class='flag-5'>个</b>项目,点亮一<b class='flag-5'>个</b>LED

    AFE5803 SPI是如何控制VCAT的,8路VCAT是只能设置同一放大倍数还是可以设置8路不同的放大倍数

    在datasheet中SPI Logic可以控制VCAT,但又没有找到digital VCNTL mode,请问SPI是如何控制VCAT的,8路VCAT是只能设置同一放大
    发表于 12-20 11:27