2013年5月19日

Arduino+74HC595+LED16個でPOV

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

Arduinoとシフトレジスタ74HC595でLED16個を制御してPOVを作ろうという今更感漂うネタ。
実は4月末に作っていたものですが、なかなか時間がとれず今頃ブログに投稿です...


配線はこんな感じ。 #LED16個への配線で非常に見づらくなっております...


シフトレジスタ1個で8個のLEDが制御可能、2段にすると16個、3段で24個、4段で32個...と言う具合に(電源容量の限り)8の倍数ずつ増やすことができます。

プログラムは、Arduinoのチュートリアルも参考にしながら下記のような感じで。

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

word data;
word dataArray[][10] = {
  {
    0b0000000000000000,
    0b0000001111110000,
    0b0000110000001100,
    0b0001000000000010,
    0b0001000000000010,
    0b0001000000000010,
    0b0001000000000010,
    0b0000110000001100,
    0b0000001111110000,
    0b0000000000000000
  }
  ,
  {
    0b0000000000000000,
    0b0000000000000000,
    0b0000000000000000,
    0b0001000000000100,
    0b0001000000000010,
    0b0001111111111110,
    0b0001000000000000,
    0b0001000000000000,
    0b0000000000000000,
    0b0000000000000000
  }
  ,
  {
    0b0000000000000000,
    0b0001100000000100,
    0b0001010000000010,
    0b0001001000000010,
    0b0001000100000010,
    0b0001000010000010,
    0b0001000001000100,
    0b0001000000111000,
    0b0000000000000000,
    0b0000000000000000
  }
  ,
  {
    0b0000000000000000,
    0b0000100000000100,
    0b0001000001000010,
    0b0001000001000010,
    0b0001000001000010,
    0b0001000001000010,
    0b0000100010100010,
    0b0000011100011100,
    0b0000000000000000,
    0b0000000000000000
  }
  ,
  {
    0b0000000000000000,
    0b0000001100000000,
    0b0000001011000000,
    0b0000001000100000,
    0b0000001000011000,
    0b0000001000000100,
    0b0001111111111110,
    0b0000001000000000,
    0b0000001000000000,
    0b0000000000000000
  }
  ,
  {
    0b0000000000000000,
    0b0000100001111110,
    0b0001000001000010,
    0b0001000001000010,
    0b0001000001000010,
    0b0001000010000010,
    0b0000100010000010,
    0b0000011100000010,
    0b0000000000000000,
    0b0000000000000000
  }
  ,
  {
    0b0000000000000000,
    0b0000011111110000,
    0b0000100010001000,
    0b0001000001000100,
    0b0001000001000010,
    0b0001000001000010,
    0b0001000001000010,
    0b0000100010000010,
    0b0000011100000100,
    0b0000000000000000
  }
  ,
  {
    0b0000000000000000,
    0b0000000000000010,
    0b0001100000000010,
    0b0000011000000010,
    0b0000000110000010,
    0b0000000001000010,
    0b0000000000110010,
    0b0000000000001010,
    0b0000000000000110,
    0b0000000000000000
  }
  ,
  {
    0b0000000000000000,
    0b0000011100000000,
    0b0000100010111100,
    0b0001000001000010,
    0b0001000001000010,
    0b0001000001000010,
    0b0001000001000010,
    0b0000100010111100,
    0b0000011100000000,
    0b0000000000000000
  }
  ,
  {
    0b0000000000000000,
    0b0000100000111000,
    0b0001000001000100,
    0b0001000010000010,
    0b0001000010000010,
    0b0001000010000010,
    0b0000100010000010,
    0b0000010001000100,
    0b0000001111111000,
    0b0000000000000000
  }
};

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

void loop() {
  for (int i = 0; i <=9; i++){
    for (int j = 0; j <= 9; j++) {
      data = dataArray[i][j];
      digitalWrite(latchPin, 0);
      shiftOut(dataPin, clockPin, data);
      digitalWrite(latchPin, 1);
      delay(3);
    }
  }
}

void shiftOut(int myDataPin, int myClockPin, word myDataOut) {

  int i=0;
  int pinState;
  pinMode(myClockPin, OUTPUT);
  pinMode(myDataPin, OUTPUT);

  digitalWrite(myDataPin, 0);
  digitalWrite(myClockPin, 0);

  for (i=16; i>=0; i--)  {
    digitalWrite(myClockPin, 0);
    if ( myDataOut & (1<<i) ) {
      pinState= 1;
    }
    else { 
      pinState= 0;
    }
    digitalWrite(myDataPin, pinState);
    digitalWrite(myClockPin, 1);
    digitalWrite(myDataPin, 0);
  }
  digitalWrite(myClockPin, 0);
}
これで、0123456789という数字が連続して表示されるはず。


dataArrayの中身を書き換えることで、数字以外にもアルファベットや漢字、ひらがな、記号などを表示させることができます。


「Talkspace」と表示させた例 (青い点はeneloopモバイルブースターのLEDランプ)

最終目標は自転車のホイールへの搭載なので、次は回転に同期させる部分を作っていきます。