シフトレジスタ74HC595と8つのLED①チュートリアル通りに動かす

2022/07/04

74HC598 Arduino

t f B! P L

シフトレジスタとArduinoを組み合わせてLED×8個を点滅させます。

 目次:

今回の目的

ELEGOOのチュートリアル「Eight LED with 74HC595」をチュートリアル通りに動かします。

※チュートリアルの文章(PDF日本語版含む)もスケッチもELEGOOのサイトから無料でダウンロードできました。

Download ⇒「Arduino Kits & ~」⇒「UNO R3 Starter Kits」⇒ 「ELEGOO UNO R3 The Most Complete Starter Kit」 からダウンロードリンクに辿り着けます。


シフトレジスタ「74HC595」

74HC595は8ビットのシフトレジスタ(Shift register)です。

ArduinoだけでもLED毎の点灯を制御できますが、多数のLEDに1対1で出力を繋いでいてはArduinoの出力本数が足りなくなってしまいます。

そこでArduinoからはシフトレジスタにLED個数分の点灯・消灯を順繰り(シリアル)に送り、そのシフトレジスタからLEDを同時(パラレル)に点灯させる構成をとります(「シリアル-パラレル変換」)。



図1.SN74HC595N

16ピンのDIPパッケージ。ICの刻印には「SN74HC595N」と型式が表記されております。
ロゴマークは良く見えませんが、チュートリアル付属のデータシートはPhilips社のものでした。




図2.LED

点灯させるLEDは4色(赤、黄、青、緑)の砲弾型LEDです。


器材接続

各LEDのアノード(+)は個別に220Ωの抵抗を介して74HC595の出力Q0~7に接続します。全LEDのカソード(-)は共通GND。

74HC595のDS(serial data input)、SH_CP(shift register clock input)、ST_CP(storage register clock input)それぞれをArduinoのD12、D9、D11に接続。あとはVCC、GNDをまとめてArduinoの5V、GNDに接続します。



図3.機材接続

スケッチ書き込み後は電源さえ供給できれば良いので、ArduinoのUSBケーブルはモバイルバッテリーに挿し替えても可です。

余談ですが、ブレッドボードの穴にLEDのリードがなかなか挿さらず、高確率でLEDのリードが折れ曲がりました。曲がったリードが他所に触れて短絡しないよう、要注意です。


スケッチ

オリジナルのものを少し変えました。

ライブラリのインクルードも無く、スケッチ本文でLED点灯制御を完結しております。


byte leds = 0;    // 1バイト(8ビット)変数「leds」に「00000000」代入

void updateSR() {

  digitalWrite(11,LOW);    // ST_CPにLOWを入力

  shiftOut(12,9,LSBFIRST,leds);    // DS,SH_CP指定。LSB側から変数「leds」をシフトアウト

  delay(100);    // 0.1秒間待つ

}

void setup() {

  pinMode(11,OUTPUT);    // D11(ST_CPに接続)を出力設定

  pinMode(12,OUTPUT);    // D12(DSに接続)を出力設定

  pinMode(9,OUTPUT);    // D9(SH_CPに接続)を出力設定

}

void loop() {

  leds = 0;    // 変数「leds」に「00000000」代入

  updateSR();    // 変数「leds」(=「00000000」)をシフトアウト

  delay(100);    // 0.1秒間待つ

  for(int i = 0;9 < 8;i++) {    // 変数「i」を0~7まで1ずつ増加させつつ以下ループ

    bitSet(leds,i);    // 変数「leds」の「i」番目のビットを「1」にする 

    updateSR();    // 変数「leds」をシフトアウト

    delay(100);    // 0.1秒間待つ

  }

}


以下、関数の補足です。

shiftOut(dataPin, clockPin, bitOrder, value)

1バイトのデータを1ビットずつdataPinにシフトアウトし、そのあとclockPinが反転します。

  dataPin:ビット出力ピン

  clockPin:クロック出力ピン

  bitOrder:「MSBFIRST」(Most Significant Bit First)で最上位ビットから送信。または「LSBFIRST」(Least Significant Bit First)で最下位ビットから送信

  value:送信したいバイトデータ

bitSet(x, n)

ある数の指定ビットを"1"にする

  x:対象の数

  n:指定ビット(LSBから数えてn番目)


動作

動作しました。

(1)2個点灯

(2)4個点灯

(3)5個点灯

(4)8個点灯

図4.LED点灯動作

言葉で説明すると、写真右側から順にLEDが1個ずつ点灯していき、全8個点灯後に全8個消灯、そしてまた右側から1個ずつ点灯していく流れが繰り返されます。


所感

今回の肝はArduinoの出力ピン数をシフトレジスタで節約したところにあるのでしょうが、点滅するLEDがきらびやかです。

実用に結びつけずにチュートリアルを進めていることについて「それが何になる?」という思いが心の片隅にあるのですが、こうして視覚に訴えかけてくれるものは割と理屈抜きで感動を与えてくれるのがありがたいです。

このブログを検索

ブログ アーカイブ

自己紹介

にほんブログ村

QooQ