nakkyiのアイコン画像
nakkyi 2023年12月17日作成 (2024年02月15日更新)
製作品 製作品 Lチカ Lチカ 閲覧数 353
nakkyi 2023年12月17日作成 (2024年02月15日更新) 製作品 製作品 Lチカ Lチカ 閲覧数 353

XIAOGYANで、電子キーボードを作ってみた。

XIAOGYANで、電子キーボードを作ってみた。

<はじめに>

ALGYAN8周年オリジナル基板(XIAOGYANO)で、電子ピアノ(キーボード)を作るのに挑戦しました。
この基板は、あらかじめいろいろな部品が載っている基板で、サンプルプログラムのテストを行えます。
今回は、XIAOGYANのサンプルコードの中の、HardwareTestというプログラムを使って、4ボタンのキーボードを作ってみました。
そして、8キーの電子ピアノ(キーボード)に挑戦しました。
キャプションを入力できます

<もくじ>

①はじめに
②もくじ
③4ボタンのキーボード製作
④4ボタンキーボードのプログラム
⑤電子(ピアノ)キーボード製作
⑥終わりに

<4ボタンのキーボード製作>

1-1 部品表

部品名 型式 メーカー 数量
マイコン XIAO ESP32C3 Seeed Studio
XIAOGYANプレゼント基板 8周年オリジナルIoTデバイス「XIAOGYAN」 IoT ALGYAN
ブレッドボード 8cm×5.5cm 自作加工
ボタンスイッチ 1.1cm×1.1cm 不明
5線平行ケーブル 10cm 不明

1-2 回路図
キャプションを入力できます

1-3 作動表
キャプションを入力できます

1-4 XIAOGYANの配線
キャプションを入力できます

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
XIAOGYANプレゼント基板 8周年オリジナルIoTデバイス「XIAOGYAN」 IoT ALGYAN
ユニバーサル基板 7cm×5cm 不明
ユニバーサルプレート 16cm×6cm タミヤ
キースイッチ 2回路2接点 不明
5線平行ケーブル 10cm 不明

3-2 ピアノキーボードの配線図
キャプションを入力できます

3-3 ピアノキーボードのプログラム
2回路2接点のキースイッチを使うことにより、4ボタンのキーボードと同じプログラムで作動しました。

3-4 電子ピアノキーボードの動画
電子ピアノ完成動画はこちらです。

<終わりに>

電子ピアノのキーボードに挑戦して、何とか出来上がりました。
IoT ALGYAN 8周年オリジナルIoTデバイス「XIAOGYAN」と、XIAOGYANのサンプルコードのHardwareTestを使って作りました。
ALGYAN 8周年イベントでは、色々なことを勉強できて感謝しています。小暮様、松岡様、長濱様、ありがとうございました。

ログインしてコメントを投稿する