【ESP32】RS232cから受信した信号をBluetoothで送信してみる。
経緯
会社の古い測定器にRS-232c出力の機器があるんですが、測定器の紙に書き写していた記録類をPCに直接データを取り込んで楽にしたいという要望を受けて作ってみました。
具体的には塵埃測定機器や電子天秤からのデータなんですが、他の試験機器にも流用できそうだからやってみようかと思いました。
ちなみに今回から現場の方で開発用+製作部品予算をもらって作るようにしてみました。うちの部署お金ないので、自己啓発+自費で遊びでやってたんですが、今後会社内でやっていくならビジネスモデル確立しとかないとあそbe...
..IT関連の改善手段も増やさないと今の仕事の価値があがらないですからね。大変だ~←棒読み
担当者とどういう流れで測定作業をするか話したんですが、n箇所の塵埃測定ポイントがあり、機器にデータを蓄積してから、纏めてPCに出力する流れでやることを提案しました。取り込みは有線、無線どっちでやるかって話になったときに使う人が「ブルートゥース??」な方が使われることが想定されるので、有線(USB HID)でよくねって思ったんですが、安いからどっちも欲しいって欲張りなこと言われました。
まぁ他の部署にも売り込むための実績作るためにはいいかと思って作りました。
まずは無線仕様としてESP32 Bluetoothを使うようにします。有線は別の記事で。
今回BluetoothのプロファイルはSPPとHID両方記載しています。
いろんなPCで使うから今回使うのはHIDでいいかな~
機器仕様
・PCとBluetoothでペアリングすることで利用可能(パスワードなし)
・RS232cの信号のレベルをTTLレベルに変換し、非同期シリアル通信(UART)で受信したデータを
マイコンで受けて蓄積し、改行コードを受信したら文字列をBluetoothでデータ送信。
HIDだったらキーボード入力と同じように扱えるから、Excelに取り込後に関数やVBAで
文字列データ処理する。
開発環境
Arudoino IDEにESP32をセットアップする。
スイッチサイエンスのページです。
trac.switch-science.com
BLE HIDで接続する場合
以下のキーボードライブラリをDLして、Ardoino IDEに読み込ませる。
↓GitHubのページです。
ESP32をBluetoothキーボードとして機能させ、その機能を制御できるライブラリがあるので、ダウンロードしてArudoino IDEに取り込んでください。
github.com
予備知識
規格:ESP32 Bluetooth 4.2
UART(HardwareSerial)
UART0(RX0:GPIO 3、TX0:GPIO 1)USB
UART2(RX2:GPIO16、TX2:GPIO17)受信のRXのみ使用
RS232c機器の設定は以下にしておく
ボーレート:9600
ビット長:8ビット、パリティ:なし、ストップビット:なし(SERIAL_8N1)
接続
送信側→ESP32
3.3V -3.3V
GND -GND
TX -GPIO16(RX)
RX -GPIO17(TX) ※今回利用しない。
ブレッドボード
回路図
Bluetooth SPP送信仕様
#include <BluetoothSerial.h> // Bluetooth SPPプロファイルのライブラリ BluetoothSerial SerialBT; //#define bps0 115200 // bps UART0(RX:GPIO 3,TX:GPIO 1)USB #define bps2 9600 // bps UART2(RX:GPIO 16) String strDATA = "No Data"; // 送信する文字列 volatile bool strConplete = true; void setup() { strDATA.reserve(128); // strDATAの文字列の格納領域を128byte数確保 SerialBT.begin("ESP32_SPP"); // デバイス名でBluetooth開始 // Serial.begin(bps0); // UART0 Serial2.begin(bps2); // UART2 delay(500); } void loop() { while (Serial2.available() > 0) { // 受信したデータバッファが1バイト以上存在する場合 if (strConplete == true) { // 新たなデータを取得したときにデータ初期化 strConplete = false; // フラグ初期化 strDATA = ""; // データ初期化 } char inChar = Serial2.read(); // Serial2からデータ読み込み if (inChar == '\n') { // 改行コード(LF)がある場合の処理 strConplete = true; // フラグを更新 SerialBT.println(strDATA); // Bluetooth送信 } else if (inChar != '\r') { // CRの改行コードの場合は結合しない strDATA += inChar; // 読み込んだデータを結合 } } delay(1); }
Bluetooth HID仕様
#include <BleKeyboard.h> // Bluetooth HIDプロファイルのライブラリ BleKeyboard bleKeyboard("ESP32BLE_HID"); // Bluetoothペアリング時の表示名 //#define bps0 115200 // bps UART0(RX:GPIO 3,TX:GPIO 1)USB #define bps2 9600 // bps UART2(RX:GPIO 16) String strDATA = "No Data"; // 送信する文字列 volatile bool strConplete = true; void setup() { strDATA.reserve(128); // strDATAの文字列の格納領域を128byte数確保 bleKeyboard.begin(); // BLE HID接続開始 // Serial.begin(bps0); // UART0 Serial2.begin(bps2); // UART2 delay(500); } void loop() { while (Serial2.available() > 0) { // 受信したデータバッファが1バイト以上存在する場合 if (strConplete == true) { // 新たなデータを取得したときにデータ初期化 strConplete = false; // フラグ初期化 strDATA = ""; // データ初期化 } char inChar = Serial2.read(); // Serial2からデータ読み込み if (inChar == '\n') { // 改行コード(LF)がある場合の処理 strConplete = true; // フラグを更新 // Serial.println(strDATA) bleKeyboard.println(strDATA); // Bluetooth送信 } else if (inChar != '\r') { // CRの改行コードの場合は結合しない strDATA += inChar; // 読み込んだデータを結合 } } delay(1); }