Arduinoとシフトレジスタ(TC74HC595)でLEDを制御


1.回路構成図



2.各名称と意味




スケッチ1の動作状況



※スケッチは多くの方がネットや動画で公開しているものを参考にしています。
<スケッチ1>

//シフトレジスタ(74HC595)でLEDを制御するプログラム
const int SER = 2;   //変数SER(シリアル)にArduinoの2番ピンを宣言
const int SRCLK = 3; //変数SRCLK(クロック)にArduinoの3番ピンを宣言
const int RCLK = 4;  //変数RCLK(ラッチ)にArduinoの4番ピンを宣言


void setup() {
  pinMode(SER, OUTPUT);  //Arduino2番ピンを出力に設定
  pinMode(SRCLK, OUTPUT); //Arduino3番ピンを出力に設定
  pinMode(RCLK, OUTPUT);  //Arduino4番ピンを出力に設定
  
  digitalWrite(SER, LOW);  //SERをLOWに設定
  digitalWrite(SRCLK, LOW); //SRCLKをLOWに設定
  digitalWrite(RCLK, LOW); //RCLKをLOWに設定
  
  }

void loop() {
  zento();
  tobi();
  allresetlong();
  junban();
  allresetlong();
  junban2();  //LED逆点灯

}

void zento(){
  int i;
  for(i=0; i<8; i++){
    digitalWrite(SER, HIGH);  //シリアルをHIGHにして出力
    digitalWrite(SRCLK, HIGH); //クロックをHIGHにしてSERの信号と同期
    digitalWrite(SER, LOW);
    digitalWrite(SRCLK, LOW);
    }
   digitalWrite(RCLK, HIGH); //ストレージレジスタへ書き込み
   digitalWrite(RCLK, LOW);  //
   delay(1000);
}

void tobi(){
  int i;
  for(i=0; i<8; i++){
    digitalWrite(SER, HIGH);
    digitalWrite(SRCLK, HIGH);
    digitalWrite(SER, LOW);
    digitalWrite(SRCLK, LOW);
    digitalWrite(SRCLK, HIGH);
    digitalWrite(SRCLK, LOW);
    }
   digitalWrite(RCLK, HIGH);
   digitalWrite(RCLK, LOW);
   delay(1000);  
}

void junban(){
  int i;
    digitalWrite(SER, HIGH);
    digitalWrite(SRCLK, HIGH);
    digitalWrite(SER, LOW);
    digitalWrite(SRCLK, LOW);
    digitalWrite(RCLK, HIGH);
    digitalWrite(RCLK, LOW);
    delay(500);
  for(i=0; i<7; i++){
    digitalWrite(SRCLK, HIGH);
    digitalWrite(SRCLK, LOW);
    digitalWrite(RCLK, HIGH);
    digitalWrite(RCLK, LOW);
    delay(500);
  }
}
 void junban2(){
  int i;
  int j;

    for(j=0; j<8; j++){
      digitalWrite(SER, HIGH);
      digitalWrite(SRCLK, HIGH);
      digitalWrite(SER, LOW);
      digitalWrite(SRCLK, LOW);

      for(i=8-j; i>1; i--){     //第2ループ
        digitalWrite(SRCLK, HIGH);
        digitalWrite(SRCLK, LOW);
      }
      digitalWrite(RCLK, HIGH);
      digitalWrite(RCLK, LOW);
      delay(500);
      allreset();  //allresetを入れないと第2ループがうまく動かない
    }
    allresetlong();
}

void allreset(){  //全部を消すというもの(delay 0.01s)。LOw状態のものをクロックして8回ラッチする
  int i;
  for(i=0; i<8; i++){
    digitalWrite(SER, LOW);
    digitalWrite(SRCLK, HIGH);
    digitalWrite(SRCLK, LOW);
  }
  digitalWrite(RCLK, HIGH);
  digitalWrite(RCLK, LOW);
  delay(10);
}

void allresetlong(){   //全部を消すというもの(delay 1s)。LOw状態のものをクロックして8回ラッチする
  int i;
  for(i=0; i<8; i++){
    digitalWrite(SER, LOW);
    digitalWrite(SRCLK, HIGH);
    digitalWrite(SRCLK, LOW);
  }
  digitalWrite(RCLK, HIGH);
  digitalWrite(RCLK, LOW);
  delay(1000);
}


スケッチ2の動作状況



※スケッチは多くの方がネットや動画で公開しているものを参考にしています。
<スケッチ2>

//シフトレジスタ(74HC595)でLEDを制御するプログラム
//LEDパターンで制御する方法
const int SER = 2;   //変数SER(シリアル)にArduinoの2番ピンを宣言
const int SRCLK = 3; //変数SRCLK(クロック)にArduinoの3番ピンを宣言
const int RCLK = 4;  //変数RCLK(ラッチ)にArduinoの4番ピンを宣言

byte patterns[] = {
  B00000000,   //Bは二進数のデータであることを示す
  B10000000,
  B11000000,
  B11100000,
  B11110000,
  B11111000,
  B01111100,
  B00111110,
  B00011111,
  B00001111,
  B00000111,
  B00000011,
  B00000001,
  B00000000,
  
};

void setup() {
  pinMode(SER, OUTPUT);  //Arduino2番ピンを出力に設定
  pinMode(SRCLK, OUTPUT); //Arduino3番ピンを出力に設定
  pinMode(RCLK, OUTPUT);  //Arduino4番ピンを出力に設定
}
  
void loop() {
   for(int i=0; i