0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

怎樣僅使用3個Arduino引腳控制8個輸出數(shù)量的倍數(shù)所需的硬件和代碼

454398 ? 來源:網(wǎng)絡(luò)整理 ? 作者:網(wǎng)絡(luò)整理 ? 2019-11-20 11:09 ? 次閱讀

步驟1:移位寄存器簡介

怎樣僅使用3個Arduino引腳控制8個輸出數(shù)量的倍數(shù)所需的硬件和代碼

什么是移位寄存器:

移位寄存器的基本目的是增加微控制器的輸入/輸出引腳數(shù)。所使用的移位寄存器可以是用于增加輸出引腳的74HC595,而74HC164是用于增加輸入引腳的移位寄存器。需要注意的最重要一點是,可以將多個移位寄存器級聯(lián)。因此,微控制器僅使用3個引腳就可以將8個電源控制到n個輸出/輸入的電源。這種級聯(lián)也可以稱為移位寄存器的菊花鏈。

移位寄存器的引腳:

移位寄存器最重要的引腳如下:

串行輸入(PIN 14):

用于移位移位寄存器下一個輸入的引腳。

RCK(引腳12):

此引腳被拉高時,將移位寄存器。

串行時鐘(PIN11):

需要拉高以將輸出設(shè)置為新的移位寄存器值,必須在SRCLK之后立即將其拉高。

QH‘(引腳9):

該引腳的意義在于可以連接到下一個移位寄存器的串行輸入(PIN14),并且菊花鏈可以增加。

移位寄存器的工作原理

可以將移位寄存器與數(shù)據(jù)游戲進(jìn)行比較沿路口移動。當(dāng)移位寄存器的RCK引腳變?yōu)镠IGH時,它們將移至另一個結(jié)點,因此可以使用以下原理將數(shù)據(jù)傳輸?shù)饺我鈹?shù)量的移位寄存器。移位寄存器可以使用串行時鐘(PIN 11)保持這些值。每當(dāng)串行時鐘引腳變高時,RCK引腳就會變低,依此類推,直到傳輸所需的數(shù)據(jù)為止。

我提供了一個123D電路圖,描述了移位寄存器與Arduino的連接。以及移位寄存器工作所需的基本連接。提供的第二個123d電路圖顯示了第二個移位寄存器的連接,依此類推。

菊花鏈移位寄存器:

可以增加移位寄存器通過將QH’引腳與第二個串行輸入的移位寄存器(PIN 14)連接。因此,輸出的數(shù)量僅限于可以連接的移位寄存器的數(shù)量。選件隨附的代碼可連接多達(dá)40個以上的寄存器。我還提供了模塊的實時圖以及使用這些模塊與arduino的連接。

步驟2:模塊的組裝和焊接-1

正如我前面提到的,此Instructable具有不同的方法組裝,我使用分步焊接教程。我希望它的作用與僅提供電路并自行完成一樣有用。將來,我將嘗試使其成為蝕刻過的PCB,以便使焊接變得更加容易。第一張圖片顯示了完成的模塊。

無論如何,所生產(chǎn)的模塊將是4 x 3 cm的正方形,并且可以通過菊花鏈方式鏈接更多的模塊,并且可以根據(jù)需要增加輸入量。因此,讓我們開始組裝吧?。。?!

步驟1:

第一步是插入LED

注1:

請注意,應(yīng)通過電源檢查led條形圖的位置,以便正確插入。來自arduino的5V電壓就足夠了,但請不要長時間連接,否則LED會短路。名為 Note1 的圖顯示了我檢查模塊的方法。請忽略圖中的電阻,直接將其連接。

第2步:

檢查后,如圖所示插入1k電阻。需要這個電阻是因為它為最終的LED提供了電阻。其次是接地的4k7電阻矩陣。有關(guān)電阻的位置,請參見該圖。我在圖中顯示了10k,但請忽略它。

注2:

該注意事項非常重要,因為只有在LED亮起時,電阻矩陣接地引腳(?)才應(yīng)正確連接到接地軌。這很關(guān)鍵,因為如果矩陣反轉(zhuǎn),LED將會變暗。

第3步:

因此,如圖所示,將電阻矩陣的菱形端(?)插入接地端。然后焊接矩陣的引腳。您也可以通過連接電源來仔細(xì)檢查LED。

步驟3:模塊的組裝和焊接-2

注3:

在插入主IC之前,只需使用指南針或刀片進(jìn)行切割即可。可以使用萬用表中的連續(xù)性測試儀檢查切口。

第4步:

IC如圖所示并且使用DIP插座,以便在發(fā)生任何故障時可以更換IC。最后焊接接頭。

步驟5:

移位寄存器可以控制8個LED,但是模塊有10個LED因此,額外的兩個是由兩個公頭控制的,它們可以由Arduino控制。焊接接頭。

第6步:

