8×8のNeoPixel(フルカラーLED)を並べた小型ボードです。
USB接続でRP2040マイコンへプログラムを書き込むことで、多彩なLED演出が簡単に楽しめます。
マイコンには余裕のあるメモリを搭載しており、カスタム表示ができますね。
電源は5V昇圧回路付きで、単三電池2本を使えばパソコン不要で光らせることができ、持ち歩きや展示にもぴったりです。
-
ハードウェアの主な特長
-
RP2040マイコンを搭載しているので、豊富なライブラリを活用してLED制御もラクラク!
-
本体にはプッシュスイッチが2個付いており、表示モードの切り替えなどインタラクティブな操作が可能です。
-
電源まわりには5V昇圧回路を採用。基板背面には電池ボックスを備えているので、単体でも動作でき、持ち運びにも便利です。
-
回路詳細
マイコン周辺ブロック
外部入力対応で操作の幅が広がる!
本製品はRP2040系のマイコンを使用しており、安定した制御と豊富なライブラリに対応しています。
GP6・GP7端子には、チャタリング防止回路付きの外部プッシュスイッチが接続されており、外部からの入力操作が可能です。
モード切り替えやインタラクティブな制御など、自分好みに動きを変える楽しみが広がります!
昇圧回路ブロック
電源まわりのポイント
- スイッチは、単三電池からの電源供給をオン・オフするためのものです。
- 5V昇圧回路を搭載しており、安定した電圧でLEDなどの動作が可能です。
- LED1は昇圧状態やUSB接続時の動作を示すインジケーターLEDです。昇圧回路が動作しているとき、またはUSB接続時に点灯します。
- J3にははんだショート用ランドを用意しています。こちらをショート(接続)しないと、電池からの電源供給が行えませんのでご注意ください。
LEDブロック
NeoPixelの接続について
本製品では、NeoPixel(フルカラーLED)を直列(シリーズ)接続しています。
電源(5V)、GND、信号線の各1本だけでつなぐことができる「デイジーチェーン方式」を採用しており、配線がシンプルで扱いやすくなっています。
この構成により、LEDが順番に制御され、多彩な光り方を手軽に楽しめます!
秘密の回路
オーディオ入力機能(開発中)
本製品には、コンデンサマイク/オペアンプ/ハイパスフィルタといった音声入力回路を試験的に搭載しています。
構成としては、マイクの音声信号をオペアンプで増幅し、DC成分を除去するハイパスフィルタを通したうえで、マイコンのGP26端子(ADコンバータ)に入力される仕組みです。
音声信号の解析や反応制御(カラーLEDでイコライザーのような表示)などの応用も検討されています。
現在は増幅動作が未確認のため、この機能は開発中・非対応となっております。
今後の改良により、音声に反応するような楽しい演出が追加される可能性もありますので、どうぞご期待ください!
商品画像
カラフルで癒しのLED演出
本製品では、NeoPixel(フルカラーLED)を自由に制御でき、豊かな色合いと滑らかな動きが楽しめます。
眺めているだけでも、やさしい光が癒しを届けてくれるような演出に。
プログラム次第で点滅・グラデーション・パターン表示なども自在にアレンジできます。
自分だけの光のデザインを作ってみませんか?
サンプルプログラム
#include <Adafruit_NeoPixel.h>
#define LED_PIN 8
#define NUM_LEDS 64
#define NUM_FLASHING_LEDS 24
#define BRIGHTNESS 16 // やさしい光の明るさ
#define BUTTON_PIN 7 // GP7(モード切替スイッチ)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
uint32_t colors[] = {
strip.Color(0, 128, 128), // 青系(リラックス)
strip.Color(255, 105, 180), // ピンク(やさしさ)
strip.Color(0, 255, 0), // グリーン(自然)
strip.Color(255, 255, 0) // イエロー(ぬくもり)
};
int mode = 0;
int flashCount = 0;
int colorIndex = 0;
bool lastButtonState = true;
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 30;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
strip.begin();
strip.setBrightness(BRIGHTNESS);
strip.show();
}
bool checkButton() {
bool currentButtonState = digitalRead(BUTTON_PIN);
if (!lastButtonState && currentButtonState &&
(millis() - lastDebounceTime > debounceDelay)) {
lastDebounceTime = millis();
lastButtonState = currentButtonState;
mode = (mode + 1) % 4;
// モード切り替え時にやさしくリセット
strip.clear();
strip.show();
return true;
}
lastButtonState = currentButtonState;
return false;
}
void loop() {
switch (mode) {
case 0: randomFade(); break;
case 1: gentleWaves(); break;
case 2: slowFlow(); break;
case 3: softBreath(); break;
}
}
// モード0:やさしいランダム点灯
void randomFade() {
int flashingIndices[NUM_FLASHING_LEDS];
for (int i = 0; i < NUM_FLASHING_LEDS; i++) {
flashingIndices[i] = random(NUM_LEDS);
}
for (int b = 0; b <= 128; b++) {
if (checkButton()) return;
for (int i = 0; i < NUM_FLASHING_LEDS; i++) {
strip.setPixelColor(flashingIndices[i], dimColor(colors[colorIndex], b));
}
strip.show(); delay(12);
}
delay(500);
for (int b = 128; b >= 0; b--) {
if (checkButton()) return;
for (int i = 0; i < NUM_FLASHING_LEDS; i++) {
strip.setPixelColor(flashingIndices[i], dimColor(colors[colorIndex], b));
}
strip.show(); delay(12);
}
delay(500);
updateColor();
}
// モード1:ゆらめく波のような優しい変化
void gentleWaves() {
for (int j = 0; j < 3; j++) {
for (int p = 0; p < 128; p += 1) {
if (checkButton()) return;
for (int i = 0; i < NUM_LEDS; i++) {
int wave = (sin((i + p) * 0.15) + 1) * 64;
strip.setPixelColor(i, dimColor(colors[colorIndex], wave));
}
strip.show(); delay(35);
}
updateColor();
}
}
// モード2:ゆったりとした流れの光
void slowFlow() {
const int trailLength = 5; // 残像(尾)の長さ
for (int j = 0; j < 3; j++) {
for (int head = 0; head < NUM_LEDS + trailLength; head++) {
if (checkButton()) return;
strip.clear();
// 尾を描画:フェードした色で
for (int t = 0; t < trailLength; t++) {
int idx = head - t;
if (idx >= 0 && idx < NUM_LEDS) {
uint8_t fade = 128 - (t * (128 / trailLength)); // 明るさを徐々に減衰
strip.setPixelColor(idx, dimColor(colors[colorIndex], fade));
}
}
strip.show();
delay(50); // ゆったり移動
}
updateColor();
}
}
// モード3:光が呼吸するような点滅
void softBreath() {
for (int j = 0; j < 3; j++) {
for (int b = 0; b <= 128; b += 1) {
if (checkButton()) return;
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, dimColor(colors[colorIndex], b));
}
strip.show(); delay(25);
}
for (int b = 128; b >= 0; b -= 1) {
if (checkButton()) return;
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, dimColor(colors[colorIndex], b));
}
strip.show(); delay(25);
}
updateColor();
}
}
// 色を切り替える共通関数(3回で次の色)
void updateColor() {
flashCount++;
if (flashCount >= 3) {
flashCount = 0;
colorIndex = (colorIndex + 1) % 4;
}
}
// 指定色を明るさで調整する関数
uint32_t dimColor(uint32_t color, uint8_t brightness) {
uint8_t r = ((color >> 16) & 0xFF) * brightness / 128;
uint8_t g = ((color >> 8) & 0xFF) * brightness / 128;
uint8_t b = (color & 0xFF) * brightness / 128;
return strip.Color(r, g, b);
}
NeoPixel 癒しエフェクトボード
スイッチ(PSW1)ひとつで、色と光の動きがどんどん変わっていく“癒し系Lチカ”です
-
4つのモードを順番に楽しめる!
ボタンをポチッと押すだけで、光り方がチェンジ!
ふわっと点滅:ゆっくり光って…ふわっと消える。ランダム点灯でリラックス感満載!
ゆらゆら波モード:光が波打つようにゆれて癒し効果!
ながれる流星モード:光がスーッと移動して、軌跡を残す!見てるだけで願い事したくなるかも?
呼吸する光モード:全体がふーっと明るくなって、そっと暗くなる。まるで光が呼吸してるみたい! -
カラーは「青 → ピンク → グリーン → イエロー」と、やさしい色味でぐるぐる変化
3回ずつ動くたびに次のカラーにチェンジするので、ずっと見てても飽きないんです! -
電池で動くから持ち運びもラクラク。癒しアイテムとしても、展示用の演出としてもバッチリ
-
プログラムはArduinoベースで書かれているので、色の順番や光の速度もカスタマイズ可能。
-
LEDの順番
本製品のLEDは、左上から下方向へ順番に並んでいます。
1列ごとに右へスライドしながら、同じように上から下へ配置されていくので、全体は“縦→右→縦…”の流れになっています
この順番が、光の演出やアニメーションの割り当てにも関わってくるので、
プログラムする際は配置順を参考にしていただくと、狙った動きが実現しやすくなります
ちょっとしたヒントですが、流れる光や波打つ動きをデザインする際にも、配置順を活かすとより魅力的な表現ができますよ!