はじめに
NeoPixelと呼ばれるようなLEDをご存じでしょうか?見た目は普通のフルカラーLEDですが、その中に極小マイコンが内蔵されているため、Arduinoから制御するのに必要な信号線は1本のみ。さらに、複数個を数珠繋ぎに接続しても個別に制御できます。ライブラリも用意されているため、とても手軽に扱えます。色々な光らせ方が可能ですが、今回はこちらの動画で登場するQ8、A7、RS7のシグネチャーライト風に光らせてみたいと思います。
開発環境
- Windows 11 Home 22H2 (22621.1265)
- Arduino IDE 1.8.13
- Adafruit NeoPixel 1.11.0
部品表
いずれも秋月電子通商で入手しました。今回はESP32-WROVER-Eを使用しましたが、大抵のArduinoなら同じように動くと思います。
部品名 | 通販コード | 価格 |
---|---|---|
ESP32-WROVER-E | K-15779 | 560円 |
PL9823-F5 | I-08411 | 200円 |
ブレッドボード | P-09257 | 300円 |
ジャンパー線 | P-02315 | 300円 |
ハードウェア
NeoPixelの扱い方などはこちらが参考になります。
ソフトウェア
実際に光る様子が動画では確認しにくかったのでGIF画像を作りました。
Q8
ナイトライダー風に光ります。
ソースコード
light_signature_q8.ino
#include <Adafruit_NeoPixel.h>
#define PIXEL_COUNT 5
#define PIXEL_PIN 15
Adafruit_NeoPixel pixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
void opening() {
for (int i = 0; i < PIXEL_COUNT; i++) {
pixel.setPixelColor(i, 50, 50, 50);
pixel.show();
delay(80);
}
for (int i = PIXEL_COUNT - 1; i >= 0; i--) {
pixel.setPixelColor(i, 255, 255, 255);
pixel.setPixelColor(i + 1, 50, 50, 50);
pixel.show();
delay(80);
}
for (int i = 1; i < PIXEL_COUNT; i++) {
pixel.setPixelColor(i, 255, 255, 255);
pixel.show();
delay(80);
}
}
void ending() {
for (int i = PIXEL_COUNT - 1; i > 0; i--) {
pixel.setPixelColor(i, 50, 50, 50);
pixel.show();
delay(80);
}
for (int i = 1; i <= PIXEL_COUNT; i++) {
pixel.setPixelColor(i, 255, 255, 255);
pixel.setPixelColor(i - 1, 50, 50, 50);
pixel.show();
delay(80);
}
for (int i = PIXEL_COUNT - 1; i >= 0; i--) {
pixel.setPixelColor(i, 0);
pixel.show();
delay(80);
}
}
void setup() {
pixel.begin();
pixel.setBrightness(100);
pixel.clear();
pixel.show(); //turn off all pixels
}
void loop() {
opening();
delay(2000);
//ending();
//delay(2000);
}
A7
先程の光らせ方に似ていますが、こちらは残像みたいな演出がありません。
ソースコード
light_signature_a7.ino
#include <Adafruit_NeoPixel.h>
#define PIXEL_COUNT 5
#define PIXEL_PIN 15
Adafruit_NeoPixel pixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
void opening() {
for (int i = 0; i < PIXEL_COUNT; i++) {
pixel.setPixelColor(i, 50, 50, 50);
pixel.setPixelColor(i - 1, 0);
pixel.show();
delay(80);
}
for (int i = PIXEL_COUNT - 1; i > 0; i--) {
pixel.setPixelColor(i - 1, 50, 50, 50);
pixel.setPixelColor(i, 0);
pixel.show();
delay(80);
}
for (int i = 1; i < PIXEL_COUNT; i++) {
pixel.setPixelColor(i, 50, 50, 50);
pixel.show();
delay(80);
}
delay(100);
for (int i = 50; i <= 255; i++) {
for (int j = 0; j < PIXEL_COUNT; j++) {
pixel.setPixelColor(j, i, i, i);
}
pixel.show();
delay(5);
}
}
void ending() {
for (int i = 255; i >= 50; i--) {
for (int j = 0; j < PIXEL_COUNT; j++) {
pixel.setPixelColor(j, i, i, i);
}
pixel.show();
delay(5);
}
delay(100);
for (int i = PIXEL_COUNT - 1; i > 0; i--) {
pixel.setPixelColor(i, 0);
pixel.show();
delay(80);
}
for (int i = 1; i < PIXEL_COUNT; i++) {
pixel.setPixelColor(i, 50, 50, 50);
pixel.setPixelColor(i - 1, 0);
pixel.show();
delay(80);
}
for (int i = PIXEL_COUNT - 1; i >= 0; i--) {
pixel.setPixelColor(i - 1, 50, 50, 50);
pixel.setPixelColor(i, 0);
pixel.show();
delay(80);
}
}
void setup() {
pixel.begin();
pixel.setBrightness(100);
pixel.clear();
pixel.show(); //turn off all pixels
}
void loop() {
opening();
delay(2000);
//ending();
//delay(2000);
}
RS7
ゲージが溜まっていくような演出です。
ソースコード
light_signature_rs7.ino
#include <Adafruit_NeoPixel.h>
#define PIXEL_COUNT 5
#define PIXEL_PIN 15
Adafruit_NeoPixel pixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
void openingRS() {
for (int i = PIXEL_COUNT; i > 0; i--) {
for (int j = 0; j < i; j++) {
pixel.setPixelColor(j, 50, 50, 50);
pixel.setPixelColor(j - 1, 0);
pixel.show();
delay(40 + (i - 1) * 10);
}
}
delay(40);
for (int i = 0; i <= PIXEL_COUNT; i++) {
pixel.setPixelColor(i, 255, 255, 255);
pixel.setPixelColor(i - 1, 50, 50, 50);
pixel.show();
delay(50);
}
delay(100);
for (int i = 50; i <= 255; i++) {
for (int j = 0; j < PIXEL_COUNT; j++) {
pixel.setPixelColor(j, i, i, i);
}
pixel.show();
delay(5);
}
}
void endingRS() {
for (int i = 255; i >= 50; i--) {
for (int j = 0; j < PIXEL_COUNT; j++) {
pixel.setPixelColor(j, i, i, i);
}
pixel.show();
delay(5);
}
delay(100);
for (int i = 0; i < PIXEL_COUNT; i++) {
for (int j = i; j >= 0; j--) {
pixel.setPixelColor(j, 0);
pixel.setPixelColor(j - 1, 50, 50, 50);
pixel.show();
delay(40 + i * 10);
}
}
}
void setup() {
pixel.begin();
pixel.setBrightness(100);
pixel.clear();
pixel.show(); //turn off all pixels
}
void loop() {
openingRS();
delay(2000);
//endingRS();
//delay(2000);
}
おわりに
自作デバイスの起動時、終了時の演出などに使えそうです。