需要按圖所示連接跳線。連接器的一端連接到LED條形圖,另一個連接到74HC595的第15引腳。

第7步:

接下來是電源供應(yīng)您需要如圖所示連接兩個接頭并焊接接頭。

第8步:

現(xiàn)在插入兩個如圖所示,以下引腳上的公頭連接器。然后焊接接頭。它們可以連接到Arduino或下一個模塊。

注意4:

將圖中所示的銷釘焊接到接地導(dǎo)軌上。這比連接跳線要容易。

步驟4:模塊的組裝和焊接-3

第9步:

將面包板電線作為跨接線連接起來,如圖所示并將它們焊接在底部。跳線用于將Vcc發(fā)送到IC電源引腳。

步驟10:

焊接1uF電容器如圖所示,使負(fù)極側(cè)焊接到電路板的接地軌,正極軌到達(dá)引腳。只需參考先前步驟中的電路圖即可。

第11步:

使用剪刀剪切模塊并進(jìn)行剪切盡可能緊湊。然后您就完成了您的第一個模塊的準(zhǔn)備工作。

只需重復(fù)這些步驟即可創(chuàng)建所需的任意數(shù)量的模塊,并以菊花鏈的方式增加它們的輸入量。 LED的輸出可以發(fā)送到繼電器板上,并且僅使用Arduino的三個引腳就可以驅(qū)動任意數(shù)量的繼電器。最后一張圖顯示了完成的模塊,到目前為止,我已經(jīng)制作了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追逐器,您只需要根據(jù)應(yīng)用程序更改代碼即可。

首先,我將解釋根據(jù)移位寄存器的數(shù)量需要更改的基本行。顧名思義,具有

//How many of the shift registers - change this

#define number_of_74hc595s 1

的代碼行應(yīng)提供您正在使用的移位寄存器模塊的數(shù)量。該程序最多只能有40個以上的移位寄存器。

setRegisterPin(2, HIGH);

setRegisterPin(3, HIGH);

setRegisterPin(4, LOW);

setRegisterPin(5, HIGH);

setRegisterPin(7, HIGH);

writeRegisters();

這行代碼是u可以用來控制移位寄存器引腳的主要功能。 “ writeRegisters()”行是為了將數(shù)據(jù)發(fā)送到移位寄存器而需要調(diào)用的函數(shù)。假設(shè)您需要控制第三個移位寄存器模塊的第24引腳,則代碼為

setRegisterPin(24, HIGH);

假設(shè)您需要重置引腳,以使所有引腳均變低,然后功能將變?yōu)?/p>

clearRegisters();

最后,下面給出了控制引腳的總體代碼,我還附帶了該程序的代碼。因此,在此代碼中,以下引腳設(shè)置為高電平,并且可以使用清除寄存器功能將其復(fù)位。我使用3個移位寄存器模塊,因此如果使用2個移位寄存器,則必須更改代碼。如果一切順利,輸出將如上面的視頻所示。使用此基本思想,您可以設(shè)計出色的微控制器項目。

代碼:

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追逐者很有趣!

如果您已達(dá)到此測試,則說明您已成功完成模塊。因此,讓我們做一個LED追逐器不僅是為了娛樂,而且是為了進(jìn)一步理解代碼。下面給出了代碼以嘗試使用新模塊。我上傳了我的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();

}

責(zé)任編輯:wv

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 移位寄存器
    +關(guān)注

    關(guān)注

    3

    文章

    259

    瀏覽量

    22307
  • Arduino
    +關(guān)注

    關(guān)注

    188

    文章

    6475

    瀏覽量

    187444
