nakkyi が 2023年12月17日10時15分29秒 に編集
コメント無し
本文の変更
### <はじめに>
ALGYANの7周年プレゼント基板(XIAOGYANO)で、電子ピアノ(キーボード)を作るのに挑戦しました。
ALGYAN8周年オリジナル基板(XIAOGYANO)で、電子ピアノ(キーボード)を作るのに挑戦しました。
この基板は、あらかじめいろいろな部品が載っている基板で、サンプルプログラムのテストを行えます。 今回は、XIAOGYANのサンプルコードの中の、HardwareTestというプログラムを使って、4ボタンのキーボードを作ってみました。 そして、8キーの電子ピアノ(キーボード)に挑戦しました。  ### <もくじ> ①4ボタンのキーボード製作 ②4ボタンキーボードのプログラム ③電子(ピアノ)キーボード製作 ④終わりに
⑤
[4ボタンキーボードの動画](https://youtu.be/jD7SCIO-KX0)
### 1. 4ボタンのキーボード製作 1-1 部品表 |部品名|型式|メーカー|数量| |---|---|---|---| |マイコン|XIAO ESP35C3|Seeed Studio|1| |XIAOGYANプレゼント基板|8周年オリジナルIoTデバイス「XIAOGYAN」|IoT ALGYAN |1| |ブレッドボード|8cm×5.5cm|自作加工|1| |ボタンスイッチ|1.1cm×1.1cm|不明|4| |5線平行ケーブル|10cm|不明|1| 1-2 回路図  1-3 作動表  1-4 XIAOGYANの配線  ### 2. 4ボタンのキーボードのプログラム ```arduino: /* * 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 = buttonC.read() == LOW; buttonD = buttonD.read() == 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. 電子(ピアノ)キーボード製作 3-1 部品表 |部品名|型式|メーカー|数量| |---|---|---|---| |マイコン|XIAO ESP35C3|Seeed Studio|1| |XIAOGYANプレゼント基板|8周年オリジナルIoTデバイス「XIAOGYAN」|IoT ALGYAN |1| |ユニバーサル基板|7cm×5cm|不明|2| |ユニバーサルプレート|16cm×6cm|タミヤ|1| |キースイッチ|2回路2接点|不明|8| |5線平行ケーブル|10cm|不明|1|
3-2 ピアノキーボードの配線
3-2 ピアノキーボードの配線図

3-3 ピアノキーボードのプログラム
2回路2接点のキースイッチを使うことにより、4ボタンのキーボードのプログラムと同じで作動しました。
2回路2接点のキースイッチを使うことにより、4ボタンのキーボードと同じプログラムで作動しました。
[電子キーボード完成動画](https://youtu.be/QnYSzs1aUh4)
### 4. 終わりに
電子ピアノのキーボードに挑戦して、何とか出来上がりました。 IoT ALGYAN 8周年オリジナルIoTデバイス「XIAOGYAN」と、XIAOGYANのサンプルコードのHardwareTestを使って作りました。 ALGYAN 8周年イベントでは、色々なことを勉強できて感謝しています。小暮様、松岡様、長濱様、ありがとうございました。