単色マトリックスLEDに階調をつけて擬似複数色化
赤色の8×8マトリックスLEDをArduino UNOで光らせます。単に光らせるだけでは面白くないので、赤色に階調を付けて擬似的に複数色出せるようにします。
複数色が必要なら、2色マトリックスLEDなり、フルカラーマトリックスLEDなり買えば良いのですが、今回はあえて単色マトリックスLEDです。多色のマトリックスLEDに比べると配線が増えないというメリットが一応はあります。
発光方法は、基本的にはよくある1ドット毎のダイナミック点灯ですが、暗くしたいドットは下の表のように、電流を流す(出力をHIGHにする)ことを制限することによって、赤色に階調を付けます。単純計算で、「明るい赤」は「暗い赤」の8倍明るいはず。
調整すればもっと多くの階調を作れますが、やりすぎると暗いドットがチカチカしてしまうのと、あまり階調の違いがわからなくて面白くありませんでした。
点灯サイクル | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
明るい赤 | HIGH | HIGH | HIGH | HIGH | HIGH | HIGH | HIGH | HIGH |
中間の赤 | HIGH | HIGH | HIGH | LOW | LOW | LOW | LOW | LOW |
暗い赤 | HIGH | LOW | LOW | LOW | LOW | LOW | LOW | LOW |
消灯 | LOW | LOW | LOW | LOW | LOW | LOW | LOW | LOW |
消灯+赤色3階調ではこんな感じになります。
階調が使えることで、ドット絵だって…うん、離れてみればなんとか。ちなみにこちらはマリオランドのチビボーです。
消灯+赤色7階調でグラデーションにしてみました。
もちろん動かすことも出来ます。
コードはこんな感じになります。
<code>//ピン設定
//Arduinoの2~17ピンをマトリックスLEDの1~16ピンに接続
const static byte a[8] = {10,15, 9,13, 2, 8, 3, 6};
const static byte c[8] = {14, 4, 5,11, 7,12,16,17};</code>
//表示パターン
byte testpattern[8][8] = {
{7,7,7,7,3,3,3,3},
{7,7,7,7,3,3,3,3},
{7,7,7,7,3,3,3,3},
{7,7,7,7,3,3,3,3},
{1,1,1,1,0,0,0,0},
{1,1,1,1,0,0,0,0},
{1,1,1,1,0,0,0,0},
{1,1,1,1,0,0,0,0}
};
byte t = 0;
byte x, y;
void setup() {
//ピン初期化
for (byte i=0; i<8; i++) {
pinMode(a[i], OUTPUT);
digitalWrite(a[i], LOW);
pinMode(c[i], OUTPUT);
digitalWrite(c[i], HIGH);
}
}
void loop() {
//点灯サイクル用のカウンタ
if (t>=7) {
t = 0;
} else {
t += 1;
}
//表示パターンと点灯サイクルを比較して点灯・消灯
for (x=0; x<8; x++) {
for (y=0; y<8; y++) { if (testpattern[x][y] > t) {
digitalWrite(a[x], HIGH);
digitalWrite(c[y], LOW);
} else {
digitalWrite(a[x], LOW);
digitalWrite(c[y], HIGH);
}
delayMicroseconds(5);
digitalWrite(a[x], LOW);
digitalWrite(c[y], HIGH);
}
}
}
使える色が増えると何が出来るかって言うと、例えばこんな8×8のマトリックスLEDを使ったゲームが、単色マトリックスLEDでも(頑張れば)出来るようになります。楽しそうですね。
[amazon_link asins=’B0044X2E5S,B013QV28CW’ template=’t-dilemma’ store=’tandh.work-22′ marketplace=’JP’ link_id=’fd8b1ca1-bb23-43bf-8e2b-f8a5a968ebe2′]