少ないPINでLED大量制御! シフトレジスタ(SN74HC595),ESP-WROOM-02,32,Arduino
こんにちは!
今回は少ないピンでLEDを簡単に大量制御する方法をお伝えしたいと思います!
過去の記事で「LEDキューブの作り方!」という記事がありますが仕組みや使う部品は同じです!
これができるようになるとLEDを少ないピンで数百個や数千個といったLEDの制御を簡単にできるようになります!
それを可能にしてくれる部品が、シフトレジスタという部品です!
これも簡単に手に入り、特に難しい回路構成は必要でないので是非、チャレンジしてみましょう^^
それでは早速作ってみたいと思います!
①「使う部品」
・部品は壊れた場合を考え、少し多めに買うことをおすすめします!
部品一覧↓
・シフトレジスタ「SN74HC595N」
(1つで8ピン増やせますので8×8×8の場合は64ピン必要なので最低8個必要です。)
⇩⇩⇩(追記)2022年3月13日より、電子工作ステーションさんで販売開始‼
電子工作ステーション 50円+送料(500円以上で送料無料)
※SN74HC595Nは秋月電子では販売終了。後継となるものがU74HC595AG-D16-T
となります。ただし、試していないので全く同じように使えるかはわかりません(;^ω^)
・LED(発光ダイオード) 一個 10円~
何色でもOKですが、数が多ければ多いほど消費電力が少なく高い電流にも
耐えられるものが良い(赤や黄色は壊れやすい)。
※理由としては、数が多いほど全部点灯させたときに薄く光ります。
逆に1個だけ点灯させた場合電流が高くなりLEDが壊れる危険性があります。
※サイズは5㎜で、透明色のLEDをお勧めします!(見栄えが良くなります。)
・ESP-WROOM-32 (ESP-WROOM-32D)
※楽天にて横幅を細くしたバージョンが登場‼
pin番を無くした代わりに細くなっているので、ブレットボードで使いやすくなりました‼
6極ブレットボードではなく定番のブレットボードで使えるようになるのでススメです⇩⇩⇩
・通信用USBケーブルタイプB (家に無ければ)
ESP-WROOM-32とパソコンを繋ぐためのケーブルです。
100円ショップなどでも販売していますが、スマホ用充電専用タイプだと使えないのでご注意ください。
※Type-C対応のESP32をご購入された場合はType-Cケーブルをご購入ください。
・抵抗 (100~150Ω) 100本 100円
※今回は150Ωを使用していますが100Ωでも問題ありません。
電子工作ステーショ 1本3円+送料(500円以上で無料)
秋月電子 100本100円+送料
・LEDキャップ (任意)
電子工作ステーショ 1個5円+送料(500円以上で無料)
秋月電子 50個200円+送料
※点灯させたとき眩しいのであった方が良いです。
・ コンデンサ 0.1μF
(無くても起動しますが電子工作上よく出てくる部品です。電流を一層安定させるために使います。)
・ブレッドボード 6穴版 EIC-3901ブレットボード
秋月電子 460円+送料
(ESP-WROOM32は幅が広い為6穴版でないと不便です)
・ジャンパーワイヤー(オス・オス) (約7本)
電子工作ステーション 1セット(10本)100円+送料(500円以上で無料)
秋月電子 18本180円+送料
・ブレッドボード用ジャンパーワイヤ
電子工作ステーション 1セット(5本)35円+送料(500円以上で無料)
秋月電子 1セット460円+送料
(ブレットボードで回路を組むとき、見栄え良く綺麗に繫げられますのであると便利)
②「作り方・配線」
・シフトレジスタにに繋ぐLEDとESP-WROOM-32の繋ぎ方を表と写真でご紹介します。
・シフトレジスタの見方⇩
くぼみがある方が左です。
・接続表
シフトレジスタ(SN74HC595N)(LED8個Ver) | ||
ピン番号 | ピン名称 | 接続先 |
1 | Q1 | 2つ目のLEDのアノードピン |
2 | Q2 | 3つ目のLEDのアノードピン |
3 | Q3 | 4つ目のLEDのアノードピン |
4 | Q4 | 5つ目のLEDのアノードピン |
5 | Q5 | 6つ目のLEDのアノードピン |
6 | Q6 | 7つ目のLEDのアノードピン |
7 | Q7 | 8つ目のLEDのアノードピン |
8 | GND | GND (ESP-WROOM-32-) |
9 | Q7′ | |
10 | MR | 5V (ESP-WROOM-32-) |
11 | SH | IO5 (ESP-WROOM-32-) |
12 | ST | IO18 (ESP-WROOM-32-) |
13 | OE | GND (ESP-WROOM-32-) |
14 | DS | IO19 (ESP-WROOM-32-) |
15 | Q0 | 1つ目のLEDのアノードピン |
16 | VCC | 5V (ESP-WROOM-32-) 0.1μFのコンデンサを経由してGND |
完成写真⇩
(コンデンサ0.1μFは使用していません)
・抵抗はLEDのGND側に繋げています。(今回は150Ωを使用しています)
シフトレジスタ(SN74HC595N)(LED16個~Ver) | ||
ピン番号 | ピン名称 | 接続先 |
1 | Q1 | 2つ目のLEDのアノードピン |
2 | Q2 | 3つ目のLEDのアノードピン |
3 | Q3 | 4つ目のLEDのアノードピン |
4 | Q4 | 5つ目のLEDのアノードピン |
5 | Q5 | 6つ目のLEDのアノードピン |
6 | Q6 | 7つ目のLEDのアノードピン |
7 | Q7 | 8つ目のLEDのアノードピン |
8 | GND | GND(ESP-WROOM-32-) |
9 | Q7′ | 次のシフトレジスターのDSピン(14) |
10 | MR | 5V(ESP-WROOM-32-) |
11 | SH | IO5(ESP-WROOM-32-) 次のシフトレジスターのSHピン(11) |
12 | ST | IO18(ESP-WROOM-32-) 次のシフトレジスターのSTピン(12) |
13 | OE | GND(ESP-WROOM-32-) |
14 | DS | IO19(ESP-WROOM-32-) |
15 | Q0 | 1つ目のLEDのアノードピン |
16 | VCC | 5V(ESP-WROOM-32-) 0.1μFのコンデンサを経由してGND |
接続するとこんな感じになります⇩
これ以上繋げたい場合は、16Verと同じように繋げていけばOKです!
接続方法がわからない場合はこちらの参考サイトもご利用ください⇩
参考サイト → 少ない出力ピンで、大量のLEDを制御する(シフトレジスタ使用)
③「Arduino IEDにESP-WROOM-32を使えるように設定する」
・こちらをご参考に↓
Arduino IDEでESP-WROOM-02(ESP8266)とESP-WROOM-32を使えるようにする!(Windows10)
④「プログラミング」
・早速プログラムで動かしてみましょう!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#define DATAPIN (19) // 74HC595のDSへ #define LATCHPIN (5) // 74HC595のST_CPへ #define CLOCKPIN (18) // 74HC595のSH_CPへ void MyShiftOut( int dataPin, int clockPin, int bit, unsigned long val ) { for( int i = 0; i < bit; i++ ) { digitalWrite(dataPin, !!(val & (1L << i))); digitalWrite(clockPin, HIGH); digitalWrite(clockPin, LOW); } } void setup() { pinMode(DATAPIN, OUTPUT); pinMode(LATCHPIN, OUTPUT); pinMode(CLOCKPIN, OUTPUT); } void loop() { for( int i = 0; i < 8; i++ ) { digitalWrite(LATCHPIN, LOW); // 送信中はLATCHPINをLOWに // シフト演算を使って点灯するLEDを選択しています MyShiftOut( DATAPIN, CLOCKPIN, 8, 1L << i ); digitalWrite(LATCHPIN, HIGH); // 送信後はLATCHPINをHIGHに戻す delay(100); } } |
成功すると8つのLEDが順番に光ります!
・では、次はLEDを16個に増やしてみたいと思います!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#define DATAPIN (19) // 74HC595のDSへ #define LATCHPIN (5) // 74HC595のST_CPへ #define CLOCKPIN (18) // 74HC595のSH_CPへ void MyShiftOut( int dataPin, int clockPin, int bit, unsigned long val ) { for( int i = 0; i < bit; i++ ) { digitalWrite(dataPin, !!(val & (1L << i))); digitalWrite(clockPin, HIGH); digitalWrite(clockPin, LOW); } } void setup() { pinMode(DATAPIN, OUTPUT); pinMode(LATCHPIN, OUTPUT); pinMode(CLOCKPIN, OUTPUT); } void loop() { for( int i = 0; i < 16; i++ ) { digitalWrite(LATCHPIN, LOW); // 送信中はLATCHPINをLOWに // シフト演算を使って点灯するLEDを選択しています MyShiftOut( DATAPIN, CLOCKPIN, 16, 1L << i ); digitalWrite(LATCHPIN, HIGH); // 送信後はLATCHPINをHIGHに戻す delay(100); } } |
単純に、「 for( int i = 0; i < 8; i++ )」の8を16に変えるのと、「MyShiftOut( DATAPIN, CLOCKPIN, 8, 1L << i );」の8を16に変えるだけです!
例えば32個光らせたい場合はその16のヵ所を32に変えるだけです!
成功するとこんな感じに光ります⇩
この方法を使えばたったの3pinで電流が足りる限り何個でも光らせることが可能です!
しかし、これでは同じ場所を同時に光らせたりということは多分できません(;^ω^)
そこで、「shiftOut関数」というものを使えば簡単に同じところを同時に光らせたりということができるようになります!
プログラムを変えるだけなので是非、試してみてください⇩
以上、ご訪問ありがとうございます^^
次はこれを応用して、LEDキューブを制御してみます!
参考サイト → 少ない出力ピンで、大量のLEDを制御する(シフトレジスタ使用)
5件のフィードバック