收藏 人收藏

    評論

    相關(guān)推薦

    藍(lán)橋杯的第一項目,點亮一LED

    第一節(jié)IO簡介GPIO是通用輸入/輸出端口的簡稱,是STM32可控制引腳。GPIO的引腳與外部硬件設(shè)備連接,可實現(xiàn)與外部通訊、
    的頭像 發(fā)表于 01-02 21:02 ?123次閱讀
    藍(lán)橋杯的第一<b class='flag-5'>個</b>項目,點亮一<b class='flag-5'>個</b>LED

    AFE5803 SPI是如何控制VCAT的,8路VCAT是只能設(shè)置同一放大倍數(shù)還是可以設(shè)置8路不同的放大倍數(shù)?

    在datasheet中SPI Logic可以控制VCAT,但又沒有找到digital VCNTL mode,請問SPI是如何控制VCAT的,8路VCAT是只能設(shè)置同一放大
    發(fā)表于 12-20 11:27

    HAL庫在Arduino平臺上的使用

    HAL庫在Arduino平臺上的使用 Arduino平臺是一開源的電子原型平臺,它包括硬件(基于微控制器的電路板)和軟件(
    的頭像 發(fā)表于 12-02 14:04 ?381次閱讀

    stm32與Arduino的比較

    在微控制器的世界里,STM32和Arduino是兩經(jīng)常被提及的名字。STM32是一系列由STMicroelectronics生產(chǎn)的高性能微控制器,而
    的頭像 發(fā)表于 11-19 15:45 ?1326次閱讀

    怎么判斷電壓放大倍數(shù)的正負(fù)極

    電壓放大倍數(shù)是衡量一放大器性能的重要參數(shù)之一,它表示輸入電壓與輸出電壓之間的比例關(guān)系。在電子電路中,電壓放大倍數(shù)的正負(fù)極對于電路的設(shè)計和應(yīng)用具有重要意義。 一、電壓放大
    的頭像 發(fā)表于 08-07 14:13 ?2576次閱讀

    放大倍數(shù)指的是物體的什么的放大倍數(shù)

    放大倍數(shù)是一物理學(xué)和光學(xué)領(lǐng)域中常見的概念,它描述了通過顯微鏡、望遠(yuǎn)鏡或其他放大設(shè)備觀察物體時,物體的尺寸相對于其原始尺寸的放大程度。 一、放大倍數(shù)的定義 放大倍數(shù)(Magnifica
    的頭像 發(fā)表于 07-30 14:15 ?2284次閱讀

    示波器衰減倍數(shù)與探頭衰減倍數(shù)之間的關(guān)系

    示波器衰減倍數(shù)與探頭衰減倍數(shù)之間是電子測量中一重要而又容易混淆的概念。在本文中,我們將探討示波器衰減倍數(shù)與探頭衰減倍數(shù)之間的關(guān)系,以及它們
    的頭像 發(fā)表于 07-29 11:40 ?1303次閱讀
    示波器衰減<b class='flag-5'>倍數(shù)</b>與探頭衰減<b class='flag-5'>倍數(shù)</b>之間的關(guān)系

    為什么可以將一GPIO引腳同時配置為輸入輸出模式呢?

    的一系列高低電平。 那么對于GPIO6而言,在發(fā)送起始信號的時候,是輸出模式,接收信號的時候是輸入模式,也就是說需要將一引腳同時配置為輸入輸出模式。 我注意到,在gpio_mod
    發(fā)表于 06-05 07:37

    ESP32C3使用GPIO2,8,9任意一引腳輸出低電平時功耗會增加,怎么解決?

    如題,這三引腳當(dāng)我使用其中任意一輸出低電平時功耗會增加,大概幾百ua左右。輸出高電平則一切正常,未見功耗增加。其他
    發(fā)表于 06-05 06:36

    STM8S003F3上電后怎么默認(rèn)I/O引腳輸出低電平?

    MCU型號:STM8S003F3。 問題描述:一空程序的MCU上電后輸出高電平,通過程序配置I/O引腳輸出低電平,但這樣的話會有一
    發(fā)表于 05-10 08:23

    如何用Arduino制作一簡易自動喂魚器

    制作硬件電路了。 第2步:電路圖和程序 我們可以將電路分為兩部分,第一部分是步進(jìn)電機(jī),另一部分是超聲波傳感器。 將步進(jìn)電機(jī)連接到驅(qū)動器,然后根據(jù)下面的說明將驅(qū)動器引腳連接到Arduino: In1
    發(fā)表于 03-28 11:25

    用STM32F407控制器遙控控制3直流電機(jī),PWM引腳輸出電壓達(dá)不到驅(qū)動器的控制電壓為什么?

    請教各位大拿,我用STM32F407控制器遙控控制3直流電機(jī),分別模擬汽車的轉(zhuǎn)向電機(jī)、制動電機(jī)、油門電機(jī),程序沒有問題,原車上都調(diào)試過了,采用4
    發(fā)表于 03-20 08:07

    arduino控制步進(jìn)電機(jī)代碼

    中,我們將詳細(xì)介紹如何使用Arduino控制步進(jìn)電機(jī)的代碼。 步進(jìn)電機(jī)通常用于需要精確控制角度和位置的應(yīng)用中,例如3D打印機(jī)、數(shù)控銑床和機(jī)
    的頭像 發(fā)表于 02-14 16:29 ?2108次閱讀

    arduino中while循環(huán)怎么跳出

    執(zhí)行某段代碼的情況。然而,如何在合適的時機(jī)跳出 while 循環(huán)是一需要注意的問題。本文將詳細(xì)介紹 Arduino 中 while 循環(huán)的基本概念,以及如何使用不同的技巧跳出該循環(huán)來實現(xiàn)代碼
    的頭像 發(fā)表于 02-14 16:22 ?2666次閱讀

    ESP32與Arduino板之間的區(qū)別差異

    Arduino板包括一ATmega328P8位微控制器,具有0至13數(shù)字引腳。這些
    的頭像 發(fā)表于 02-02 14:36 ?7784次閱讀
    ESP32與<b class='flag-5'>Arduino</b>板之間的區(qū)別差異