PR

Arduino学習⑮ Lesson16 74HC595を使って8つのLEDを制御
Arduinoの勉強会。74HC595Nシフトレジスタを使ってLEDを制御してみた。

Arduino学習

74HC595 シフトレジスタ

シフトレジスタは、8つのメモリ位置を保持するICチップであり、それぞれが1または0のいずれかになります。これらの値をそれぞれオンまたはオフに設定するには、チップの「データ」ピンと「クロック」ピンに信号を送って制御します。

クロックピンは、指定されたパルス幅で1つずつデータを受け取ります。各パルスでデータピンがHighの場合は、1がシフトレジスタに設定されます。8個のパルスを受信した後で、Latchピンを有効にすると8個の値がラッチレジスタにコピーされます。
つまりデータピン、クロックピン、ラッチピンの3つのピンの制御で8つの信号ピンを制御することが可能になります。

ピンの仕様は、以下になります。

Q1出力1VCC5V
Q2出力2Q0出力0
Q3出力3SERシリアルデータ入力(Pin12)
Q4出力4OEOutput Enable(LOWで有効なのでLOWにする)
Q5出力5RCLKラッチクロック(Pin11)
Q6出力6SCLKシフトクロック(Pin9)
Q7出力7CLEARクリア(LOWでクリアなのでHIGHにする)
GNDGNDQH’カスケード用シリアル出力

使用部品

必要な部品は以下になります。

  • Elegoo UNO R3 x 1
  • 830 tie-points Breadboard x 1
  • LED x 8
  • 220Ω 抵抗器 x 8
  • 74HC595 IC
  • M-M Jumper wires x 14

以下のスターターキットに使用部品はすべて同梱されています。

回路をつくってみる

それでは実際に回路をつないでみます。

チュートリアル付属の回路図
チュートリアル付属の配線図

プログラムを動かしてみる

チュートリアル付属のコードを動かしてみます。

//www.elegoo.com
//2016.12.9 

int tDelay = 100;
int latchPin = 11;      // (11) ST_CP [RCK] on 74HC595
int clockPin = 9;      // (9) SH_CP [SCK] on 74HC595
int dataPin = 12;     // (12) DS [S1] on 74HC595

byte leds = 0;

void updateShiftRegister()
{
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, LSBFIRST, leds);
   digitalWrite(latchPin, HIGH);
}

void setup() 
{
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
}

void loop() 
{
  leds = 0;
  updateShiftRegister();
  delay(tDelay);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, i);
    updateShiftRegister();
    delay(tDelay);
  }
}
C++

右から順にLEDが点灯していきます。

シリアルモニタを使って制御してみる

Lesson17では、同じ回路のままシリアルモニタを使って制御します。
このまま次のチュートリアルのプログラムを動かしてみたいと思います。

Arduino IDE のメニューから「ツール」→「シリアルモニタ」を選択すると下側にシリアルモニタが表示されます。(Arduino IDEの右上のアイコンでもシリアルモニタが表示されます。)

//www.elegoo.com
//2018.2.9

int latchPin = 11;
int clockPin = 9;
int dataPin = 12;

byte leds = 0;
void updateShiftRegister()
{
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, LSBFIRST, leds);
   digitalWrite(latchPin, HIGH);
}
void setup() 
{
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
  updateShiftRegister();
  Serial.begin(9600);
  while (!Serial); // Wait untilSerial is ready - Leonardo
  Serial.println("Enter LED Number 0 to 7 or 'x' to clear");
}

void loop() 
{
  if (Serial.available())
  {
    char ch = Serial.read();
    if (ch >= '0' && ch <= '7')
    {
      int led = ch - '0';
      bitSet(leds, led);
      updateShiftRegister();
      Serial.print("Turned on LED ");
      Serial.println(led);
    }
    if (ch == 'x')
    {
      leds = 0;
      updateShiftRegister();
      Serial.println("Cleared");
    }
  }
}
C++

LEDを制御する基本部分は、Lesson16そのままですが、30行目の「char ch = Serial.read()」によりシリアル通信でPCから送信された文字を1文字読み取っています。
数字の「0」~「7」を送信すると、対応するLEDが点灯します。アルファベットの「x」を送信するとすべてのLEDが消灯します。

以上

コメント

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