7.2 Bluetoothを用いたRGB LEDの制御

このプロジェクトは以前のプロジェクト(7.1 Bluetooth)を拡張したもので、RGB LEDの設定と「led_off」、「red」、「green」などのカスタムコマンドを追加しています。これらのコマンドにより、LightBlueを使用してモバイルデバイスからのコマンドを送信することでRGB LEDを制御できます。

必要な部品

このプロジェクトには、以下のコンポーネントが必要です。

キット全体を購入することは間違いなく便利です。こちらがリンクです:

名前

このキットのアイテム

リンク

ESP32 Starter Kit

320+

ESP32 Starter Kit

または、以下のリンクから個別に購入することもできます。

コンポーネントの紹介

購入リンク

ESP32 WROOM 32E

BUY

ESP32カメラ拡張ボード

-

ブレッドボード

BUY

ジャンパーワイヤ

BUY

抵抗器

BUY

RGB LED

BUY

操作手順

  1. 回路を組み立てます。

    ../../_images/rgb_pin.jpg

    RGB LEDには4本のピンがあります。一番長いピンは共通カソードピンで、通常GNDに接続されます。一番長いピンの隣の左ピンが赤、右側の二本が緑と青です。

    ../../_images/2.3_color_light_bb.png
  2. esp32-starter-kit-main\c\codes\7.2_bluetooth_rgb_led ディレクトリにある 7.2_bluetooth_rgb_led.ino ファイルを開くか、コードをArduino IDEにコピーします。

  3. UUIDの衝突を避けるため、Bluetooth SIGが提供する Online UUID Generator を使ってランダムに3つの新しいUUIDを生成し、コードの以下の行に記入することをお勧めします。

    注釈

    もし 7.1 Bluetooth プロジェクトで既に3つの新しいUUIDを生成している場合は、それらを引き続き使用できます。

    #define SERVICE_UUID           "your_service_uuid_here"
    #define CHARACTERISTIC_UUID_RX "your_rx_characteristic_uuid_here"
    #define CHARACTERISTIC_UUID_TX "your_tx_characteristic_uuid_here"
    
    ../../_images/uuid_generate.png
  4. 正しいボードとポートを選択し、 アップロード ボタンをクリックします。

  5. コードが正常にアップロードされた後、モバイルデバイスの Bluetooth をオンにし、 LightBlue アプリを開きます。

    ../../_images/bluetooth_open.png
  6. Scan ページで ESP32-Bluetooth を見つけ、 CONNECT をクリックします。見つからない場合は、数回ページを更新してみてください。 「Connected to device!」 と表示されると、Bluetooth接続が成功しています。コードで設定された3つのUUIDを見るために下にスクロールします。

    ../../_images/bluetooth_connect.png
  7. 送信用UUIDをタップし、データ形式を"UTF-8 String"に設定します。これで、「led_off」、「red」、「green」、「blue」、「yellow」、「purple」というコマンドを書き込んで、RGB LEDがこれらの指示に反応するかどうかを確認できます。

    ../../_images/bluetooth_send_rgb.png

どのように動作するのか?

このコードは、以前のプロジェクト(7.1 Bluetooth)の拡張版であり、RGB LED設定と「led_off」、「red」、「green」などのカスタムコマンドを追加しています。これらのコマンドにより、LightBlueを使用してモバイルデバイスからのコマンドを送信することでRGB LEDを制御できます。

コードをステップバイステップで分解してみましょう:

  • RGB LEDピン、PWMチャンネル、周波数、解像度に関する新しいグローバル変数を追加します。

    ...
    
    // Define RGB LED pins
    const int redPin = 27;
    const int greenPin = 26;
    const int bluePin = 25;
    
    // Define PWM channels
    const int redChannel = 0;
    const int greenChannel = 1;
    const int blueChannel = 2;
    
    ...
    
  • setup() 関数内では、PWMチャンネルが定義済みの周波数と解像度で初期化されます。次に、RGB LEDのピンをそれぞれのPWMチャンネルに割り当てます。

    void setup() {
        ...
    
        // Set up PWM channels
        ledcSetup(redChannel, freq, resolution);
        ledcSetup(greenChannel, freq, resolution);
        ledcSetup(blueChannel, freq, resolution);
    
        // Attach pins to corresponding PWM channels
        ledcAttachPin(redPin, redChannel);
        ledcAttachPin(greenPin, greenChannel);
        ledcAttachPin(bluePin, blueChannel);
    
    }
    
  • MyCharacteristicCallbacks クラスの onWrite メソッドを変更します。この関数は、Bluetooth接続から来るデータを監視します。受信した文字列( 「led_off」, 「red」, 「green」 など)に基づいて、RGB LEDを制御します。

    // Define the BLE characteristic callbacks
    class MyCharacteristicCallbacks : public BLECharacteristicCallbacks {
        void onWrite(BLECharacteristic *pCharacteristic) {
            std::string value = pCharacteristic->getValue();
            if (value == "led_off") {
                setColor(0, 0, 0); // turn the RGB LED off
                Serial.println("RGB LED turned off");
            } else if (value == "red") {
                setColor(255, 0, 0); // Red
                Serial.println("red");
            }
            else if (value == "green") {
                setColor(0, 255, 0); // green
                Serial.println("green");
            }
            else if (value == "blue") {
                setColor(0, 0, 255); // blue
                Serial.println("blue");
            }
            else if (value == "yellow") {
                setColor(255, 150, 0); // yellow
                Serial.println("yellow");
            }
            else if (value == "purple") {
                setColor(80, 0, 80); // purple
                Serial.println("purple");
            }
        }
    };
    
  • 最後に、RGB LEDの色を設定する関数を追加します。

    void setColor(int red, int green, int blue) {
        // For common-anode RGB LEDs, use 255 minus the color value
        ledcWrite(redChannel, red);
        ledcWrite(greenChannel, green);
        ledcWrite(blueChannel, blue);
    }
    

要約すると、このスクリプトはリモートコントロールの対話モデルを実現します。ここではESP32がBluetooth Low Energy (BLE) サーバーとして動作します。

接続されたBLEクライアント(スマートフォンなど)は文字列のコマンドを送信してRGB LEDの色を変更することができます。ESP32は実行された操作をクライアントに知らせるために受信した文字列をクライアントに返信し、フィードバックを与えます。