RP2040マイコンを使って、NeoPixelを制御して楽しもうというコンセプトです。
プッシュボタンが1つ or 2つ搭載しているので、外部入力または切り替えなどで使えます。
ArduinoIDE バージョン:2.3.2
Adafruit NeoPixel Library 1.12.2
①マイコン:PR2040-ZERO(RaspberryPiPico系)
②NeoPixel接続ピン GPI08(R1でショート)
③プッシュスイッチ1:GPI07
④プッシュスイッチ2:GPI06(2個搭載しているボードのみ)
⑤音声入力:GP26
ボタンを使ってLED表示を切り替える動作確認用サンプルプログラムです。
ボタンの状態をモニタして、押されたら切り替えを確認できます。
状態を変化させたい時の切り替えの参考にしていただけたらと思います。
// ボタンのテスト
#include <Adafruit_NeoPixel.h>
// 定数の定義
#define BUTTON1_PIN 7 // ボタン1のピン番号
#define BUTTON2_PIN 6 // ボタン2のピン番号
#define NEOPIXEL_PIN 8 // NeoPixelのピン番号
#define NUMPIXELS 36 // NeoPixelのLEDの数
#define BRIGHTNESS 32 // NeoPixelの明るさ
// NeoPixelオブジェクトの作成
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, NEOPIXEL_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
// ボタンピンの設定
pinMode(BUTTON1_PIN, INPUT); // ボタン1を入力に設定
pinMode(BUTTON2_PIN, INPUT); // ボタン2を入力に設定
// NeoPixelの初期化
strip.begin(); // NeoPixelの初期化
strip.setBrightness(BRIGHTNESS); // 明るさの設定
setNeoPixelColor(strip.Color(0, 255, 0)); // 初期状態で緑色に設定
}
void loop() {
// ボタンの状態を読み取る
int button1State = digitalRead(BUTTON1_PIN); // ボタン1の状態を読み取る
int button2State = digitalRead(BUTTON2_PIN); // ボタン2の状態を読み取る
// 両方のボタンがHIGHの場合は何もしない
if (button1State == HIGH && button2State == HIGH) {
delay(100); // 状態を読み取る間隔を調整
return;
}
// 両方のボタンが押された場合
if (button1State == LOW && button2State == LOW) {
setNeoPixelColor(strip.Color(0, 255, 0)); // 緑に設定
}
// ボタン1が押された場合
else if (button1State == LOW) {
setNeoPixelColor(strip.Color(255, 105, 180)); // ピンクに設定
}
// ボタン2が押された場合
else if (button2State == LOW) {
setNeoPixelColor(strip.Color(0, 255, 255)); // 水色に設定
}
delay(100); // 状態を読み取る間隔を調整
}
// NeoPixelの色を設定する関数
void setNeoPixelColor(uint32_t color) {
for (int i = 0; i < NUMPIXELS; i++) {
strip.setPixelColor(i, color); // 各LEDの色を設定
}
strip.show(); // 設定した色を表示
}
入力端子をプルアップ抵抗に設定でも良さそうですが、外付けの100kΩと
並列になるのでチャタリング除去の効果が変換するので注意が必要ですね。
pinMode(BUTTON1_PIN, INPUT_PULLUP); // ボタン1をプルアップ入力に設定
pinMode(BUTTON2_PIN, INPUT_PULLUP); // ボタン2をプルアップ入力に設定
ボタンを押したら状態が変わる例です。
初期状態は、グリーン。
ボタン1を押したら、ピンク。
ボタン2を押したら、ブルー。
ボタンを両方押したら、グリーンに戻るのですが離した瞬間にボタンが
片方LO判定になってしまう恐れがあるので工夫が必要そうですね。