無線ブログ集
メイン | 簡易ヘッドライン |
MODEL 1200FXローテーターその25 (2022/10/29 3:53:09)
ローテーターから常時角度表示をしているESP32DevKitCの親ステーションから、スマフォから角度アスキーコマンドのUDP送信と同じ機能をもたせたるようにしたESP32DevKitCクライアントのスケッチも検討してみました。問題が1つだけあリました。スマフォでPresetGO設定の”M”コマンドのみのアスキー送出動作に関してです。角度の"M090"などは問題なく動作してくれています。PresetGOはスマフォだと動作してくれるのですが、ESP32のUDP送信では動作してくれません。受信データをシリアルモニタでみても同じ受信データなのですが、ESP32クライアントからの"M"コマンドだけは動作してくれません。原因はデータのデリミタが無いためかもと思い”/¥”コードを追加してみたところ動作するようになりました。受信シリアルモニタ上ではスマフォと異なる表示データとなっていますが、動作したので現状OKとします。やっつけ仕事です。Hi
!
UDP送信でのアスキーコマンド送信がスマフォと同じように動作してからは、親ステーションと同じ角度表示をするための親ステーションからのUDP送信のスケッチ追加と、それのクライアント側でのUDP受信スケッチの追加を検討してみました。
先ずは、親ステーション(1200FXをコントロールする側)への角度情報表示しているデータをクライアントへ送出する部分です。内容は簡単で角度情報をクライアントへUDP送信するルーチンの追加だけなのですが、実際にスケッチを考えてゆくと0から255文字までのデータしかアスキーデータは送れない壁に突き当たりました。Webでも上記と同じ問題についての情報が結構ありました。
この壁の内容詳細は、角度で言うと255°を超えた256°は0°となってしまう現象です。これの対策としてはパケットにしてデータを分割送出する手法を取る必要がありました。対策は下記のWebページの方法3を応用して解決しました。(”通信処理では1byteしか送れない”という決まりがあるということです。)
3.0-255より大きい整数や少数を送りたい
1200FXをコントロールしているESP32DevKitC親ステーションでのローテーター角度表示部の角度情報の変数 Readkakudo
を2byteで分割送出するようにしました。例では4byteですが角度では2byte分割送出で済みます。(上位ビット下位ビットをそれぞれの1byteデータを2回送出するという事)TFT液晶に角度表示している箇所で使用している角度情報変数を使います。
〜略
//*********************************************
tft.setTextColor(TFT_WHITE,TFT_BLACK);
tft.setTextSize(3);
tft.setCursor(0,0);
tft.print("Now :");
char ce[4];
sprintf(ce,"%3d",Readkakudo);
tft.print(ce);
//******************************************************************************
// UDP data Send to client (STA mode) add 2022oct24
//******************************************************************************
//udp.beginPacket(ip,localPort);
udp.beginPacket(client_address,localPort);
//Sending Readkakudo to Client Devided data byte High and byte Low add 2022oct25
// int32_t Readkakudo;
uint8_t ReadkakudoLH = (uint8_t)((Readkakudo & 0x0000FF00) >> 8);
uint8_t ReadkakudoLL = (uint8_t)((Readkakudo & 0x000000FF) >> 0);
udp.write(ReadkakudoLH); //send byte Hight data by UDP
udp.write(ReadkakudoLL); //send byte Low data by UDP
udp.endPacket();
//*******************************************************************************
tft.setTextColor(TFT_WHITE,TFT_BLACK);
tft.setTextSize(3);
tft.setCursor(0,44);
tft.print("SET :");
char cc[6];
sprintf(cc,"%3d",kakudo);
//sprintf(cc,"%3d",dd);
tft.print(cc);
//********************************************
tft.setTextColor(TFT_WHITE,TFT_BLACK);
tft.setTextSize(3);
tft.setCursor(0,0);
tft.print("Now :");
char ce[4];
sprintf(ce,"%3d",Readkakudo);
tft.print(ce);
//******************************************************************************
// UDP data Send to client (STA mode) add 2022oct24
//******************************************************************************
//udp.beginPacket(ip,localPort);
udp.beginPacket(client_address,localPort);
//Sending Readkakudo to Client Devided data byte High and byte Low add 2022oct25
// int32_t Readkakudo;
uint8_t ReadkakudoLH = (uint8_t)((Readkakudo & 0x0000FF00) >> 8);
uint8_t ReadkakudoLL = (uint8_t)((Readkakudo & 0x000000FF) >> 0);
udp.write(ReadkakudoLH); //send byte Hight data by UDP
udp.write(ReadkakudoLL); //send byte Low data by UDP
udp.endPacket();
//*******************************************************************************
tft.setTextColor(TFT_WHITE,TFT_BLACK);
tft.setTextSize(3);
tft.setCursor(0,44);
tft.print("SET :");
char cc[6];
sprintf(cc,"%3d",kakudo);
//sprintf(cc,"%3d",dd);
tft.print(cc);
//********************************************
少しかかりましたが、単に角度表示している値をUDP送信するという上記ルーチンの追加で済みました。
クライアント側では、送られてきたUDPデータを受信デコードしてTFT液晶に送出したコマンドと同じように現在の角度を表示させます。loopルーチンの頭にUDP受信のスケッチを追加します。
TFT液晶への表示では、角度数字の桁の位置表示調整をしないと見栄えが悪いので、10以下の場合スペース2文字分、100より下の場合スペース1文字分を入れて右詰め表示で揃う様にしてあります。
void loop() {
uint8_t dataLH;
uint8_t dataLL;
int32_t rv_data;
int rec_size; //recieve data number
// データ受信
if (rec_size = udp.parsePacket()) {
Serial.print("rec_size = ");
Serial.println(rec_size);
counter_100msec = RE_CONNECT; // re connect counter resets.
uint8_t dataLH = (uint8_t)udp.read();
uint8_t dataLL = (uint8_t)udp.read();
int32_t rv_data = (int32_t)(
(((uint8_t)dataLH << 8) & 0x0000FF00)
| (((uint8_t)dataLL << 0) & 0x000000FF)
);
Serial.println(rv_data);
tft.setTextColor(TFT_WHITE,TFT_BLACK);
tft.setTextSize(3);
tft.setCursor(0,0);
tft.print("Now :");
// rv_data value change add blunk for set digit right location
if(rv_data < 10){
tft.print(" ");
tft.print(rv_data);
}
else
if(rv_data < 100){
tft.print(" ");
tft.print(rv_data);
}
else
if(rv_data >= 100){
tft.print(rv_data);
}
}
省略〜
上記のスケッチ追加で親ステーション側での1200FXの現在の角度情報のUDP送信、そしてクライアント側でのUDP角度情報の受信がリアルタイムで出来るようになります。
これでクライアントではスマフォの角度情報送信だけでなく、送った角度情報でローテーターが回転している間もリアルタイムの角度情報を受信することが出来る様になりました。現在のローテーターの位置がクライアントで常時見れます。とても便利になりました。この状態でデバッグをもう少し続けます。
■親ステーション側の1200FX現在のローテーター角度表示
Readkakudoの270の角度情報を常時UDP送信しています。
■クライアント側の常時親ステーションからの角度表示(電源ON後)
Now :270 と親ステーションと同じ位置にTFT液晶表示されています。
なお、使う際の電源ONの手順ですが、起動する順番はローテーター電源を一番最初にONします。次にローテーター側の親ステーションESP32に電源ONします。次にクライアント側のESP32に電源をONにする順番で起動してゆきます。
現在は家庭のメーカーターミナルでWiFiを利用していますが、ESP32のフィチャーでWiFiサーバーが作れる様でなので、ローテーター1200FXのコントロールで試してみたいと思います。ESP32のサーバー機能を使いWiFi-UDP通信へとバージョンアップです。親ステーションから親サーバー化へステップアップします。スマフォにて接続表示されてるWiFiにESP32で設定する自分のサーバーが表示できるようになるということです。こんなことも出来るESP32はやはり凄いですね。最高です。
いまWiFiサーバー化へトライしている最中です。
ほかに、DDS-VFOで使ったシリアルデータ送出でのデュアルコア導入と同じようにUDP通信の受信と送信をデュアルコアで別々に動作させる応用もできそうです。時間があればこれもトライしてみたいと思います。現状特に表示上のレイテンシもなく、リアルタイム動作してくれてますので、気がむけばですが。Hi!
つづく?
execution time : 0.026 sec