工場改善 IoT Arduino開発

現場の悩みに解決手段を

【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
 文字列データ処理する。

材料

・ESP32評価ボード(2,000円程度)
RS232c TTLコンバーター(Dsab9ピンオス)(1,000円くらい)
・電線
・ケース

開発環境

Arduino IDE 1.8.13

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) ※今回利用しない。

ブレッドボード
f:id:kesokonpatata:20200906054435p:plain

回路図
f:id:kesokonpatata:20200906054443p:plain

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