現時点(2014/12/11)では一般発売されていないものの、MakerFairTokyoにて入手できた
スイッチサイエンスの8×8 LED Matrix のテスト。サンプルのページ(すみません、その後ページが見つからない)を参考に作ってみた。
このLEDマトリクス、Groveコネクタ経由で直接スイッチサイエンス版Eagletに接続することができるので、場合によってはArduino互換基板と各種シールドを使うよりも手軽にEdisonを使って何か表現することができる。とても便利だ。
I2Cで接続なのでMRAAを使用すれば簡単に制御できるが、8×8のLEDが表示されているように見せるためにはソフト上で8個ずつダイナミック点灯するようコマンドを送り続けなければならない。
普通のArduinoであればタイマー割り込みを使って表示すると便利だと思うが、EdisonはLinuxベースなので、表示専用のスレッドを使って表示させてみた。タイミングに微妙な時間のばらつきが生じるためか、若干輝度の変動があるが、実用上は問題ないだろう。
#include <stdio.h>
#include "mraa.hpp"
#define LOWBYTE(v) ((unsigned char) (v))
#define HIGHBYTE(v) ((unsigned char) (((unsigned int) (v)) >> 8))
void initLed();
void *showLed(void *arg);
unsigned char led[8][8];
mraa::I2c* i2c;
pthread_t thread_showLed;
int main() {
int i,j;
i2c = new mraa::I2c(6);
i2c->address(0x50);
initLed();
pthread_create(&thread_showLed, NULL, showLed, NULL);
while(1) {
for(i=0; i<8; i++) {
for(j=0; j<8; j++) {
int n;
for(n=0; n<256; n+=1) {
led[i][j] = n;
usleep(1000);
}
for(n=255; n>=0; n-=1) {
led[i][j] = n;
usleep(1000);
}
led[i][j] = 0;
}
}
}
}
void initLed() {
int i,j;
char init[] = {0x80, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x00};
i2c->write(init, 21);
for(i=0; i<8; i++) {
for(j=0; j<8; j++) {
led[i][j] = 0;
}
}
}
void *showLed(void *arg) {
int i,j;
unsigned int row,column;
char buff[9];
while(1) {
for(i=0; i<8; i++) {
// write PWM duty
buff[0] = 0x8a; // register address
for(j=0; j<8; j++) {
buff[8-j] = led[i][j];
}
i2c->write(buff,9);
// write on/off
buff[0] = 0x94; // register address
row = 0x0002 << (i * 2);
buff[2] = HIGHBYTE(row);
buff[1] = LOWBYTE(row);
column = 0;
for(j=0; j<8; j++) {
if(led[i][j]) {
column |= (0x8000 >> (j * 2));
}
}
buff[4] = HIGHBYTE(column);
buff[3] = LOWBYTE(column);
i2c->write(buff,5);
usleep(1000);
}
}
}
void *showLed() が、led[8][8]という配列の情報を実際のLEDマトリクスに表示するためのスレッド。この配列に輝度のデータ(0〜255)を書き込むことで表示されるようにしている。メインルーチンでは、まずLEDマトリクスを初期化したのち、表示用スレッドを起動し、あとはled[8][8]の配列に順番にデータを書き込んでいる。
コンパイル時には、MRAAとともにpthreadをリンクする必要がある。具体的には以下のコマンド(ソースはledtest.cppというファイル名とする)
g++ ledtest.cpp -lmraa -lpthread
あとは普通に ./a.out で、順番にLEDが点灯する。
スポンサーサイト