🕷

シフトレジスタと7セグメントLEDの使い方

2023/01/02に公開約1,500字

意外とハードルが高い

文字を指定すればそのまま出るもんだと思っていた
ところが実際は8個のLEDを並べたものだった
LEDとは書かれてあるが本当にただのLEDの集まりだった
縦横に配置した7本の線と右下のドットで8個のLEDとなっている
調べてみるとGPIOを8本使って制御する手もあるがピンの数は限られているため一般的にはシフトレジスタ(74HC595)を介して操作するものであるらしい
電子工作を始めた初日、まずは7セグメントLEDを取りつけようと考え、LEDに添える抵抗の意味もわかっていなかった自分は、いきなり壁にぶちあたった

主な部品

https://akizukidenshi.com/catalog/g/gI-14053/
https://akizukidenshi.com/catalog/g/gI-00640/

アイテム 価格
シフトレジスタ 74HC595 40円
7セグメントLED 40円

配線で気をつけること

こちらがわかりやすい
https://iot.keicode.com/arduino/arduino-shift-register-sn74hc595.php

  • QA〜QH で8ビット分だけど QA だけ反対側にある (なぜ?)
  • 7セグメントLEDがカソードコモンの場合は 3 と 8 を GND に繋ぐ

コード

#define SER   2
#define RCLK  3
#define SRCLK 4

void setup() {
  pinMode(RCLK, OUTPUT);
  pinMode(SRCLK, OUTPUT);
  pinMode(SER, OUTPUT);
}

uint64_t count = 0;

void loop() {
  shiftOut(SER, SRCLK, LSBFIRST, 1 << ((count / 5) & 7));
  digitalWrite(RCLK, LOW);
  digitalWrite(RCLK, HIGH);
  count++;
  delay(1000 / 60);
}

書き込む前に RCLK を LOW にすべき?

次のように RCLK の LOW と HIGH で囲んでいるサンプルをよく見かける

digitalWrite(RCLK, LOW);
shiftOut(...);
digitalWrite(RCLK, HIGH);

が、実際のところ囲まなくても書き込める
RCLK が LOW か HIGH の状態で何かが変わるのではなく LOW から HIGH にしたタイミングで反映する仕組みになっている

囲んでいるサンプルが多い理由は

  • LOW にしないと書き込めないという思い込み
  • HIGH のままだと即反映されてしまうという思い込み
  • HIGH のままもし即反映されたらいけないから (心配性)
  • DB の Transacation ブロックのようなものをイメージしちゃってる
  • 既存のサンプルがそうなってたから

かもしれない

こちらの記事では普通に LOW, HIGH をまとめて書いている
https://rage1blog.com/how-to-use-arduino_shift-register_74hc595/

個人的には反映する処理としてまとめて書きたい

Discussion

ログインするとコメントできます