2014年4月19日 星期六

[Arduino] 74HC595N Shift Register 介紹 – Arduino 的操作



先前介紹過 74HC595 這個 IC 的基本操作方式(這篇),還有各個接腳功能後(這篇)。接著繼續說怎麼利用 Arduino 去操作這顆 IC,怎麼實現我們一開始說到的好處:用 3 個 Arduino 的 Pin 控制 8 個輸出。

這篇會講到三大區塊:讓 595 啟動的接線方式、Arduino 關於 595N 的 IDE 指令、使用 Arduino 及 595 控制 8 顆 LED 燈

一、使用 Arduino 啟動 595N,只要使用 5V 及 GND 兩個 pin,接法如下:
image
  • 將 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 上
如此一來,595 就準備好操作的前置作業了!


二、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 時會有不同效果:
image



三、使用 Arduino 及 595 控制 8 顆 LED 燈

Step 1 準備材料:

Shift Register 74HC595 x1
220 Ohm  電阻 x8
LED x8
 
Step 2 接線圖:

這裡的圖,是除了上述的基本啟動 595 cip 接線外,另外在 Q0~Q7 接上 8 個 LED。
image


Step 3 原理與解說:

因為 595 最多放 8 個數字 (8-bit),二進位的 11111111,就是十進位的 255,下列我們會依序輸入 0~255 的數字,8 個 LED 會二進位的表示亮燈。

bitOrder 為 MSBFIRST,輸入的 value 分別的亮起的燈會如下表範例。
image

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

Related Posts Plugin for WordPress, Blogger...