2013年9月17日火曜日

続々・Arduino はじめました

さて、前回は LED を見事に焦がしてしまいましたが、
今回は、LEDマトリックスが届いたので、シフトレジスタも買って LED 光らせたので、そのご報告でございます。

シフトレジスタ
今回買ったのは 74HC595 です。
74HC595 を選んだ理由は、チュートリアルで使わていたからです。

というわけで、チュートリアルを見ながら制御してみました。
特につまずくところはありませんでした。
チュートリアルの通りに配線して、サンプルのコードをコピペですぐにできました。

(写真は撮り忘れたので割愛)
//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;

void setup() {
  //set pins to output so you can control the shift register
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  // count from 0 to 255 and display the number 
  // on the LEDs
  for (int numberToDisplay = 0; numberToDisplay < 256; numberToDisplay++) {
    // take the latchPin low so 
    // the LEDs don't change while you're sending in bits:
    digitalWrite(latchPin, LOW);
    // shift out the bits:
    shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay);  

    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    // pause before next value:
    delay(500);
  }
}

LED マトリックス点灯式
マトリックスの資料を見たら 5V って書いてあったので、大丈夫だろとぶっ刺しました。
(前回の反省が活かされていませんね…ゾクゾクしますね…)

アノード側にシフトレジスタからの出力をつなぎます。
とりあえず全部点灯でいいのでカソード側を GND に繋ぎました。


点いた\(^o^)/

ダイナミック点灯
さて、このままでは1行/1列ずつしか LED を制御できません。

一個一個の LED を制御するためにダイナミック点灯制御を行います。
ダイナミック点灯は、1つ(1列)ずつ点灯・消灯の操作をものすごく速いスピードでやることで、
人間の目にはすべての LED が同時に制御されているかのように見せる方法です。

シフトレジスタで 1bit ずつ出力するようにずらしながら、(制御ラインの選択)
もう一方の線で LED の ON/OFF を制御します。

int latchPin = 8;  // 74HC595のST_CPへ
int clockPin = 12; // 74HC595のSH_CPへ
int dataPin = 11;  // 74HC595のDSへ
int ledPin = 13;

void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
}
 
void loop() {
  // LED1からLED8までを順に光らせます
  for (int j = 0; j < 16; j++) {
    // 送信中のlatchPinはグランド(LOW)レベル
    digitalWrite(latchPin, LOW);
    // シフト演算を使って点灯するLEDを選択しています
    shiftOut(dataPin, clockPin, LSBFIRST, (1<<j)>>8);
    shiftOut(dataPin, clockPin, LSBFIRST, 1<<j);
    if( j % 2 == 0 ) {
      digitalWrite(ledPin, LOW);
    } else {
      digitalWrite(ledPin, HIGH);
    }
    // 送信終了後latchPinをHIGHにする
    digitalWrite(latchPin, HIGH);
    delay(100);
  }
}

1行だけですが、飛び飛びに LED を光らせることに成功しました~


デイジーチェーン
シフトレジスタ(74HC595) を複数つなげることで、少ないピンでよりたくさんの LED を制御できるようになります。
74HC595 の Serial Out ピンからの出力をつなげるもう1つの 74HC595 の Serial data input ピンにつなげてやります。

詳しくは、チュートリアルの Exsample2 を参照してください。

これにより、3本の制御線で 16個、24個、32個... の LED を制御できるようになります。
すごいですねぇ~

今回の LEDマトリックスは 48ピンですので、シフトレジスタが 6個必要になります。
アノード制御と赤色/緑色LED の制御にそれぞれ 16ピンずつ使い、それぞれ独立して制御しようと思っているので、
シフトレジスタを2個ずつ、デイジーチェーンでつなげました。



これで、単純計算で 6 x 3 の 18本必要だった線が、3 x 3 の 9本で済みました。

次回
次は TLC5940 を使って調光をできるようにしたいなぁと思っていたのですが、
時間があまりないので全部シフトレジスタで制御するようにして、
実コードを書いていきたいと思います。

では。

0 件のコメント:

コメントを投稿