つれづれなる備忘録

日々の発見をあるがままに綴る

TinkercadによるArduinoシミュレーション29 ~ シフトレジスタ

1. シフトレジスタの利用

 今回はArduinoを用いたシフトレジスタの利用方法について紹介したい。シフトレジスタはシリアル/パラレル入力をシリアル/パラレル出力へ変換する素子で、入力/出力の組み合わせとしては4種類あるが、ここではシリアル入力/パラレル出力(SIPO:Serial In Parallel Out)のシフトレジスタを取り扱う。用途としては少ないピン数を用いて多出力ピン制御が可能で、今回は8ビットシフトレジスタArduinoを組み合わせて8つのLEDの点灯制御を行う。

2. シフトレジスタのピン・接続

 Tinkercad上はコンポーネント-すべてから8ビットシフトレジスタ74HC595を選択する。各ピンの割り当ては下図の様になっている。

74HC595のピン割り当て
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ピンと接続する。全体の回路図は以下のようになる。

シフトレジスタを用いたLED制御
シフトレジスタを用いたLED制御

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

シフトレジスタによるLED制御
シフトレジスタによるLED制御

5. まとめ

 今回はArduinoを用いたシフトレジスタの使い方と、応用としてLEDの順次点灯を紹介した。