Arduino+74HC595+LED16個でPOV
2013.05.19 · 689 words · 2 minute read
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ランプ)
最終目標は自転車のホイールへの搭載なので、次は回転に同期させる部分を作っていきます。