先前介紹過 74HC595 這個 IC 的基本操作方式(這篇),還有各個接腳功能後(這篇)。接著繼續說怎麼利用 Arduino 去操作這顆 IC,怎麼實現我們一開始說到的好處:用 3 個 Arduino 的 Pin 控制 8 個輸出。
這篇會講到三大區塊:讓 595 啟動的接線方式、Arduino 關於 595N 的 IDE 指令、使用 Arduino 及 595 控制 8 顆 LED 燈。
一、使用 Arduino 啟動 595N,只要使用 5V 及 GND 兩個 pin,接法如下:
- 將 595 的 Vcc (Pin 16) 接上 Arduino 的 5V
- 將 595 的 GND (pin 8) 接上 Arduino 的 GND
- 將 OE 啟動 (打開窗子),datasheet 上面有寫到 Active Low,所以要啟動就將 OE (Pin 13) 接地
- 將 MR master clear 功能關閉,不然這個功能會一直清除輸入的訊號,一樣是 Active Low,所以將 MR (Pin 10) 接正極
- 基本上接上上面這幾條線 595 就算是啟動了,接著接上訊號線,將 DS (pin 14)接到 Arduino Digital pin 上,作為訊號源
- 將 STcp (Pin 12) 及 SHcp (Pin 11) 分別接上 Arduino 的 Digital pin 上
二、Arduino 關於 595 的 IDE 指令
介紹 Arduino IDE 關於 595 的主要指令:shiftOut(),shiftOut() 這個指令是個幫我們將訊號依序輸入 595 上的指令。
格式與說明如下:詳細可參考這篇
shiftOut(dataPin, clockPin, bitOrder, value)
參數:
- dataPin:Arduino 上輸出訊號的 Pin,上面的接線為 Pin 4 (int)
- clockPin:連接 595 SHcp 的 Pin,也就是 Arduino 上的 Pin 2 (int)
- bitOrder:訊號輸入的順序;MSBFIRST or LSBFIRST
(Most Significant Bit First, or, Least Significant Bit First) - value:訊號輸入的值,Arduino 上不接受 value 為二進位,僅接受為十進位或十六進位的數字 (byte)
這邊說明一下 bitOrder MSBFIRST 以及 LSBFIRST 的差別,如果有一組訊號要輸入 11110101,這兩個順序翻譯成中文其實很簡單:
MSBFIRST:由左至右輸入 595 chip
LSBFIRST:由右至左輸入 595 chip
些放在 595 的 Q0~Q7 Out put 時會有不同效果:
三、使用 Arduino 及 595 控制 8 顆 LED 燈
Step 1 準備材料:
Shift Register 74HC595 x1
220 Ohm 電阻 x8
LED x8
Step 2 接線圖:
這裡的圖,是除了上述的基本啟動 595 cip 接線外,另外在 Q0~Q7 接上 8 個 LED。
Step 3 原理與解說:
因為 595 最多放 8 個數字 (8-bit),二進位的 11111111,就是十進位的 255,下列我們會依序輸入 0~255 的數字,8 個 LED 會二進位的表示亮燈。
bitOrder 為 MSBFIRST,輸入的 value 分別的亮起的燈會如下表範例。
Sketch:
//設定 Arduino pin 4 為 DS 輸入 pin,STcp = Arduino pin 3,SHcp = Arduino pin 2
int data = 4;
int clock = 2;
int latch = 3;
//Setup Arduino 3 個 pin 都為 output mode
void setup()
{
pinMode(data, OUTPUT);
pinMode(clock, OUTPUT);
pinMode(latch, OUTPUT);
}
void loop()
{
//每次 led 狀態更新的中間的間隔時間,100 ms
int delayTime = 300;
//輸入的 DS 訊號由 0 加到 255
for(int i = 0; i < 256; i++){
// 呼叫 updateLED() 這個 function,DS 輸入的訊號由 0 增加到255
updateLED(i);
delay(delayTime);
}
}
// updateLEDs 這個 function 主要的功能為輸入 ( ) 內的 value 進 595 chip
// 並把對應的二進位 LED 燈亮請來
void updateLED(int value){
//把 595N 的 STcp 關閉,暫時不輸出訊號
digitalWrite(latch, LOW);
//把 8 bit 訊號由 MSBFIRST 的順序,輸出給 595 chip
shiftOut(data, clock, MSBFIRST, value);
//打開 STcp,把剛輸入的 8 bit 訊號由 Q0~Q7 輸出讓 LED 亮起來
digitalWrite(latch, HIGH);
}
Upload 到 Arduino 上就完成拉!
參考文章:
沒有留言:
張貼留言
Anything That's Worth Chatting