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

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);

 

}

 

 

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

SAIです。

 

ESP32にはBlueToothとWifi通信ができる機能が備わっています。

この変にアンテナがついていますね。

ちなみに、緑〇で囲った左の方に技適マークもついていますよ

 

 

そんなわけで、シリアルでバックをBlueTooth経由でも行えます。

なんなら、BlueToothを使ってシリアル通信もできるので遠隔操作もできますよ。

 

今回はシリアルでバックのみしてみようと思います。

 

①ESP32でBlueTooth通信設定(主に出力)

 

ESP32でBlueToothを使用する際にもシリアル通信と似た使い方をします。

今回は、「BluetoothSerial.h」を使って通信します。

BluetoothSerial  という型でオブジェクトを作れば、Serial と似たような形で使えます。

がちょっと違います。

 

使い方は、

(1)BluetoothSerial  という型でオブジェクトを生成

 仮にBTSerialという名で生成したとして話を進めます。

(2)BTSerial.bigin()で、BlueToothで探すときの名前を設定します。

(3)BTSerial.println()で、PCのシリアルモニタに文字出力後に改行

(4)BTSerial.available()では、PCからESP32へ送信があったかを確認する

  戻りがTrueなら受信ありですね。

(5)(4)を確認して受信があった場合に、BTSerial.read()を呼び出すことで、PCからのデータを受信

  (4)と(5)はセットで使用するイメージですね。

 

とりあえず、

デバックで使用するのは「BTSerial.println()」が多いでしょうね。

 

②シリアルログを埋め込む

使い方は簡単

setup()関数では、「BTSerial.begin("ESP32_BTSerial");」で検索名を設定

 

出力したいところで、「BTSerial.println("LED ON");」といった感じで出力したい文字を出力

ですね。

 

それでは、前回のUSBシリアル通信のコードをBlueToothに変更してログを埋めてみましょう。

※記事の最後にコードを記載しておきますので、コピペする方はそこからコピペしてね。

 

③ESP32とBlueToothで接続

それでは、書き込んでBlueTooth接続しましょう。

通常のBlueTooth接続のように機器検索から、先程設定した ESP32_BTSerial という名前を探します。

そして接続です。

 

そうすると、COMにBlueTooth接続のCOMが出現します。

このどちらかが入力に割当たっているはずです。

 

 

USB書き込み後にCOMを切り替えます。

 

④シリアルモニタに出力する


 

シリアルモニタを表示するには、

ツール → シリアルモニタ を選びます。

USBシリアルと同じですが、COMが変わっていますね。

 

ArduinoIDE1.8の時は別画面に表示されていたのですが、

ArduinoIDE2.3では、画面の下部に表示されるようになってますね。

 

上の絵のように、LEDのチカチカと合わせてシリアルログが出力されました。

 

 

 

それでは、BlueTooth接続のシリアルログ出力はここまで。

(入力はまたいつか)

 

余談、、、

絵を取るためにBlueTooth接続COMを削除してしまって、戻すのに難儀しています。。

困った!

 

 

Topへ戻る↓

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

 

 

 

 

今回使用したコード

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

// Using BlueThooth

#include "BluetoothSerial.h"

 

BluetoothSerial BTSerial;

 

const int CGPIO_LED_PIN = 2;

 

// 起動時初期設定 //

void setup() {

  //GPIOの初期設定

  pinMode(CGPIO_LED_PIN, OUTPUT);

 

  // BTName //

  BTSerial.begin("ESP32_BTSerial");

 

  Serial.begin(115200);

  Serial.println("Start ESP32 ");

}

 

// ぐるぐるループ //

void loop() {

  //LED点灯 //

  digitalWrite(CGPIO_LED_PIN, HIGH);

  BTSerial.println("LED ON");

  delay(500);

  digitalWrite(CGPIO_LED_PIN, LOW);

  BTSerial.println("LED OFF");

  delay(500);

 

}

 

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

SAIです。

 

コードを作成して動作が変な時に、デバックしたいですよね?

 

Arduinoでもそうですが、簡単なデバックの手段としてログ出力があります。

そう、UARTでのSystemLogです。


 

①PCとESP32でシリアル通信(主に出力)

 

https://docs.arduino.cc/learn/communication/uart/

 

Arduino環境では、USBのシリアル通信に関しては、

「Serial」クラスで行えますが、Arduino環境で単純な Serial は予約語になっていますね。

 

これはESP32でも同様に使えるようです。

使い方は、

(1)Seriarl.bigin()で、通信速度を設定

(2)Serial.print()で、PCのシリアルモニタに文字出力

(3)Serial.println()で、PCのシリアルモニタに文字出力後に改行

(4)Serial.available()では、PCからESP32へ送信があったかを確認する

  戻りがTrueなら受信ありですね。

(5)(4)を確認して受信があった場合に、Serial.read()を呼び出すことで、PCからのデータを受信

  (4)と(5)はセットで使用するイメージですね。

 

とりあえず、

デバックで使用するのは「Serial.println()」が多いでしょうね。

 

②シリアルログを埋め込む

使い方は簡単

setup()関数では、「Seriarl.bigin(115200)」でボーレート115200で設定

 

出力したいところで、「Serial.println("aaa")」で出力したい文字を出力

ですね。

 

それでは、前回のLEDチカチカのコードにログを埋めてみましょう。

※記事の最後にコードを記載しておきますので、コピペする方はそこからコピペしてね。

 

 

③シリアルモニタに出力する

 

それでは、書き込んでシリアルモニタに出力しよう。

 

シリアルモニタを表示するには、

ツール → シリアルモニタ を選びます

 

ArduinoIDE1.8の時は別画面に表示されていたのですが、

ArduinoIDE2.3では、画面の下部に表示されるようになってますね。

 

そして、シリアルモニタのボーレートを設定した数値と合わせましょう。

 

 

ちなみに、

USBを使ってシリアル通信をしていますので、

書き込みしたCOMポートと合わせておく必要があります。

ご注意ください。

 

上の絵のように、LEDのチカチカと合わせてシリアルログが出力されました。

 

 

余談ですが、シリアルログを出力するためには通信するための時間を使います。

なので、

1HzのLEDチカチカの中にこんな処理を埋め込むと、1Hzの点灯/消灯の時間が遅れますね。

 

その点は注意しましょう。

 

それでは、シリアルログ出力はここまで。

(入力はまたいつか)

 

Topへ戻る↓

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

 

 

 

 

今回使用したコード

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

const int CGPIO_LED_PIN = 2;

 

// 起動時初期設定 //

void setup() {

  //GPIOの初期設定

  pinMode(CGPIO_LED_PIN, OUTPUT);

 

  Serial.begin(115200);

  Serial.println("Start ESP32 ");

}

 

// ぐるぐるループ //

void loop() {

  //LED点灯 //

  digitalWrite(CGPIO_LED_PIN, HIGH);

  Serial.println("LED ON");

  delay(500);

  digitalWrite(CGPIO_LED_PIN, LOW);

  Serial.println("LED OFF");

  delay(500);

}