shiftOut関数を使ってLEDを大量制御!ESP-WROOM-32-・シフトレジスタ(SN74HC595N)使用
こんばんわ!
今回は以前にご紹介した「少ないPINでLED大量制御!」とは違うやり方で、
LEDを大量制御できる方法をご紹介したいと思います!
どうやるのかといいますと、「shiftOut関数」という関数を使うと簡単に光らせたいLEDのヵ所を
光らせれるようになるので!
※配線や使う部品などは前回と同じです^^
※今回もESP-WROOM-32-を使用して説明したいきますが、
ArduinoやESP-WROOM-02-でもほとんど同じように使えます!
※事情によりLEDは9個で試します。
ということで早速作っていきたいと思います!
①「使う部品・配線の仕方」
・こちらは前回と同様なのでそちらをご参考に⇩
③「プログラミング」
・今回はLED9個で試しています!
群数目のLEDと奇数目のLEDが交互に光れば成功です!
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
//シフトレジスタに繋ぐpin番号設定 int latchPin = 5; // 74HC595のST_CPへ int clockPin = 18;// 74HC595のSH_CPへ int dataPin = 19; // 74HC595のDSへ //光らせるパターンを定義。 int patternLength = 2; //光らせたいLEDを定義。 String patterns[] = { //0が消灯 1が点灯 //16 8 1番目のLED "0000000101010101", "0000000010101010", }; void setup() { pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { //命令のサイズ取得 int len = sizeof(patterns); for (int j = 0; j < patternLength; j++) { //通信中は,latchPinをLOWにする digitalWrite(latchPin, LOW); //標準のshiftOutではクロックが一つ余計に入るので通信が終了したらlatchPinをHIGHにする. myShiftOut(dataPin, clockPin, patternToChar(patterns[j]), 16); digitalWrite(latchPin, HIGH); //1回のパフォーマンスの点灯時間 delay(300); } } void myShiftOut(int dataPin, int clockPin, long data, int dataLength) { for (int i = 0; i < dataLength; i++ ) { digitalWrite(dataPin, !!(data & 1L << i)); digitalWrite(clockPin, HIGH); digitalWrite(clockPin, LOW); } } long patternToChar(String pattern) { int result = 0; for (int i = 0; i < pattern.length(); i++) { char c = pattern.charAt(i); if (c == '1') { result += 1 << i; } } return result; } |
完成するとこんな感じです↓
このやり方なら簡単に光らせたいところを光らせられるようになります!
※参考サイト⇩
秋月電子通商の8ビットシフトレジスタSN74HC595Nを二つ連結してArduinoで16個のLEDを光らせる
以上、細かい仕組みや説明は省いていますのでそういうことも知りたい方は是非ググってみてください^^
2件のフィードバック