« Arduinoで作ろう(54) 74HC595 を使ってLチカ | トップページ | Arduinoで作ろう(56) 16個のLEDでバーサライタ »

2021年12月22日 (水)

Arduinoで作ろう(55) 74HC595のカスケード接続

74hc595_16led_2

 74HC595を2個, カスケード接続 (多段接続) してLED16個の制御をやってみました。
上図の左側,1個めの74HC595の9ピン(カスケード用シリアル出力) と右の2個めの74HC595の14ピン(シリアルデータ入力) をつないでやります。
そうすると,1個めに入力されたデータが9ピンから出て,2個めの14ピンに流れていくわけです。74HC595をこうやってどんどんカスケード接続していけば,大量のLEDが制御できるっていう仕掛け。おもしろいですなあ。

Cimg9799

fritzingの図では省略してありますが,LEDの電流制限抵抗はちゃんとつけてあります。LEDの足を短く切って,抵抗をハンダづけしてあります。上の写真を見ると分かりますよね。

// 74HC595のカスケード接続 16個のLED 順送り点灯

#define SDI   8
#define LAT   9
#define CLK 10
int bitmap[] = {
 0b0000000000000000,
 0b1000000000000000,
 0b1100000000000000,
 0b1110000000000000,
 0b1111000000000000,
 0b1111100000000000,
 0b0111110000000000,
 0b0011111000000000,
 0b0001111100000000,
 0b0000111110000000,
 0b0000011111000000,
 0b0000001111100000,
 0b0000000111110000,
 0b0000000011111000,
 0b0000000001111100,
 0b0000000000111110,
 0b0000000000011111,
 0b0000000000001111,
 0b0000000000000111,
 0b0000000000000011,
 0b0000000000000001,
};
 
void setup() {
 pinMode( SDI, OUTPUT );
 pinMode( LAT, OUTPUT );
 pinMode( CLK, OUTPUT );
}

void loop() {
 for ( int i=0; i<sizeof(bitmap)/sizeof(int); i++ ) {
  digitalWrite( LAT, LOW );
  shiftOut( SDI, CLK, LSBFIRST, bitmap[i] );
  shiftOut( SDI, CLK, LSBFIRST, bitmap[i]>>8 );
  digitalWrite( LAT, HIGH );
  delay(100);
 }
}

16個のLEDの点滅データですから 1行分のデータは16ビットですが,shiftOut関数は1回で8ビットのデータしか送出できません。
そこで,1回目で下8桁のデータを送出し,2回目はデータを8ビット分右シフトしてから上8桁のデータを送出してやります。

shiftOut( SDI, CLK, LSBFIRST, bitmap[i] );
shiftOut( SDI, CLK, LSBFIRST, bitmap[i]>>8 );

これで,16ビットの点滅データを16個のLEDに反映させることができます。

| |

« Arduinoで作ろう(54) 74HC595 を使ってLチカ | トップページ | Arduinoで作ろう(56) 16個のLEDでバーサライタ »

Arduino」カテゴリの記事