17 Arduino シフトレジスターで、デジタル出力ポートの増設
この記事では、Arduino に、デジタルICであるシフトレジスタを追加して、デジタル出力ポートの増設をします。。
使用したデジタルICは、74HC595 シリアルイン・パラレルアウト 8ビットシフトレジスタです。
- pin 14 がシリアルデータの入力、
- pin 11 のシフトクロック立ち上がりのタイミングでデータを取り込み、
- pin 12 のラッチクロック立ち上がりで、8ビットシフトレジスタの値をデータラッチに取り込みます。
出力 pin数は8本あるので、Arduinoのpin 3本を使い、8本の出力を制御することができます。もし、さらに、多くの出力が必要な場合には、シフトレジスタを数珠つなぎに増やすことで、8本単位で出力を増やすことも可能です。
Arduinoとの接続配線図は以下のようです。
実体配線図で、LEDが一列に並んでいますが、2.5mm間隔のICピンから直径5mmのLEDへきれいに並べて配線するには、注意深くLEDの足の形を整える必要があり、かなり集中力が必要です。
配線図上には、LEDの電流制御抵抗が書かれていますが、実体配線図上には見当たりません。今回使用したLEDは、見た目は普通のLEDですが、LED自体に電流制御抵抗を内蔵している12v用LEDなのです。
秋月電子では、5v用と12v用がありますが、12v用を5vシステムで使用しても十分な光量があるため、今回も12v用抵抗内蔵LEDを使用しています。
このLEDを利用することで、配線の手間が大幅に減り電子工作では毎回大変重宝しています。
スケッチ内容
シフトレジスターにデーターを書き込むプログラムは、updateShiftRegister(data)という関数にしています。
// シフトレジスタでLED8個を点灯 // 2021-6-11 int tDelay = 500; // LEDの点灯時間 ms int latchPin = 11; // 74HC595 [RCK] pin 12 int clockPin = 12; // 74HC595 [SCK] pin 11 int dataPin = 9; // 74HC595 [S1] pin 14 void updateShiftRegister(byte leds) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, leds); digitalWrite(latchPin, HIGH); } void setup() { pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); } void loop() { byte leds = 1; for (int i = 0; i < 8; i++) { updateShiftRegister(leds); // データを送信 leds <<= 1; // 「1」を左にシフト delay(tDelay); } }
使用した Arduino命令
今回使用したArduino関連の命令の簡単な説明とその日本語レファレンスの掲載されているリンクを紹介します。
- shiftOut(dataPin, clockPin, bitOrder, value)
1バイト分のデータを1ビットずつ「シフトアウト」します。
最上位ビット(MSB)と最下位ビット(LSB)のどちらからもスタートできます。
各ビットはまずdataPinに出力され、その後clockPinが反転して、
そのビットが有効になったことが示されます。
動作の確認
スケッチを Arduino に書き込みプログラムがスタートすると、
点灯するLEDがひとつずつズレていきます。
次回は、今回作成した回路を使用しシリアルモニターの利用を学習します。