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) 配線のための資料
こめんと欄