fc2ブログ

773mbar

2023年11月 ≪  12345678910111213141516171819202122232425262728293031 ≫ 2024年01月
TOP ≫ CATEGORY ≫ Intel Edison
CATEGORY ≫ Intel Edison
      

Edison + LED Matrixのテスト

現時点(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が点灯する。




スポンサーサイト



Intel Edison | Comments(0) | Trackbacks(-)

Edison

Edisonを購入した。

Galileoは、その後Gen2もリリースされたが、それまではなんかいまひとつインテルの「やる気」が感じられなかった(主観です)。
Edisonが発表された時は特に買ってみようとは思わなかったのだが、発表当初のSDカードサイズから形が変わって発売され、そしてその後にEagletが発表されてから「これは面白そうだ」と思った。 Galileoはその形でGalileoだ。しかしEdisonは、とにかく小さく作り、それを取り付ける基板によって性格が変わってく。Arduinoに慣れた人、シールドを使いたい人のための互換ボード、Edisonをガチで使いたいという人のためのBreakout Boardという2種類の基板をスタートとして、EdisonのコネクタでスタックできるSparkFunの各種基板、そしてMakerFair Tokyo2014でスイッチサイエンスが発売したMFT版Eaglet。…その後もいろいろ出てくるかもしれない。
このEagletに興味を持ち、MakerFairの前日に秋月でEdisonを購入(せっかくなのでArduino互換を買った)、そしてMakerFairで運良くEagletを購入でき、その時にどうせなら…と、Edison単体を購入…しようと思って、いやいやどうせなら…と思ってBreakout Board付きを購入してしまった。

ってことで今、手元には2個のEdisonがある。 いざ使ってみると、今度はインテルの「やる気」が感じられる。 Galileoの時は乏しかった開発関係の情報もいろいろあり、c++コンパイラも最初から入ってるのでターミナルでログインしてvi等でソース書いてコンパイルも可能、さらにEclipseの開発環境も用意されている。Galileoに比較して開発関係のハードルは格段に低くなった。
あとは、これを乗せられる基板やシステムが、どのようなものが出てくるか楽しみだ。それ次第で応用もとても広くなると思う。

たぶん出てくるだろうものが、Raspberry Piと同じ大きさ、同じインターフェースコネクタを持った基板(笑)
Intel Edison | Comments(0) | Trackbacks(-)