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ランプ)
最終目標は自転車のホイールへの搭載なので、次は回転に同期させる部分を作っていきます。