<はじめに>
ALGYAN8周年オリジナル基板(XIAOGYANO)で、電子ピアノ(キーボード)を作るのに挑戦しました。
この基板は、あらかじめいろいろな部品が載っている基板で、サンプルプログラムのテストを行えます。
今回は、XIAOGYANのサンプルコードの中の、HardwareTestというプログラムを使って、4ボタンのキーボードを作ってみました。
そして、8キーの電子ピアノ(キーボード)に挑戦しました。
<もくじ>
①はじめに
②もくじ
③4ボタンのキーボード製作
④4ボタンキーボードのプログラム
⑤電子(ピアノ)キーボード製作
⑥終わりに
<4ボタンのキーボード製作>
1-1 部品表
部品名 | 型式 | メーカー | 数量 |
---|---|---|---|
マイコン | XIAO ESP32C3 | Seeed Studio | 1 |
XIAOGYANプレゼント基板 | 8周年オリジナルIoTデバイス「XIAOGYAN」 | IoT ALGYAN | 1 |
ブレッドボード | 8cm×5.5cm | 自作加工 | 1 |
ボタンスイッチ | 1.1cm×1.1cm | 不明 | 4 |
5線平行ケーブル | 10cm | 不明 | 1 |
1-5 4ボタンキーボードの動画
4ボタンキーボードの動画はこちらです。
<4ボタンのキーボードのプログラム>
/*
* main.cpp
* Copyright (C) 2023 MATSUOKA Takashi <matsujirushi@live.jp>
* MIT License
*/
////////////////////////////////////////////////////////////////////////////////
// Includes
#include <Arduino.h>
#include <elapsedMillis.h>
#include "Xiaogyan.hpp"
////////////////////////////////////////////////////////////////////////////////
// Variables
static int EncoderValue_ = 5;
// buttonC_buttonD_setup
GpioInputPin<D5> buttonC;
GpioInputPin<D4> buttonD;
buttonC.begin(INPUT_PULLUP);
buttonD.begin(INPUT_PULLUP);
//if (Xiaogyan.buttonA.read() == LOW) ...;
//if (Xiaogyan.buttonB.read() == LOW) ...;
//if (buttonC.read() == LOW) ...;
//if (buttonD.read() == LOW) ...;
////////////////////////////////////////////////////////////////////////////////
// setup and loop
void setup()
{
Serial.begin(115200);
delay(1000);
Serial.println();
Serial.println();
////////////////////////////////////////
// Initialize
// XIAOGYANライブラリを初期化。
Xiaogyan.begin();
// ロータリーエンコーダを回転したときに、EncoderValue_を増加/減少する。
// (EncoderValue_は0~19の範囲内。)
Xiaogyan.encoder.setRotatedHandler([](bool cw){
const int value = EncoderValue_ + (cw ? -1 : 1);
EncoderValue_ = constrain(value, 0, 19);
Serial.println(EncoderValue_);
});
////////////////////////////////////////
// Startup Sequence
// 「ド」音を鳴らす。
Xiaogyan.speaker.setTone(262); // C4
// LEDマトリックスを全て赤色点灯。
Xiaogyan.ledMatrix.setBrightness(2);
Xiaogyan.ledMatrix.fillScreen(1);
delay(200);
// 音を止める。
Xiaogyan.speaker.setTone(0);
// LEDマトリックスを全て消灯。
Xiaogyan.ledMatrix.fillScreen(0);
}
void loop()
{
// XIAOGYANライブラリを実行。
Xiaogyan.doWork();
// LEDを点滅する。
// (200ミリ秒点灯、800ミリ秒消灯を繰り返す。)
Xiaogyan.led.write(millis() % 1000 < 200 ? LOW : HIGH);
// 4ボタンで「ドレミファソラシド」を鳴らす。
static bool buttonA = false;
static bool buttonB = false;
static bool buttonC = false;
static bool buttonD = false;
bool preButtonA = buttonA;
bool preButtonB = buttonB;
bool preButtonC = buttonC;
bool preButtonD = buttonD;
buttonA = Xiaogyan.buttonA.read() == LOW;
buttonB = Xiaogyan.buttonB.read() == LOW;
buttonC = digitalRead(D5)== LOW;
buttonD = digitalRead(D4)== LOW;
if (preButtonA != buttonA || preButtonB != buttonB || preButtonC != buttonC || preButtonD != buttonD)
{
if ( buttonA && !buttonB && !buttonC && !buttonD ) Xiaogyan.speaker.setTone(262); // C4 ド
else if (!buttonA && buttonB && !buttonC && !buttonD ) Xiaogyan.speaker.setTone(294); // D4 ㇾ
else if (!buttonA && !buttonB && buttonC && !buttonD ) Xiaogyan.speaker.setTone(330); // E4 ミ
else if (!buttonA && !buttonB && !buttonC && buttonD ) Xiaogyan.speaker.setTone(349); // F4 ファ
else if ( buttonA && buttonB && !buttonC && !buttonD ) Xiaogyan.speaker.setTone(392); // G4 ソ
else if (!buttonA && buttonB && buttonC && !buttonD ) Xiaogyan.speaker.setTone(440); // A4 ラ
else if (!buttonA && !buttonB && buttonC && buttonD ) Xiaogyan.speaker.setTone(494); // B4 シ
else if ( buttonA && !buttonB && !buttonC && buttonD ) Xiaogyan.speaker.setTone(523); // C5 ド
else Xiaogyan.speaker.setTone(0);
}
// LEDマトリックスを流れるように点灯。
static const int COLOR_MAP[] = { 1, 0, 2, 0, 3, 0, };
static int x = 0;
static int y = 0;
static int colorIndex = 0;
static elapsedMillis ledMatrixElapsed{ 0 };
if (ledMatrixElapsed >= (EncoderValue_ + 1) * 10)
{
ledMatrixElapsed = 0;
Xiaogyan.ledMatrix.drawPixel(x, y, COLOR_MAP[colorIndex]);
if (++x >= Xiaogyan.ledMatrix.width())
{
x = 0;
if (++colorIndex >= std::extent<decltype(COLOR_MAP)>::value)
{
colorIndex = 0;
if (++y >= Xiaogyan.ledMatrix.height())
{
y = 0;
}
}
}
}
}
////////////////////////////////////////////////////////////////////////////////
<電子ピアノキーボード製作>
3-1 部品表
部品名 | 型式 | メーカー | 数量 |
---|---|---|---|
マイコン | XIAO ESP32C3 | Seeed Studio | 1 |
XIAOGYANプレゼント基板 | 8周年オリジナルIoTデバイス「XIAOGYAN」 | IoT ALGYAN | 1 |
ユニバーサル基板 | 7cm×5cm | 不明 | 2 |
ユニバーサルプレート | 16cm×6cm | タミヤ | 1 |
キースイッチ | 2回路2接点 | 不明 | 8 |
5線平行ケーブル | 10cm | 不明 | 1 |
3-3 ピアノキーボードのプログラム
2回路2接点のキースイッチを使うことにより、4ボタンのキーボードと同じプログラムで作動しました。
3-4 電子ピアノキーボードの動画
電子ピアノ完成動画はこちらです。
<終わりに>
電子ピアノのキーボードに挑戦して、何とか出来上がりました。
IoT ALGYAN 8周年オリジナルIoTデバイス「XIAOGYAN」と、XIAOGYANのサンプルコードのHardwareTestを使って作りました。
ALGYAN 8周年イベントでは、色々なことを勉強できて感謝しています。小暮様、松岡様、長濱様、ありがとうございました。
投稿者の人気記事
-
nakkyi
さんが
2023/12/17
に
編集
をしました。
(メッセージ: 初版)
-
nakkyi
さんが
2023/12/17
に
編集
をしました。
-
nakkyi
さんが
2023/12/17
に
編集
をしました。
-
nakkyi
さんが
2023/12/17
に
編集
をしました。
-
nakkyi
さんが
2023/12/17
に
編集
をしました。
-
nakkyi
さんが
2023/12/17
に
編集
をしました。
-
nakkyi
さんが
2023/12/17
に
編集
をしました。
-
nakkyi
さんが
2023/12/17
に
編集
をしました。
Opening
610t
2023/12/17
nakkyi
2023/12/19 -
nakkyi
さんが
2023/12/19
に
編集
をしました。
-
nakkyi
さんが
2024/02/15
に
編集
をしました。
ログインしてコメントを投稿するESP35ってのは、ESP32の間違いかと。
ありがとうございます。修正しました。