meyon230のアイコン画像
meyon230 2023年09月03日作成 (2023年11月01日更新)
セットアップや使用方法 セットアップや使用方法 Lチカ Lチカ 閲覧数 482
meyon230 2023年09月03日作成 (2023年11月01日更新) セットアップや使用方法 セットアップや使用方法 Lチカ Lチカ 閲覧数 482

Arduino で シフトレジスタ 74HC595 を制御する

Arduino で シフトレジスタ 74HC595 を制御する

シフトレジスタ 74HC595 を Arduino NANO Every から制御し、8組の LED を点滅させる回路とスケッチを作ります。特に、74HC595 の制御入力 /OE、/SRCLR の使い方に着目しました。

この記事は「meyon's STUDY」に投稿した記事の抜粋です。

74HC595 の /OE と /SRCLR の動作

/OE (Output Enable)

LOW のとき、出力が有効になる。HIGH のときはハイインピーダンスになる。

/SRCLR (Shift Register Clear)

LOW のとき、シフトレジスタがクリアされる。ストレージレジスタには影響しない。

ストレージレジスタをクリアする方法

ストレージレジスタをクリアするには、/OE を LOW、/SRCLR を LOW にし、RCLK を立ち上げる。

74HC595 を使って LED を点滅させる回路

LED はトランジスタ 2SC1815 を使って駆動します。
ボリューム VR1 は点滅スピードの調整、VR2 は輝度調整用です。
Q10 MOSFET 2SJ681 は、電源投入時の不要な点灯を抑止するための回路です。

74HC595 を使って LED を点滅させる回路

Arduino NANO Every スケッチ

LED の点滅は、scanPatterns[] で指定します。下のスケッチでは、Larson スキャナ風の左右にバウンスする点滅パターンになっています。
シフトレジスタは、/OE、/SRCLR を LOW にした後、RCLK を HIGH にして初期化します。その後 /SRCLR を HIGH にすると、LED 駆動回路へ電源が供給されます。

ledScanner_v.1.ino

// LED Scanner v.1 2022.07.22 meyon const byte scanPatterns[] = { // Pattrens - Larson Scanner 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1e, 0x3c, 0x78, 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0x78, 0x3c, 0x1e, 0x0f, 0x07, 0x03, 0x01 }; class LedScanner { private: const byte SER_Pin = 7; const byte SRCLK_Pin = 8; const byte RCLK_Pin = 9; const byte OE_Pin = 10; const byte SRCLR_Pin = 11; const byte setSpeed_Pin = A0; const byte setBrightness_Pin = A1; public: LedScanner() { pinMode(SRCLR_Pin, OUTPUT); pinMode(OE_Pin, OUTPUT); pinMode(SER_Pin, OUTPUT); pinMode(SRCLK_Pin, OUTPUT); pinMode(RCLK_Pin, OUTPUT); // Initialze the shift registert digitalWrite(RCLK_Pin, HIGH); delayMicroseconds(5); digitalWrite(RCLK_Pin, LOW); digitalWrite(SRCLR_Pin, HIGH); } void setLedBrightness() { int brightnessInput = analogRead(setBrightness_Pin); int brightness = map(brightnessInput, 0, 1023, 255, 0); analogWrite(OE_Pin, brightness); } int setScanSpeed() { int speedInput = analogRead(setSpeed_Pin); int scanSpeed = map(speedInput, 0, 1023, 500, 10); return scanSpeed; } void updateScan(int scanSpeed) { static int numberOfScanPatterns = sizeof(scanPatterns) / sizeof(byte); static unsigned long previousMillis = 0; static int counterOfScanPattern = 0; if(scanSpeed < millis() - previousMillis) { digitalWrite(RCLK_Pin, LOW); shiftOut(SER_Pin, SRCLK_Pin, MSBFIRST, scanPatterns[counterOfScanPattern]); digitalWrite(RCLK_Pin, HIGH); counterOfScanPattern++; if(numberOfScanPatterns <= counterOfScanPattern) counterOfScanPattern = 0; previousMillis = millis(); } } }; void setup() { } void loop() { static LedScanner scanner; scanner.setLedBrightness(); int scanSpeed = scanner.setScanSpeed(); scanner.updateScan(scanSpeed); }
meyon230のアイコン画像
電子工作とかパソコンとかネットワークとかプログラミングとか、いろいろ。
ログインしてコメントを投稿する