8×8ドットマトリックス4連(1)
以前、8×8ドットマトリックスいじりましたが、今回、大きいのも欲しくなって衝動買いしました。
ピンの本数は同じく5本。じゃあ、前に8×8一つででやった信号をそのまま出力するとどうなるのかな? この時のコード
でやってみました。
4つそれぞれに同じ内容が表示されるわけですね。
もちろん、四つを区別して使いたいわけです。使用しているライブラリLedControl.h のスケッチ例の中に
LCDemoCascadedDevicesというのがあるので見てみますと、
要は1個のときは
LedControl display = LedControl(DIN_PIN, CLK_PIN, CS_PIN);
と宣言していたのを、4番目の引数にデバイスの個数をセットすればよい。
LedControl display = LedControl(DIN_PIN, CLK_PIN, CS_PIN, 4);
そして、制御は、1個の時は
display.clearDisplay(0);
display.shutdown(0, false);
display.setIntensity(0, 1);
display.setLed(0, i, j,x);//xは1または0
等と書いていたわけですが、最初の引数がデバイス番号なので、 0,1,2,3と切り替えていけばデバイスを区別して利用できるというわけです。
では、デモを改造してみます。
#include <LedControl.h>
const int DIN_PIN = 7;
const int CS_PIN = 6;
const int CLK_PIN = 5;
const int DEVICES = 4;
const byte IMAGES[][8] = {
{//T
B11111100,
B10110100,
B00110000,
B00110000,
B00110000,
B00110000,
B01111000,
B00000000
},{//A
B00110000,
B01111000,
B11001100,
B11001100,
B11111100,
B11001100,
B11001100,
B00000000
},{//I
B01111000,
B00110000,
B00110000,
B00110000,
B00110000,
B00110000,
B01111000,
B00000000
},{//W
B11000110,
B11000110,
B11000110,
B11010110,
B11111110,
B11101110,
B11000110,
B00000000
},{//A
B00110000,
B01111000,
B11001100,
B11001100,
B11111100,
B11001100,
B11001100,
B00000000
},{//N
B11000110,
B11100110,
B11110110,
B11011110,
B11001110,
B11000110,
B11000110,
B00000000
},{//音符
B00000000,
B00011000,
B00010100,
B00010000,
B00010000,
B00110000,
B01110000,
B01100000
}};
const int IMAGES_LEN = sizeof(IMAGES)/8;
LedControl display = LedControl(DIN_PIN, CLK_PIN, CS_PIN, DEVICES);
void setup() {
int devices = display.getDeviceCount();
for(int address=0;address<devices;address++) {
display.shutdown(address,false);
display.setIntensity(address,0);
display.clearDisplay(address);
}
}
void displayImage(int device,const byte* image) {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
display.setLed(device , i, j, bitRead(image[i], 7 - j));
}
}
}
int i = 0;
int dev =0;
void loop() {
displayImage(dev, IMAGES[i]);
if (++i >= IMAGES_LEN ) {
i = 0;
}
if (++dev >= 4){
dev = 0;
}
delay(500);
}
実行すると
表示順が変ですけど、このテストで制御の「順番」がわかったので次は16×16の全面を使った表示を試してみたいと思います。