OSC20240310の追加情報のページ

(1) Arduino側のスケッチのソースコード

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif

#define Pin        6
#define NumPixels  28+64 // 7*4+(*8

Adafruit_NeoPixel pixels(NumPixels, Pin, NEO_GRB + NEO_KHZ800);

void setup() {
  Serial.begin(115200);
  pixels.begin();
}

void loop() {
  for (;;) {
    int c = Serial.read();
    if (c < 0)     { delay(3);       continue; }
    if (c == 0xf1) { pixels.clear(); continue; }
    if (c == 0xf2) { pixels.show();  continue; }
    if (c == 0xf3) {
      while (Serial.available() < 3) {}
      int i = Serial.read() << 8; i |= Serial.read(); // big endian.
      int n = Serial.read();
      while (n > 0) {
        while (Serial.available() < 3) {}
        int r = Serial.read();
        int g = Serial.read();
        int b = Serial.read();
        pixels.setPixelColor(i, pixels.Color(r, g, b));
        i++; n--;
      }
    }
  }
}

(2) easy-C上で動いていたLED制御アプリのソースコード

static char *mstr[3] = { "OFF  " , "ON   ", "NIGHT" };
static int tc[8] = { 0x000000, 0x000001, 0x000100, 0x000101, 0x010000, 0x010001, 0x010100, 0x010101 };
static AInt32 an[7] = { 0, 0, 0, 0, 0, 0, 0x100400 }; // RGB x7
AInt32 at[64];
int i, j, max = 0x33, col[4], mod[4], pr = ' ';
AWin *w = aOpenWin(256, 128, "OSC");
AArduino ard[1]; AArduino_initPort(ard, 4);
for (i = 0; i < 4; i++) { col[i] = max * 0x10101; mod[i] = 0; }
for (;;) {
    for (i = 0; i < 4; i++) {
        aGrPrintf(w, 0, i * 16, 0xffffff, 0x000000, "%d: #%06x %s", i + 1, col[i], mstr[mod[i]]);
    }
    aGrPrintf(w, 0, 5 * 16, 0xffffff, 0x000000, "[%c] (NCRWMT)  max=0x%02x", pr, max);
    aWait(100);
    i = aInkey(w, 1);
    if ('a' <= i && i <= 'z') { i = i - ('a' - 'A'); }
    if (i == AWinKey_Esc || AWin_isClose(w)) break;
    if (i == 'N' || i == 'C'  || i == 'R' || i == 'W' || i == ' ') { pr = i; }
    if ('1' <= i && i <= '4') {
        i = i - '1';
        if (pr == 'C') { // カラー指定コマンド.
            printf("color[#%d]=", i + 1);
            scanf("%i", &j); col[i] = j;
            pr = ' '; mod[i] = 0;
        }
        if (pr == 'R') { // ルーレットコマンド.
            for (j = 0; j < 50; j++) {
                AArduino_ledSet2(ard, i * 7, 7, tc[(j % 7) + 1] * max);
                aWait(100);
            }
            col[i] = tc[aRnd(7) + 1] * max;
            pr = ' '; mod[i] = 0;
        }
        if (pr == 'W') { // 白色コマンド.
            col[i] = 0x010101 * max;
            pr = ' '; mod[i] = 0;
        }
        if (pr == ' ') { // プリフィクスなし、照明のON/OFF.
            if (mod[i] == 1) { mod[i] = 0; } else { mod[i] = 1; }
            AArduino_ledSet2(ard, i * 7, 7, col[i] * mod[i]);
        }
        if (pr == 'N') { // 常夜灯コマンド.
            AArduino_ledSet3(ard, i * 7, 7, an);
            mod[i] = 2; pr = ' ';
        }
    }
    if (i == 'M') { // 最大輝度設定コマンド.
        j = max;
        printf("max=");
        scanf("%i", &max);
        max = aSaturateInt(max, 1, 255);
        for (i = 0; i < 4; i++) {
            int r = ((col[i] >> 16) & 255) * max / j; if (r > max) { r = max; }
            int g = ((col[i] >>  8) & 255) * max / j; if (g > max) { g = max; }
            int b = ( col[i]        & 255) * max / j; if (b > max) { b = max; }
            col[i] = aRgb8(r, g, b);
            if (mod[i] == 1) {
                AArduino_ledSet2(ard, i * 7, 7, col[i]);
            }
        }
        pr = ' ';
    }
    if (i == 'T') { // マトリクスのテストパターン表示コマンド.
        for (j = 0; j < 50; j++) {
            for (i = 0; i < 64; i++) {
                at[i] = tc[(i + j) & 7] * max;
            }
            AArduino_ledSet3(ard, 28, 64, at);
            aWait(100);
        }
        AArduino_ledSet2(ard, 28, 64, 0x000000);
        pr = ' ';
    }
}

(3) 配線のための資料

こめんと欄


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS