複数のシフトレジスタ(カスケード接続)を同時に使って出力ピンを拡張する方法

電子工作

みなさん,こんにちは
おかしょです.

マイコンを使っていて出力ピンが不足してしまっても,シフトレジスタを使うことで出力ピンの数を増やすことができます.このシフトレジスタを複数使うことで出力ピンをさらに増やすことができます.この記事では複数のシフトレジスタを用いる方法について解説します.

この記事を読むと以下のようなことがわかる・できるようになります.

  • シフトレジスタの使い方
  • シフトレジスタの電子回路
  • 複数のシフトレジスタを使う方法
  • シフトレジスタのカスケード接続

この記事を読む前に

この記事では複数のシフトレジスタを使う方法について解説しますが,シフトレジスタのピンの持つ役割などは以下の記事で詳細に解説しているので,そちらを先に読んでおくことをおすすめします.

ピンの役割などはどうでも良いから,とにかく使いたいという方はこのまま読み進めていただいても使うことはできると思います.

シフトレジスタ(74HC595)を使ってArduinoの出力ピンを拡張するやり方
みなさん,こんにちはおかしょです. マイコンを使った電子工作をしていると出力ピンが足りなくなることがあります.そのようなときはもっとピンが多い違うマイコンを買うことがまず頭に浮かぶと思いますが,もう一つ方法があります. その方法がシフトレジ...

シフトレジスタのピン配置

この記事では74HC595と言うシフトレジスタを使用します.

このシフトレジスタのピン配置について詳しいことは上の記事で詳細に解説しているのですが,ここでも簡単に説明しておきます.

ピン配置は上記のようになっていて,’SER’と書かれているピンにデータを入力して’RCLK’と書かれているピンと’SRCLK’と書かれているピンを’LOW’から’HIGH’に操作することで,データをシフトして’QA~QH’のピンにデータを振り分けます.

このシフトレジスタを複数用いる場合はカスケード接続ということをする必要があります.

前回の記事でも一番右下のピンQH’については詳しい解説はしませんでした.このピンはシフトレジスタを複数使う場合に使います.このピンはSERに入力されたデータを出力する役割があります.

そのため,このピンを次のシフトレジスタのSERピンに接続することでデータの受け渡しができるようになります.

今回使用するもの

文章だけではわかりにくいと思うので,実際にやってみましょう.

今回使用するものは以下になります.

  1. マイコン(Arduino Uno)
  2. シフトレジスタ(74HC595)
  3. LED×16
  4. 抵抗器×16

[itemlink post_id=”3942″]

シフトレジスタなどは秋月電子で購入した方が安いです.以下にリンクを貼っておきます.
シフトレジスタLED抵抗器

複数のシフトレジスタの電子回路(カスケード接続)

電子回路を見ていきましょう.複数のシフトレジスタを使う場合は以下のような電子回路を組みます.

上の回路図はシフトレジスタを2つ使って,16このLEDを制御することができます.

左側のシフトレジスタのSERピンはマイコンであるArduinoと直接つながっています.それに対して,右側のシフトレジスタのSERピンは左のシフトレジスタのQH’ピンとつながっています.このようにすることで左から右のシフトレジスタへとデータの受け渡しをすることができます.

出力ピン(QA~QH)以外のピンは右のシフトレジスタも左のシフトレジスタと同じようにすべて並列接続で配線をします.

ここでシフトレジスタが1つだけの場合の電子回路を見てみましょう.

上の回路図と見比べると,Arduinoと接続されているピンの数は全く変わっていません.つまり,シフトレジスタがいくら増えようとArduinoの出力ピンは3つだけで十分だということです.

マイコンの出力ピンが足りなくて困っている方は1個35円程度のシフトレジスタを買い足すだけで,ピン不足の問題を確実に解決できます.

ただ,シフトレジスタの数を増やしすぎるとデータの受け渡し時にノイズがのっかってしまい,データの欠損が生じるので注意が必要です.

Arduinoのプログラム

上記のようにマイコンにArduino Unoを使用して電子回路を組んだ場合,以下のプログラムを用いることで16個のLEDを制御することができます.

#define SER 2
#define RCLK 1
#define SRCLK 0

byte data[2][1];

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

