みなさんこんにちわ、こんばんわ。
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);
}












