1. シフトレジスタの利用
今回はArduinoを用いたシフトレジスタの利用方法について紹介したい。シフトレジスタはシリアル/パラレル入力をシリアル/パラレル出力へ変換する素子で、入力/出力の組み合わせとしては4種類あるが、ここではシリアル入力/パラレル出力(SIPO:Serial In Parallel Out)のシフトレジスタを取り扱う。用途としては少ないピン数を用いて多出力ピン制御が可能で、今回は8ビットシフトレジスタとArduinoを組み合わせて8つのLEDの点灯制御を行う。
2. シフトレジスタのピン・接続
Tinkercad上はコンポーネント-すべてから8ビットシフトレジスタ74HC595を選択する。各ピンの割り当ては下図の様になっている。
ピン番号、機能を下表にまとめた。
ピン番号 | 名前 | 機能 |
---|---|---|
1-7 | Q1-Q7 | パラレル出力1-7 |
8 | GND | グラウンド |
9 | QH' | シフトレジスタの最上位ビット出力 |
10 | SRCLR | LOWでクリア (通常HIGHにする) |
11 | SRCLK | シフトレジスタクロック、LOW→HIGHで更新 |
12 | RCLK | ストレージレジスクロック、LOW→HIGHで更新 |
13 | OE | 出力イネーブル、LOWで出力有効 |
14 | SER | シリアルデータ入力 |
15 | Q0 | パラレル出力 |
16 | VCC | 電源 |
パラレル出力(0-8)は抵抗(220Ω)を介してLEDに接続する。VCCはArduinoから供給するものとして5Vに接続する。OEは常に有効にするためGNDに、SRCLRはクリアしないのでHIGHにするためVCCに接続する。QH'は今回使用しないので接続しない。SER, SRCLK, RCLKはArduinoの11,12,8ピンと接続する。全体の回路図は以下のようになる。
3. シフトレジスタを制御するスケッチ
スケッチはArduino 日本語リファレンスとほぼ同じだが、若干修正している。シリアル入力する8ビットバイナリデータ:1=00000001
を用い、1がHIGH、0がLOWをあらわす。仕組みとしてはバイナリデータ1を順次ビットシフト、つまり00000001→00000010→00000100→···として、シフトレジスタでシリアル入力からパラレル出力とすることで点灯するLEDを切り替えていく。左方向にビットシフトするには1<<n:
とすると左にnビットシフトする。順次シフトさせるにはfor文内で1<<j
とすればループごとに順次ビットが左にシフトしていく。
int latchPin = 8; // RCLKへ接続 int clockPin = 12; // SRCLKへ接続 int dataPin = 11; // SERへ接続 void setup() { pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { // LED1からLED8までを順に点灯 for (int j = 0; j < 8; j++) { // 送信中のlatchPinはLOW)レベル digitalWrite(latchPin, LOW); // シフト演算を使って点灯するLEDを選択 byte t=1<<j; shiftOut(dataPin, clockPin, LSBFIRST, t); //シフトレジスタにデータ書き込み // 送信終了後latchPinをHIGHにする digitalWrite(latchPin, HIGH); delay(125); } }
シフトレジスタを利用するために関数shiftOut(dataPin, clockPin, bitOrder, value);
を用いる。dataPin
はシフトレジスタSERに接続するArduinoのピン番号:11, clockPinはSRCLKの接続するピン番号:12を指定する。bitOrderは最上位ビットから送るかMSBFIRST
、最下位ビットから送るかLSBFIRST
を指定するが今回は下位から送るのでLSBFIRST
とした。value
は入力するバイナリデータでt=1<<j
を用いている。RCLKに関してはlatchPin
として8ピンに接続して、処理の最初でdigitalWrite(latchPin, LOW);
としてshiftOut
実行後にdigitalWrite(latchPin, HIGH);
とすることで更新される。
4. Tinkercad上での実行結果
上記の回路図をTinkercad上で構築して、スケッチを実行している様子を下に示す。LEDの点灯は下から上(Q7-Q0)に向かって1つづつ点灯して、残りは消灯している。今回はLEDを1つづつ点灯しているが、バイナリデータとして3(=00000011)などを用いれば複数のLEDを同時点灯させて切り替えていくこともTinkercadのシミュレーション上は可能なのでいろいろ試してみても面白い。ただし、実物で試す場合はArduinoから供給する電流量やシフトレジスタに流してよい電流量を考慮して、より高い抵抗(場合によってはLEDが暗くなる)を設ける必要がでてくる。→ Arduinoでシフトレジスタ(SN74HC595)を使用して8個のLEDをチカチカさせる – StupidDog's blog