みなさんこんにちわ、こんばんわ。

SAIです。

 

前回は、ESP32とBlueTooth接続をしてシリアルログをやり取りしてみました。

ESP32からPCへの一方通行だったですね。

 

それだと、BlueTooth接続の有効活用ができていない!

双方向に通信したほうが絶対楽しいですよね!

 

という訳で、

今回は、PCからESP32を操作してみようと思います!

 

前回使用した「BluetoothSerial.h」の仕様を見たいのですが、

検索をするとGitHubがヒットしました。


Esspressifの公式を見るとこんな感じで書かれていますが、

サンプルが書かれているだけで、API一覧になっていない模様。。
これだけだと何が使えるのか、内容がよくわからない!


仕方ないので、ヘッダーから予想する作戦です。
以下GitHubを参考にして、使用方法を予想してみた。

 

 

それにしても・・・

このヘッダを見ると、メンバー関数がすべてpublicで定義されていますね。

 

おそらく本来は、半分以上の関数がprivateである必要があるんじゃないかという名称になっています。

間違って使ったらどうなるのか気にはなりますが、せっかくC++なので隠蔽をしてほしいものです。

 

APIリファレンスを見てみたいけど・・・まぁ今はやめておきます。

 

さて、それでは試してみよう。

 

 

①BlueTooth接続での通信の確認

シリアル通信のコードは、一般的に以下の手順で受信をチェックします。

 

① setupで、シリアル接続をする

② loopで、シリアル通信で受信があるかをチェックする

③ ②で受信があった場合に、シリアル書き込みされた文字を読み込む

 

この流れから、②と③のつかい方を探す必要があります。

 

この二つだけであれば、Esspressifの公式サイトにサンプルがありました。

 

 

 

②ESP32でBlueTooth受信検知

 

公式のサンプルによると、BluetoothSerialを使っての受信の判定は

BluetoothSerial クラス内にある

 int available(void);

の様ですね。

 

チョット衝撃だったのですが、戻りが "Bool" ではなく、"int" になっていますね。

そうなると、0以外の値の意味が気になります。

 

恐らく、NGが0なんだと思います。

が、OKは0以外だと思うのですが、1以外はどんな定義になっているのか非常に気になります。

 

とりあえず、サンプルを見ると0以外であれば受信ありと扱うみたいですね。

 

 

③ESP32でBlueTooth受信値取得

こちらも、同様に

公式のサンプルによると、BluetoothSerialを使っての受信の判定は

BluetoothSerial クラス内にある

   int read(void);

の様ですね。

よく見ると、こちらも戻りが"int"型です。

charの配列じゃないのか。

ということは1文字ずつしかやり取りできないのかもしれない。

 

サンプルには謎が多いですが、Serial通信で文字を出力できた位なので、

取得できるのは ASCIIコードでしょう。

 

なので、数字は0x30~0x39  英語は0x41~0x5Aでしょう。

 

④LEDを準備

 

今回はLEDを2個使います。

なので、LEDを使用するポートを2つに増やします。

 

基板上にLEDは一つしかないので、2つ目はブレッドボード上に回路を作ります。

今回は、もう一つGPIO4に回路を作ってみました。

 

↓こんな感じで、抵抗とLEDを繋げました。

 

⑤LEDのコードの定義

前回のLEDチカチカでは、基板上のGPIO2が基板上のLEDを光らせる

なので、定義は1つで GPIO2を使いましたね。

今回はGPIO4も使うので、定義を増やします。

 

そして、setup関数内で、pinMode()では2種とも出力に設定しますよ

 

 

 

⑥ESP32でBlueToothを受信したらLEDを点滅する処理を作る

 

BTでデータを受信したら、戻りの値を判定して、該当する文字だったらLEDを制御する処理を作ります。

黄色の枠の通り、

int available(void);の戻りが正の数であれば、受信データの解析をします。 黄色で囲った場所ですね。

 

そして、受信した数字が、

数字の1(ASCII=0x31)なら、LED1を点灯

数字の2(ASCII=0x32)なら、LED2を点灯

数字の0(ASCII=0x30)なら、LED1を消灯

数字の3(ASCII=0x33)なら、LED2を消灯

となるように記載します。

ついでなので、処理の結果をシリアルモニタにフィードバックします。 

 緑色の場所で判定ですね。

 

 

これで、ESP32に対して遠隔でBlueToothでコマンドを送信したら、遠隔でLEDを制御できますよ!

 

⑦動かしてみる

 

それでは、前回同様にシリアルモニタをBlueToothのCOMポートに接続してコマンドを送ってみます。

 

 

1を送ると、基板上の青のLEDが光り、

2を送ると、ブレッドボード上の橙のLEDが光りました。

 

これでBlueToothの届く範囲なら遠隔操作ができますね!

 

⑧余談

余談です。

今回使った

   int read(void);

本当に1文字ずつしか送れないのか試してみました。


BlueToothで送信した文字を、USBシリアルで読み取ってみたところ、

どうやら文字列でやり取りできているようですね。

となると、ヘッダ情報からはintの戻りになっているけど、

実際はint配列になっているのかもしれない。

 

本気で使うときに要調査ですね。

 

 

Topへ戻る↓

https://ameblo.jp/saiduke/entry-12881307216.html

 

 

 

 

今回使用したコード

------------------------------------------

 

// Using BlueThooth

#include "BluetoothSerial.h"

 

BluetoothSerial BTSerial;

 

const int CGPIO_LED1_PIN = 2;

const int CGPIO_LED2_PIN = 4;

 

// 起動時初期設定 //

void setup() {

  //GPIOの初期設定

  pinMode(CGPIO_LED1_PIN, OUTPUT);

  pinMode(CGPIO_LED2_PIN, OUTPUT);

 

  // BTName //

  BTSerial.begin("ESP32_BTSerial");

 

  Serial.begin(115200);

  Serial.println("Start ESP32 ");

}

 

// ぐるぐるループ //

void loop() {

  int lReadVal = 0;

  //BlueTooth受信チェック //

  if (BTSerial.available())

  {

    //受信値取得 //

    lReadVal = BTSerial.read();

    if(lReadVal == 0x31)          // 数字の 1 受信 //

    {

      digitalWrite(CGPIO_LED1_PIN, HIGH);

      BTSerial.println("LED1 ON");

    }

    if(lReadVal == 0x32)          // 数字の 2 受信 //

    {

      digitalWrite(CGPIO_LED2_PIN, HIGH);

      BTSerial.println("LED2 ON");

    }

    if(lReadVal == 0x30)          // 数字の 0 受信 //

    {

      digitalWrite(CGPIO_LED1_PIN, LOW);

      BTSerial.println("LED1 off");

    }

    if(lReadVal == 0x33)          // 数字の 3 受信 //

    {

      digitalWrite(CGPIO_LED2_PIN, LOW);

      BTSerial.println("LED2 off");

    }

  }

  delay(500);

 

}