Arduino 및 8비트 시프트 레지스터로 LED 제어

시프트 레지스터란?





한마디로 설명하면 "적은 핀으로 더 많이 출력할 수 있다"
Arduino의 경우 GPIO의 수가 한정되어 있으므로, 시프트 레지스터를 사용하는 것으로 배선이 깨끗이라고 생각합니다.
작동 원리를 이해하는 것은 어렵지만 먼저 손을 움직여 확인합시다.
이 기사가 매우 유용합니다.

LED를 제어해보기



배선도는 아래와 같습니다. 3선의 출력으로 8개의 LED를 제어하고 있습니다


우선은 1개만 점등하는 코드
#define SRCLK   (5)//シフトレジスタのクロック信号
#define RCLK    (6)//ストレージレジスタのクロック信号
#define SER     (7)//シリアル入力

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

  byte b = B00000001;

  digitalWrite(RCLK, LOW);
  shiftOut(SER, SRCLK, LSBFIRST , b);
  digitalWrite(RCLK, HIGH);

}

void loop() {

}

연속으로 켜지는 코드
#define SRCLK   (5)//シフトレジスタのクロック信号
#define RCLK    (6)//ストレージレジスタのクロック信号
#define SER     (7)//シリアル入力

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

// パターン
const uint8_t PATTERNS[] = {
  0b00000001,
  0b00000010,
  0b00000100,
  0b00001000,
  0b00010000,
  0b00100000,
  0b01000000,
  0b10000000,
};

void loop() {

  // パターンの数
  int pattern_num = sizeof(PATTERNS)/sizeof(PATTERNS[0]);

  for (uint8_t i=0; i<pattern_num; i++) {
    // 8ビット分のデータをシフトレジスタへ送る
    shiftOut(SER, SRCLK, LSBFIRST, PATTERNS[i]); 

    // シフトレジスタの状態をストレージレジスタへ反映させる
    digitalWrite(RCLK,  LOW);
    digitalWrite(RCLK,  HIGH);

    delay(500);
  }
}

좋은 웹페이지 즐겨찾기