シフトレジスタ(74HC595)で複数LEDを一括制御【Arduino:Lesson7.5】
![](https://cediablog.com/wp-content/uploads/lesson7-5eye.png)
今回は前回のArduino(アルドゥイーノ)プログラミングLESSON7「シフトレジスタを使った点灯LEDシフト制御」の応用編としてArduino(アルドゥイーノ)プログラミングLESSON7.5「shiftOut関数を使った複数LEDの一括点灯制御」を紹介します。
今回もLESSON7と同様に、シフトレジスタ(74HC595)を使って学習をすすめます。
本LESSON記事は、プログラミングの学習とシフトレジスタの機能知識を習得するプログラムになっています。
今回取り扱うシフトレジスタのパラレル出力一括制御「shiftOut関数制御」は、スクラッチプログラミング非対応となります。
ArduinoIDEによる文字列プログラミングのみ対応となりますので、ご注意ください。
![](https://cediablog.com/wp-content/uploads/nomal-clr-150x150.png)
文字列プログラミングにもチャレンジしてみよう!
LESSON7の内容については、こちらの記事を参照してください。
↓↓
- シフトレジスタの機能
- シフトレジスタを用いたLED一括点灯制御プログラムの作り方
- Arduino IDEによる使ったプログラミング方法
![](https://cediablog.com/wp-content/uploads/happy500-1.png)
![](https://cediablog.com/wp-content/uploads/happy500-1.png)
せでぃあ
せでぃあはこんな人物です
✅プライム企業に勤める電気・機械設計エンジニア
✅親子の絆を深めるため、夏休みに子供と一緒に電子工作を製作
✅Arduinoプログラミングを用いて作ったプログラミング電子工作「信GO機」が市の発明くふう展で「優秀賞」を受賞
✅本ブログにてArduinoスクラッチプログラミングLESSON記事投稿中
✅YouTubeチャンネル「せでぃあブログちゃんねる」運営中
シフトレジスタ(74HC595)とは
概要説明
![シフトレジスタ(74HC595)](https://cediablog.com/wp-content/uploads/lesson7j.webp)
![シフトレジスタ(74HC595)](https://cediablog.com/wp-content/uploads/lesson7j.webp)
シフトレジスタとは、ざっくりいうと「記憶されたビットデータが隣のビットにシフトする電子機器」です。
シフトレジスタを使うことでどんなメリットがあるかというと、Arduinoのデジタル出力ソケットを3つ使用するだけで8つの出力を制御することができます。
シフトレジスタは入出力ソケット不足の解消に役立ちます。
各ピンの機能説明
![シフトレジスタ(74HC595)のピン機能説明](https://cediablog.com/wp-content/uploads/lesson7c.webp)
![シフトレジスタ(74HC595)のピン機能説明](https://cediablog.com/wp-content/uploads/lesson7c.webp)
シフトレジスタには16ものピンがついており、ブレッドボードに差し込んで使用します。
各ピンに対する、役割を上記説明図に記入しています。
各ピンの役割はこちらの記事にて詳しく説明しています。
↓↓
シフトレジスタを使った点灯LEDシフト動作の説明
シフトレジスタのデジタル出力とLEDの接続が以下になっていることを踏まえて、動作の説明をします。
![シフトレジスタデジタル出力とLED接続組み合わせ](https://cediablog.com/wp-content/uploads/lesson7k.webp)
![シフトレジスタデジタル出力とLED接続組み合わせ](https://cediablog.com/wp-content/uploads/lesson7k.webp)
- 外側から中央側に向かって点灯LEDが集まってくる
- 中央から外側に向かって点灯LEDが積み重なっていく
- 奇数・偶数デジタル出力LEDが交互に点灯する
動画を見て、一括LED点灯制御動作を確認してください。
シフトレジスタを使った点灯LEDシフト制御回路の作り方
プログラミングするために、パソコンが必要です。
電子部品等の必要な機器については、このあと説明します。
パソコンに統合開発ソフトウェア「ArduinoIDE」のインストールを行います。
Arduinoのセットアップ方法については、以下の記事にて詳しく説明しています。
Arduino IDEでの言語プログラミングも勉強したい方は、プログラミングの流れを理解しておいてください。
以下の記事にて、プログラミングから動作確認までの流れを詳しく説明しています。
電子部品とジャンパーワイヤの差し込みだけで配線が可能です。
専用開発ソフトウェア「Arduino IDE」を使います。
私が作成したプログラムを後述しますので、必要に応じてコピペして使ってください。
プログラムが完成したら動作確認を行います。
- LEDの点灯動作が①⇒②⇒③の順に動作するか?
- 動作が繰り返されるか?
- 外側から中央側に向かって点灯LEDが集まってくる
- 中央から外側に向かって点灯LEDが積み重なっていく
- 奇数・偶数デジタル出力LEDが交互に点灯する
記載のプログラムは動作確認済です。
動作確認方法については、以下の記事にて詳しく説明しています。
今回の動作はスクッラッチプログラミング非対応となります
シフトレジスタによる点灯LEDシフト動作回路で使うもの
![シフトレジスタによる点灯LEDシフト動作回路で使うもの](https://cediablog.com/wp-content/uploads/lesson7d.webp)
![シフトレジスタによる点灯LEDシフト動作回路で使うもの](https://cediablog.com/wp-content/uploads/lesson7d.webp)
- パソコン
- Arduino本体
- USBケーブル
- ブレッドボード
- LED(青・緑・黄・赤)×各2本
- 抵抗(220Ω)×8本
- シフトレジスタ(74HC595)
- ジャンパー線(オスーオス)×18本
今回はELEGOO社のスターターキットに入っている部品のみで作ることができますが、Arduino裏面のショート対策としてクリアケースも併せて準備することをおすすめします。
本ブログLESSON9以降にも対応した、おすすめキットについて紹介しています。
パソコン
プログラムを作成するために必要です。
プログラム制御の演算はArduino側で行うため、パソコンのSPECは一般的なモデルで十分対応可能です。
パソコンのOSはWindows、Macどちらでも対応可能です。
Arduino本体【キット】
![Arduino本体](https://cediablog.com/wp-content/uploads/lesson16.webp)
![Arduino本体](https://cediablog.com/wp-content/uploads/lesson16.webp)
基本的なエディション「Arduino Uno」の互換機である、ELEGOO社のUNO R3を使用しています。
Arduino本体裏面のショート対策に、別売りのクリアケースの購入をおすすめしています。
各ソケットの役割など、Arduino本体の機能について以下の記事にて詳しく説明しています。
USBケーブル【キット】
![必要なUSBケーブルの説明写真](https://cediablog.com/wp-content/uploads/USB-1024x768.webp)
![必要なUSBケーブルの説明写真](https://cediablog.com/wp-content/uploads/USB-1024x768.webp)
パソコンとArduinoを接続してプログラムデータのやり取りをするために必要です。
ブレッドボード【キット】
![ブレッドボードの機能説明図](https://cediablog.com/wp-content/uploads/basickitg-1024x506.webp)
![ブレッドボードの機能説明図](https://cediablog.com/wp-content/uploads/basickitg-1024x506.webp)
たくさんの穴が開いていて、部品の端子を穴に差し込むだけで電気的に接続が可能な板です。
LED(青・緑・黄・赤)【キット】
![今回使用するLEDと極性の見分け方説明](https://cediablog.com/wp-content/uploads/lesson2l-1024x586.webp)
![今回使用するLEDと極性の見分け方説明](https://cediablog.com/wp-content/uploads/lesson2l-1024x586.webp)
4色のLED(発行ダイオード)を各1本使用します。
LED素子にはプラスマイナスの極性があるため配線時には注意が必要です。
極性を間違えて配線すると、LEDは点灯しません
抵抗(220Ω)【キット】
![220Ω抵抗とカラーコードによる見分け方](https://cediablog.com/wp-content/uploads/220resistance-1024x559.webp)
![220Ω抵抗とカラーコードによる見分け方](https://cediablog.com/wp-content/uploads/220resistance-1024x559.webp)
220Ωの抵抗を8本使用し、各LEDに対して1本ずつ接続します。
LEDは流せる電流値に制約があるため、抵抗を直列つなぎすることでLEDに流れる電流を調節します。
抵抗は極性がないので、配線時に方向を気にする必要はありません。
LEDを点灯させるために接続する抵抗の選び方については、こちらの記事で詳しく説明しています。
シフトレジスタ(74HC595)【キット】
![シフトレジスタ(74HC595)](https://cediablog.com/wp-content/uploads/lesson7j.webp)
![シフトレジスタ(74HC595)](https://cediablog.com/wp-content/uploads/lesson7j.webp)
シフトレジスタ(74HC595)を使用します。
機器配置場所については後述しますが、ブレッドボードの中央溝をまたいで差し込んで使います。
ジャンパー線(オスーオス)【キット】
![キットに同梱されているジャンパー線(オスーオス)の説明](https://cediablog.com/wp-content/uploads/basickita.webp)
![キットに同梱されているジャンパー線(オスーオス)の説明](https://cediablog.com/wp-content/uploads/basickita.webp)
ジャンパー線を18本使用します。
今回のLESSONでは、Arduino本体とブレッドボードの接続またはブレッド内での配線に使います。
![](https://cediablog.com/wp-content/uploads/wink-150x150.png)
![](https://cediablog.com/wp-content/uploads/wink-150x150.png)
![](https://cediablog.com/wp-content/uploads/wink-150x150.png)
今回は配線本数が多いので、落ち着いて配線しよう
今回のLESSONで使用可能な、スターターキットです。
(おすすめ!)モーターやLEDディスプレイ等の機器を備えたコスパの高いキットです。
![](https://cediablog.com/wp-content/plugins/pochipp/assets/img/pochipp-logo-t1.png)
![](https://cediablog.com/wp-content/plugins/pochipp/assets/img/pochipp-logo-t1.png)
【おすすめ!】Arduino本体裏面のショート対策におすすめです。
初心者キットに含まれる機器に関しては、以下の記事にて詳しく紹介しています。
配線のやり方
![Arduinoとの配線完了時の状態写真](https://cediablog.com/wp-content/uploads/lesson7e-1024x671.webp)
![Arduinoとの配線完了時の状態写真](https://cediablog.com/wp-content/uploads/lesson7e-1024x671.webp)
![シフトレジスタによる点灯LEDシフト動作回路の配線説明図](https://cediablog.com/wp-content/uploads/lesson7f.webp)
![シフトレジスタによる点灯LEDシフト動作回路の配線説明図](https://cediablog.com/wp-content/uploads/lesson7f.webp)
上図が配線説明図となりますので、これと同じ配線をすれば完成します。
- シフトレジスタをブレッドボードに差し込む
- 各LEDをブレッドボードに差し込む
- 220Ω抵抗をブレッドボードに差し込む
- ジャンパー線をブレッドボードとArduinoソケットに差し込む(計5本)
- ジャンパー線をブレッドボード内の2か所に差し込む(計13本)
シフトレジスタは、ブレッドボードに対して各ピンが垂直に挿入されるように傾けずに挿入してください。
シフトレジスタのピンが折れてしまう可能性がありますのでご注意ください。
LEDや抵抗及びジャンパー線は、Arduinoのソケットやブレッドボード穴に差し込むだけでOKです。
LEDはプラス・マイナスの極性があります。
抵抗は極性がありません。
上記説明図で「+」マークがある側(右側)をプラス側にしてください。
LED極性の見分け方については、こちらをご確認ください。
機器故障させないためにも、USBケーブルを抜いた「通電OFF」状態にて配線を行ってください
shiftOut関数によるシフト制御の考え方
shiftOut関数について説明します。
shiftOut関数の使い方
shiftOut関数を使ってシフトレジスタからの出力をシフトさせるためには、以下の如く関数の前後にストレージレジスタクロック入力ST-CPへの出力制御が必要となります。
shiftOut関数を使う流れ
ストレージレジスタクロック入力=LOW
shiftOut関数
ストレージレジスタクロック入力=HIGH
シフトレジスタクロック入力ST-CPに接続するArduino出力ソケットを選択します。
今回の例では9番ソケットになります。
ストレージレジスタクロック入力がHIGHに変わるときに、シフトレジスタデータが出力データに代入されます
shiftOut(dataPin, clockPin, bitOrder, value)関数の説明
1バイト分のデータを1ビットずつシフトアウトします。
dataPin
シリアルデータ入力ピン番号を代入します。
シリアルデータ入力DSに接続するArduino出力ソケットを選択します。
今回の例では8番ソケットになります。
clockPin
シフトレジスタクロックピン番号を代入します。
シフトレジスタクロック入力SH-CPに接続するArduino出力ソケットを選択します。
今回の例では10番ソケットになります。
bitOrder
![bitOder:LSBとMSBの説明](https://cediablog.com/wp-content/uploads/lesson7o.webp)
![bitOder:LSBとMSBの説明](https://cediablog.com/wp-content/uploads/lesson7o.webp)
ビットの送信順序を選択します。
「LSB」選択時は下位ビットから、「MSB」選択時は上位ビットから転送します。
![LSBとMSBのデータシフト結果例](https://cediablog.com/wp-content/uploads/lesson7p-1024x392.webp)
![LSBとMSBのデータシフト結果例](https://cediablog.com/wp-content/uploads/lesson7p-1024x392.webp)
LSB選択時:Q0からQ7に向かってデータがシフトする
MSB選択時:Q7からQ0に向かってデータがシフトする
value
送信したいデータ数=点灯パターン数を代入します。
プログラミングのやり方
Arduino IDEによるプログラミング方法とサンプルプログラムについて説明します。
Arduino IDE
Arduino IDEとは統合開発ソフトウェアで、C言語のような文字列を用いたプログラミング方法です。
プログラミングするにあたり、ある程度の命令語を知っておく必要があります。
Arduino IDEのインストール方法については、以下の記事で詳しく説明しています。
プログラミング方法
![Arduino IDEでのプログラミング画面(LESSON7.5)](https://cediablog.com/wp-content/uploads/lesson7n.webp)
![Arduino IDEでのプログラミング画面(LESSON7.5)](https://cediablog.com/wp-content/uploads/lesson7n.webp)
Arduino IDEを使って、文字列プログラミングを行います。
Arduino IDEを使ったプログラミング~動作確認方法については、以下の記事で詳細説明しています。
Arduino IDEプログラム
/* 作品名:LESSON7.5 */
/* 作成者:せでぃあ https://cediablog.com */
/* シフトレジスタによる複数LED点灯制御 */
const int PIN_SER = 8; //14ピン:シリアルデータ入力
const int PIN_STR = 9; //12ピン:ストレージレジスタクロック入力
const int PIN_SHR = 10; //11ピン:シフトレジスタクロック入力
byte patterns[] = { //8LEDの点灯パターン設定0:消灯 1:点灯
B00000000,
B10000001,
B01000010,
B00100100,
B00011000,
B10011001,
B01011010,
B00111100,
B10111101,
B01111110,
B11111111,
B11111111,
B00000000,
B00011000,
B00100100,
B01000010,
B10000001,
B10011001,
B10100101,
B11000011,
B11011011,
B11100111,
B11111111,
B11111111,
B00000000,
B10101010,
B01010101,
B10101010,
B01010101,
B10101010,
B01010101,
B00000000,
};
void setup() {
// put your setup code here, to run once:
pinMode(PIN_SER, OUTPUT); //8番ソケットを出力として使用
pinMode(PIN_STR,OUTPUT); //9番ソケットを出力として使用
pinMode(PIN_SHR,OUTPUT); //10番ソケットを出力として使用
}
void loop() {
// put your main code here, to run repeatedly:
for(int i=0; i<sizeof(patterns); i++){ //LED点灯パターンを順番に切り替える
digitalWrite(PIN_STR,LOW); //ストレージレジスタ書き込み準備
shiftOut(PIN_SER,PIN_SHR,LSBFIRST,patterns[i]); //シフトレジスタへデータを送る
digitalWrite(PIN_STR,HIGH); //ストレージレジスタ書き込み
delay(150); //0.15秒間隔でLED点灯パターンを切り替える
}
}
上記がシフトレジスタによる点灯LEDシフト制御回路のプログラムになります。
Arduino IDEのプログラム画面にコピーアンドペーストすることで、動作確認まで進めることができます。
各プログラム列の右側にプログラム内容をコメント記入してありますので参考にしてください。
![](https://cediablog.com/wp-content/uploads/wink-150x150.png)
![](https://cediablog.com/wp-content/uploads/wink-150x150.png)
![](https://cediablog.com/wp-content/uploads/wink-150x150.png)
色変化スピードを調整するにはディレイタイマの数値を変更してください
命令語の解説
今回のプログラムで使用した命令文について、解説します。
shiftOut関数に関しては前述内容を参照してください
変数のデータ型指定
変数のデータ型を指定するものです。
今回はピンソケット番号を代入するので整数を扱う「int型」を指定します。
データ型 | 説明 | 扱える範囲 |
---|---|---|
int | 2バイトの整数を代入可能。 | -32768~32767 |
long | 4バイトの整数を代入可能 | -2,147,483,648~2,147,483,647 |
float | 4バイトの小数を代入可能。 | 3.4028235×1038~-3.4028235×1038 |
char | 1バイトの値を代入可能。文字列の代入に利用されます。 | -128~127 |
boolean | 0または1のみ代入可能。フラグのON-OFFなどに利用されます。 | 0,1 |
constを付帯することで、書き換え不能の固定値にすることができます
pinMode(入出力ソケット番号,INPUTまたはOUTPUT)
指定したデジタル入出力ソケット番号の機能を指示します。
入力として使用する場合は「INPUT」、出力の場合は「OUTPUT」を指定します。
digitalWrite(入出力ソケット番号,HIGHまたはLOW)
指定したデジタル入出力ソケット番号の電圧をON、またはOFFします。
ONさせたいときは「HIGH」、OFFさせたいときは「LOW」を指定します。
for文
初期値から加算値を加算しながら実行分を繰り返します。
条件式が成立すると繰り返し動作が終了します。
for(初期化 ; 条件式 ; 加算){
実行される文 ;
}
sizeof(variable)
sizeof演算子は変数や配列のバイト数を返します。
delay(時間)
()内で指定した時間(単位はmsec)だけ、プログラム実行を待たせます。
マイクロ秒単位で指定したい場合は、delayMcroseconds(時間)を使います。
動作確認方法
![配線状態説明図(LESSON7)](https://cediablog.com/wp-content/uploads/lesson7k.webp)
![配線状態説明図(LESSON7)](https://cediablog.com/wp-content/uploads/lesson7k.webp)
- LEDの点灯動作が①⇒②⇒③の順に動作するか?
- 動作が繰り返されるか?
- 外側から中央側に向かって点灯LEDが集まってくる
- 中央から外側に向かって点灯LEDが積み重なっていく
- 奇数・偶数デジタル出力LEDが交互に点灯する
上記項目について確認していきましょう。
LEDの点灯動作が①⇒②⇒③の順に動作するか?
LEDの点灯パターンが順番に変化していくことを目で見て確認してください。
![](https://cediablog.com/wp-content/uploads/wink-150x150.png)
![](https://cediablog.com/wp-content/uploads/wink-150x150.png)
![](https://cediablog.com/wp-content/uploads/wink-150x150.png)
動作をじっくり確認したい場合はdelay値を大きくしてみよう
動作が繰り返されるか?
①⇒②⇒③⇒①……のように動作が繰り返されることを確認してください。
もし点灯動作が途中で止まってしまった場合は、サンプルプログラムと比較して修正してください。
shiftOut関数による点灯LEDシフト動作回路(LESSON7.5)のまとめ
- shiftOut関数を使うことで8つのLEDのパターン切り替えが可能
- shiftOut関数を有効にするには、関数の前後にストレージレジスタクロック入力信号切替が必要
- LSB、MSB指定で制御ビットが真逆になるので注意が必要
今回のように、スクラッチプログラミングでは扱えない関数が存在しています。
ArduinoIDEによる文字列プログラミングを学習することで、制御できる幅が広がります。
![](https://cediablog.com/wp-content/uploads/wink-150x150.png)
![](https://cediablog.com/wp-content/uploads/wink-150x150.png)
![](https://cediablog.com/wp-content/uploads/wink-150x150.png)
他のArduinoIDEプログラミングもチャレンジしてみよう
小学生のお子様には、プログラミング教室での基礎学習をおすすめしています!
まずは体験入学から始めてみてはいかがでしょうか?
プログラミング教室が近くにない方には、オンライン教室という選択肢もあります。
Arduinoスクラッチプログラミングのおすすめ参考書について詳しく説明しています。
Arduinoプログラミング(スクラッチも)を使った電子工作を紹介しています。
LESSON7:スクラッチプログラミングによるシフトレジスタの使い方はこちら!
コメント