シフトレジスタ 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 は、電源投入時の不要な点灯を抑止するための回路です。
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
さんが
2023/09/03
に
編集
をしました。
(メッセージ: 初版)
-
meyon230
さんが
2023/09/03
に
編集
をしました。
-
meyon230
さんが
2023/11/01
に
編集
をしました。
(メッセージ: リンク先URL変更)
ログインしてコメントを投稿する