今回のバルキリーはbluetoothでのコントロールとしてみようと思います。
はい!もちろんbluetoothなんて使ったことありませんw
でもESP32を使えば、簡単にBluetooth使えるようになるんですね~。ホント凄い世の中だw
早速ネットでESP32のbluetoothの使い方を勉強します。
bluetooth の使用自体初めてなのでとりあえず繋げてみますw
まずは「JH7UBCブログ」さんを参考にプログラムを書き込んで、PCとbluetoothでの接続をしてみました。
私のPCではCOM8がbluetooth接続となっていました。
USBケーブルも外して別電源で
おおっ!来ました来ました!hello world!
流石arduinoIDE簡単に出来ちゃいましたw
よしとりあえずつながるのは分かったwここから先は小難しいことは置いておいてとにかくESP32同士での通信が出来ればいい!
色々さがしましたが、「ロボオプションズ」ここさえ見ればやりたいことは出来ますw!
非常に簡単で分かり易く解説されていますので、改めて私が説明するまでは無いと思います^^;
ちょっとした躓きはESP32のボードライブラリーのバージョンが古すぎて
スケッチ例にこの選択肢が出てこなかったくらいですw結構悩みましたが^^;
まずは掲載されているプログラムを使ってスレイブになるESP32のMACアドレスを調べました。
次にもう一台パソコンを用意しないといけないのですが、MACしかないのでそちらの設定も^^
まずはwindowsの時と同じようにarduinoIDEにESP32のボードライブラリーを入れてUSBを繋いでみるのですが、ESP32自体を認識しない・・・・・・・
USBの接続情報見ると
接続はされているようですが、このCP2102Nとかいう奴のドライバーを入れないといけないようです。ドライバーはこちらからゲット!
てな感じで軽くハマりながら
ポートが出てきました^^これでようやくプログラムの書き込みができますw(ホントMACて使うのめんどくさいw)
bluetooth接続自体は簡単にできました^^
これで用意できましたので動かしてみると・・・・・・
こんな感じでシリアル通信できました。これ両方向から出来ます。
プログラム中のSerialBT.read()は、てかread()は1回に1バイトづつしか受信できないんですよね。
そのため受信したときの文字の表示が一文字づつ表示されます。
まっ、コマンドなら1バイトでも十分か!・・・・・・でも文字以外の1バイトはどうやって送るの??うむ・・・・・とりあえず文字送れるからいいかww
でも1,2、aとか送るのはなんか分かりにくいし・・・・。
そういえば、シリアル通信調べてる時になんかあったな!
こちらを見てみると
なになにコマンド他にもあるんだ!
- read()
- readString()
- readStringUntil(char)
文字列を使いたいのでread以外で行こう。で、そこに関連リンクとしてあるリンク先を見るとreadStringUntil(char)を使えとの事。了解です!
これで通信用のマスターを書き換えてこうなりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#include "BluetoothSerial.h" BluetoothSerial SerialBT; String MACadd = "D8:A0:1D:5F:B0:D2"; uint8_t address[6] = {0xD8, 0xA0, 0x1D, 0x5F, 0xB0, 0xD2}; String name = "OBDII"; char *pin = "1234"; //<- standard pin would be provided by default bool connected; void setup() { Serial.begin(115200); SerialBT.begin("ESP32test",true); //Bluetooth device name Serial.println("The device started, now you can pair it with bluetooth!"); connected = SerialBT.connect(address); if(connected) { Serial.println("Connected Succesfully!"); } else { while(!SerialBT.connected(10000)) { Serial.println("Failed to connect. Make sure remote device is available and in range, then restart app."); } } // disconnect() may take upto 10 secs max if (SerialBT.disconnect()) { Serial.println("Disconnected Succesfully!"); } // this would reconnect to the name(will use address, if resolved) or address used with connect(name/address). SerialBT.connect(); } void loop() { if (Serial.available()) { String sendData = Serial.readStringUntil(';'); SerialBT.print(sendData); } if (SerialBT.available()) { String receiveData = SerialBT.readStringUntil(';'); Serial.print(receiveData); } delay(20); } |
4,5行めは通信相手のmacアドレス調べて変更して下さいね。
シリアルに文字列を入力後、最後に半角英数で「;」を入力すると文字列は一瞬で全部表示されるようになりました^^
よし、こうなると今度はそれを受信するプログラムをバルキリーに仕込めばいいわけか。
てなことで前回入れ替えたESP32にBluetoothが使える基本設定を書き込んだ後、受信プログラムを追加することに、ただここでちょっと
bluetoothのプログラムの方にはホント基本的な事しか書いてないのに、メモリー65%使っていますwコクピットのモニター表示プログラムで29%使ってますww
合わせると94%の使用率になるやんwwww
でもESP32の素晴らしいのは設定でもう少しメモリ増やせるんですよね~。
メモリーを1.9MBに増やして、あのコクピットモニターをコントロールしているESP32にbluetoothのプログラムを追加してみました。
おっけ~52%!これならまだプログラム追加できる^^
とりあえずあの一連のモニター表示を途中で中断したり、途中から再生したいとか有るかもしれないので可能なようにdemoという変数を作ってコントロールすることに
受信関数はこのように設定してこれをloop()の頭において、デモが進むたびに読み込んで確認するようにしました。
その結果このようになりました
今は文字列を入力していますが、最終的にはボタンにします。
あっ、そうそう最終的なリモコンできるまでの仮としてAndoroidを使用しています。
アプリは「Serial Bluetooth Terminal」という物を使っています。
実はiphoneで接続を試しみたのですが、全く繋がりませんでした^^;
まっ、動画を見てもらうとわかるのですが、
1、送信コマンドが一方通行
2、switchのcaseが終了するまでは受信関数が実行されない。
このため送信コマンドがちゃんと処理されているのか全く分かりません。
出来たら送信したら、すぐに処理されて返信して欲しいw!既読スルーはいやww!
てなことでこうなりました。
青文字が送信文字で緑が返信文字です。(これは簡単なプログラムの追加です。)
さらにメインのloop()がモニター表示の処理途中でもbluetoothの処理をして、画面が停滞するとかもありません。
さて問題ですw今回はどのようにしてbluetoothの処理したでしょうか!?
関連すると思われる記事:
- None Found
|・ω・*)チラッ
ワカリマセン!!
[壁])≡サッ!!
gyoさん こんばんは!
はやwww
回答編のブログも書きましたので週末にでもアップしますw
こんにちは
割込み?はいろいろリソースバッティングしそうだからBTの受信関数をあちこちに仕込んだ?とか。いや、なんかもっと離れ業をやってそうな気がするのでわかりませんw
回答編を期待してます。
それにしても、もうリモコンの原型できちゃいましたね、さすがいつもながらのパワーです(^^)
なおさん こんばんは!
さすが!
そうなんですよ~タイマー割り込み仕込んだんですが動きが変になってしまいましたww
モニターでSPI使って、ほかのarduinoとの連携でI2C使ってとなるとやばいですよねw
そこで、初めは私もあちこちにBTの受信関数を仕込む方法で行くことにしたのですが、それでもやはり即対応をめざすと、アホみたいなプログラムになるのでやめましたww
リモコンの原型プログラム出来ちゃいましたが、ここからが大変ですw
いまそれぞれを動かすためのコマンドで頭がこんがらがっています^^;
こんばんは!
流石6jiroさん、仕事が速い!!
もうBTを使いこなしている!
なんか順調にいって、良いですね! 当方、タッチとLovyanの文字サイズが勝手に変わって、難儀しています(笑)
あっ、BT処理は、割り込みでしょうか? BTシリアルで割り込み処理が起動されませんか? わからないですが。
Vividさん こんばんは!
arduinoIDEのライブラリーとネット情報のおかげで特に難しいこともしていませんのでスイスイですw
あら、文字サイズが勝手に変わっちゃうんですか・・・・・なにやら難しそうですね^^;
今回は割り込みではないんですよ~。タイマー割り込みも考えたのですがうまくいかなくて、
ESP32ならではの方法でやってみました^^。
それが思いのほか便利です^^。
このブログを読んでくれている答えられそうな御3方のコメント出ましたので、早々に回答編をアップしますね^^。