パソコンで鉄道模型を制御するための基礎検討(2)
無線接続用ソフトウェア (ESP32C3)
ESP32C3のプログラム開発環境はArduino IDEです。
Arduino IDEは無料で、ESP32C3にプログラムを書き込む時は type-CコネクタのついたUSBケーブルでパソコンと接続するだけでOKです。
私は今回初めてArduino IDEを使いました。(on Windows11 64bit)
https://wiki.seeedstudio.com/XIAO_ESP32C3_Getting_Started/
を見てArduinoをダウンロードし、ESP32C3用のセッティングをしました。
(ボードマネージャにesp32を追加、ボードとしてXIAO_ESP32C3を設定)
作成するプログラムの機能は
1.Bluetooth経由で受信したデータをUART Tx(シリアル出力)から送信
2.UART Rx(シリアル入力)から受信したデータをbluetooth経由でパソコンに送信
というシンプルなものです。
Arduino IDEでESP32C3用の設定をした後、ファイル --> スケッチ例 で表示されるサンプルプログラムの中の
--> ESP32 BLE arduino --> BLE_uart をベースに修正しました。
ソースファイルを添付します。
ESP32C3_BLE_UART.ino (2024/12/18にUARTの通信速度を57.6Kbaud変更)
ソフト開発のプロから見ると上記コードはいろいろ改善の余地があるでしょうが、ループバックテストで動作確認はしています。
プログラムをESP32C3に書き込む手順は以下の通りです。
1.上記のソースファイルをダブルクリックしてarduino IDEを起動
2.USBケーブルでパソコンにESP32C3を接続する。
3.arduino IDE上部のボード名表示欄に「XIAO_ESP32C3」が表示されている事を確認する。
4.ボード名表示欄右側の▽印をクリックしXIAO_ESP32C3の名前が付いたCOMポート(COM数字)が表示され選択されている事を確認する。
5.もしボード名、ポートが設定されていなかったら「他のボードとポートを選択」をクリックして設定する。
6.書き込みボタン(上部の右矢印)を押す。
Arduino IDEは無料で、ESP32C3にプログラムを書き込む時は type-CコネクタのついたUSBケーブルでパソコンと接続するだけでOKです。
私は今回初めてArduino IDEを使いました。(on Windows11 64bit)
https://wiki.seeedstudio.com/XIAO_ESP32C3_Getting_Started/
を見てArduinoをダウンロードし、ESP32C3用のセッティングをしました。
(ボードマネージャにesp32を追加、ボードとしてXIAO_ESP32C3を設定)
作成するプログラムの機能は
1.Bluetooth経由で受信したデータをUART Tx(シリアル出力)から送信
2.UART Rx(シリアル入力)から受信したデータをbluetooth経由でパソコンに送信
というシンプルなものです。
Arduino IDEでESP32C3用の設定をした後、ファイル --> スケッチ例 で表示されるサンプルプログラムの中の
--> ESP32 BLE arduino --> BLE_uart をベースに修正しました。
ソースファイルを添付します。
ESP32C3_BLE_UART.ino (2024/12/18にUARTの通信速度を57.6Kbaud変更)
ソフト開発のプロから見ると上記コードはいろいろ改善の余地があるでしょうが、ループバックテストで動作確認はしています。
プログラムをESP32C3に書き込む手順は以下の通りです。
1.上記のソースファイルをダブルクリックしてarduino IDEを起動
2.USBケーブルでパソコンにESP32C3を接続する。
3.arduino IDE上部のボード名表示欄に「XIAO_ESP32C3」が表示されている事を確認する。
4.ボード名表示欄右側の▽印をクリックしXIAO_ESP32C3の名前が付いたCOMポート(COM数字)が表示され選択されている事を確認する。
5.もしボード名、ポートが設定されていなかったら「他のボードとポートを選択」をクリックして設定する。
6.書き込みボタン(上部の右矢印)を押す。
ループバック通信テスト用PC側ソフトウェア (Python)
無線接続のテストをするためにパソコン上で実行するテストプログラムをpythonで作成しました。
私はwindows11の環境でソフトを作成し以下の手順でテストしました。
【手順】
・python(3.5系)がインストールされていなければ検索、ダウンロードしてインストールする。
・コマンドプロンプトまたはpowershcellのウィンドウを開き、以下のコマンドでBluetooth low energyのモジュールを追加する。
pip install bleak
・パソコンにBluetooth Low energy (BLE)対応のUSBドングルを装着する。
私はwindows11の環境でソフトを作成し以下の手順でテストしました。
【手順】
・python(3.5系)がインストールされていなければ検索、ダウンロードしてインストールする。
・コマンドプロンプトまたはpowershcellのウィンドウを開き、以下のコマンドでBluetooth low energyのモジュールを追加する。
pip install bleak
・パソコンにBluetooth Low energy (BLE)対応のUSBドングルを装着する。
・アンテナを接続したESP32C3をベースボードに装着する。
・ベースボードのシリアル(UART)入出力間をコネクタ+配線で接続(ループバック)する。
・ベースボードの電源端子に12V(7~15V可)を供給する。
排他的にESP32C3のUSBコネクタから電源供給してもよい。
・ベースボードのシリアル(UART)入出力間をコネクタ+配線で接続(ループバック)する。
・ベースボードの電源端子に12V(7~15V可)を供給する。
排他的にESP32C3のUSBコネクタから電源供給してもよい。
・次のテストプログラムを適当なフォルダに置く。
BLE_UART_loopback_line.py
・プログラムを置いたフォルダ内でShift+右クリックでpowershellを起動、またはコマンドプロンプト内で
python BLE_UART_loopback_line.py
でテストプログラムを起動する。
・7秒間ほど待つとConnected: True と表示され、ESP32C3のベースボードのLEDが点灯する。
・プログラムを起動したウィンドウで任意のキー入力をしてEnterを押すと送信したデータとループバックで戻ってきたデータが表示される。
・Enterキーのみを入力すると接続が解除されてプログラムが終了する。
BLE_UART_loopback_line.py
・プログラムを置いたフォルダ内でShift+右クリックでpowershellを起動、またはコマンドプロンプト内で
python BLE_UART_loopback_line.py
でテストプログラムを起動する。
・7秒間ほど待つとConnected: True と表示され、ESP32C3のベースボードのLEDが点灯する。
・プログラムを起動したウィンドウで任意のキー入力をしてEnterを押すと送信したデータとループバックで戻ってきたデータが表示される。
・Enterキーのみを入力すると接続が解除されてプログラムが終了する。
ループバックテストで判明した問題点と対策
UARTのTx端子とRx端子を接続した状態での送受信は問題ありませんでした。
しかしシリアル接続が断線した状態を想定してRx端子を未接続にしてループバックテストを行うとごみデータが返ってきました。
原因は電圧変換用に入れたMOSトランジスタの入力がハイインピーダンスでノイズを拾っていたためでした。
念のためPull upの抵抗を追加しました。(回路図等修正済み)
ところが、それでも空ではない受信データが返ってきました。
返ってくるデータはTx-Rx未接続で電源投入した場合は0や0xFEなどでした。
Tx-Rxを接続して正常にループバックテストしてからRxを未接続にした場合は未接続にする直前のRx受信データが読めてしまいます。
バグなのかBleakライブラリの仕様なのか、ソフトの書き方の問題なのか良くわかりません。
bleakライブラリのドキュメントをちょっと覗いてみたりWeb検索もしてみましたが根本的な対処方法はわかりませんでした。
ですが対症療法的な対策としては、受信データの内容が正しいかどうかの判定を追加して正しくないものは無視すればOKでしょう。
接続が正しくて送受信が正常な状態では問題が起きないので模型の制御であればこの問題は無視して良いかもしれません。
試しに、送信時の先頭データに判定用のデータ2byteと送信番号の1バイトを足し、受信時にその3byteを判定&除去するループテストプログラムを作ってみました。
BLE_UART_loopback_line2.py
これだとRx未接続(受信データ無し)でちゃんと受信なしと判定できました。
しかしシリアル接続が断線した状態を想定してRx端子を未接続にしてループバックテストを行うとごみデータが返ってきました。
原因は電圧変換用に入れたMOSトランジスタの入力がハイインピーダンスでノイズを拾っていたためでした。
念のためPull upの抵抗を追加しました。(回路図等修正済み)
ところが、それでも空ではない受信データが返ってきました。
返ってくるデータはTx-Rx未接続で電源投入した場合は0や0xFEなどでした。
Tx-Rxを接続して正常にループバックテストしてからRxを未接続にした場合は未接続にする直前のRx受信データが読めてしまいます。
バグなのかBleakライブラリの仕様なのか、ソフトの書き方の問題なのか良くわかりません。
bleakライブラリのドキュメントをちょっと覗いてみたりWeb検索もしてみましたが根本的な対処方法はわかりませんでした。
ですが対症療法的な対策としては、受信データの内容が正しいかどうかの判定を追加して正しくないものは無視すればOKでしょう。
接続が正しくて送受信が正常な状態では問題が起きないので模型の制御であればこの問題は無視して良いかもしれません。
試しに、送信時の先頭データに判定用のデータ2byteと送信番号の1バイトを足し、受信時にその3byteを判定&除去するループテストプログラムを作ってみました。
BLE_UART_loopback_line2.py
これだとRx未接続(受信データ無し)でちゃんと受信なしと判定できました。
到達距離テスト
ESP32C3のBluetooth(BLE)でどのくらいの距離まで通信できるのか調べてみました。
ESP32C3にモバイルバッテリーで電源供給し2部屋先まで移動しても通信できました。
家の外に出てパソコンからの直線距離約25m地点で通信できなくなりました。
室内での模型制御用なら充分な到達距離と思われます。
ESP32C3にモバイルバッテリーで電源供給し2部屋先まで移動しても通信できました。
家の外に出てパソコンからの直線距離約25m地点で通信できなくなりました。
室内での模型制御用なら充分な到達距離と思われます。
USB-Bluetoothドングルのデバイスドライバについて
USB-Bluetoothドングルは買ってきてパソコンに挿したら自動でドライバが設定され使えるようになりました。
ですが、Bluetooth接続のイヤホンにペアリングをして使えるか試そうとしたらドライバがオーディオ用に置き換わってしまったようでESP32C3と接続できなくなってしまいました。
デバイスマネージャーを開き、Bluetooth-->該当デバイス-->ドライバータブで[デバイスのアンインストール」を行い、ドングルを挿しなおしたらESP32C3と接続できるようになりました。
ですが、Bluetooth接続のイヤホンにペアリングをして使えるか試そうとしたらドライバがオーディオ用に置き換わってしまったようでESP32C3と接続できなくなってしまいました。
デバイスマネージャーを開き、Bluetooth-->該当デバイス-->ドライバータブで[デバイスのアンインストール」を行い、ドングルを挿しなおしたらESP32C3と接続できるようになりました。