void loop() {
  data[0][0] = B00000001;
  data[1][0] = B00000001;
  digitalWrite(RCLK, LOW);
  shiftOut(SER, SRCLK, LSBFIRST, data[0][0]);
  shiftOut(SER, SRCLK, LSBFIRST, data[1][0]);
  digitalWrite(RCLK, HIGH);
  delay(75);
  
  data[0][0] = B00000010;
  data[1][0] = B00000010;
  digitalWrite(RCLK, LOW);
  shiftOut(SER, SRCLK, LSBFIRST, data[0][0]);
  shiftOut(SER, SRCLK, LSBFIRST, data[1][0]);
  digitalWrite(RCLK, HIGH);
  delay(75);
  
  data[0][0] = B00000100;
  data[1][0] = B00000100;
  digitalWrite(RCLK, LOW);
  shiftOut(SER, SRCLK, LSBFIRST, data[0][0]);
  shiftOut(SER, SRCLK, LSBFIRST, data[1][0]);
  digitalWrite(RCLK, HIGH);
  delay(75);
  
  data[0][0] = B00001000;
  data[1][0] = B00001000;
  digitalWrite(RCLK, LOW);
  shiftOut(SER, SRCLK, LSBFIRST, data[0][0]);
  shiftOut(SER, SRCLK, LSBFIRST, data[1][0]);
  digitalWrite(RCLK, HIGH);
  delay(75);
  
  data[0][0] = B00010000;
  data[1][0] = B00010000;
  digitalWrite(RCLK, LOW);
  shiftOut(SER, SRCLK, LSBFIRST, data[0][0]);
  shiftOut(SER, SRCLK, LSBFIRST, data[1][0]);
  digitalWrite(RCLK, HIGH);
  delay(75);
  
  data[0][0] = B00100000;
  data[1][0] = B00100000;
  digitalWrite(RCLK, LOW);
  shiftOut(SER, SRCLK, LSBFIRST, data[0][0]);
  shiftOut(SER, SRCLK, LSBFIRST, data[1][0]);
  digitalWrite(RCLK, HIGH);
  delay(75);
  
  data[0][0] = B01000000;
  data[1][0] = B01000000;
  digitalWrite(RCLK, LOW);
  shiftOut(SER, SRCLK, LSBFIRST, data[0][0]);
  shiftOut(SER, SRCLK, LSBFIRST, data[1][0]);
  digitalWrite(RCLK, HIGH);
  delay(75);
  
  data[0][0] = B10000000;
  data[1][0] = B10000000;
  digitalWrite(RCLK, LOW);
  shiftOut(SER, SRCLK, LSBFIRST, data[0][0]);
  shiftOut(SER, SRCLK, LSBFIRST, data[1][0]);
  digitalWrite(RCLK, HIGH);
  delay(75);
}

プログラムはほとんど前回のものと変わらないので解説は割愛します.

シフトレジスタが2つになって変わった部分はshiftOutコマンドの部分だけです.このコマンドはシフトレジスタの数だけ実行する必要があります.

上記のプログラムでは行列で定義したdataを順番にシフトさせていくことで各シフトレジスタにデータを保存するようにしています.最初に送ったデータは2つ目のシフトレジスタ(回路図の右側)に次のshiftOutでは1つ目のシフトレジスタ(回路図の左側)にデータが入るようになっています.

実行結果

上記のような電子回路を組んでプログラムを実行すると以下のようになります.

まとめ

この記事では複数のシフトレジスタを同時に使う方法について解説しました.シフトレジスタをいくつも使うことでたくさんのLEDを3つの出力ピンだけで制御することができます.

ただ,シフトレジスタを増やしすぎるとノイズがのっかりデータの欠損が生じるので注意してください.

続けて読む

今回解説したシフトレジスタを使って,卓上時計を作成しています.気になる方は以下の記事で作成過程をまとめているのでのぞいてみてください.

「現在,準備中です…」

Twitterでは記事の更新情報や活動の進捗などをつぶやいているので気が向いたらフォローしてください.

YouTubeでも制御工学や電子工作などの解説をしているので,ぜひのぞいてみてください.

それでは最後まで読んでいただきありがとうございました.

コメント

タイトルとURLをコピーしました