jl7gmnのblog

yahooブログから移行してきました。アマチュア無線を中心としたブログです。

スマートフォン

MODEL 1200FXローテーターその25

ローテーターから常時角度表示をしている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);  
  //********************************************

少しかかりましたが、単に角度表示している値を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送信しています。
CIMG9832

■クライアント側の常時親ステーションからの角度表示(電源ON後)
Now :270 と親ステーションと同じ位置にTFT液晶表示されています。
CIMG9815

なお、使う際の電源ONの手順ですが、起動する順番はローテーター電源を一番最初にONします。次にローテーター側の親ステーションESP32に電源ONします。次にクライアント側のESP32に電源をONにする順番で起動してゆきます。

現在は家庭のメーカーターミナルでWiFiを利用していますが、ESP32のフィチャーでWiFiサーバーが作れる様でなので、ローテーター1200FXのコントロールで試してみたいと思います。ESP32のサーバー機能を使いWiFi-UDP通信へとバージョンアップです。親ステーションから親サーバー化へステップアップします。スマフォにて接続表示されてるWiFiにESP32で設定する自分のサーバーが表示できるようになるということです。こんなことも出来るESP32はやはり凄いですね。最高です。
いまWiFiサーバー化へトライしている最中です。
ほかに、DDS-VFOで使ったシリアルデータ送出でのデュアルコア導入と同じようにUDP通信の受信と送信をデュアルコアで別々に動作させる応用もできそうです。時間があればこれもトライしてみたいと思います。現状特に表示上のレイテンシもなく、リアルタイム動作してくれてますので、気がむけばですが。Hi!


つづく?

MODEL 1200FXローテーターその24

エモトの1200FXローテーター側のESP32DevKitCとのUDP通信で角度のアスキーデータを送信するUDP TCP Serverで、目的のスマフォからの角度設定が出来るようになりましたが、設定したキーの固定角度のみでした。任意に角度を設定出来るアプリがないかと少し探してみた所、ありました。UDP Monitor なるアプリです。

■スマフォでの最初のUDP通信コントロールアプリ

CIMG9529

CIMG9563


■UDP Monitor 任意角度設定送出対応可能なアプリ
CIMG9817

■UDP Monitor 操作パネル
CIMG9819

ターゲットとなる親のESP32DevKitCで設定したポートとIPをスマフォアプリUDP MonitorのRemote PORTとRemote IPに設定です。スマフォのローカルIPは自動で設定されます。少し紛らわしいのですが、ローカルポートも同じに設定してます。(別にスマフォ側の受け側のポートということで任意設定可能のようです。サーバー側とは異なって構わないということです。)

■任意角度の設定入力箇所 下側のMessageに送出角度のコマンド仕様設定値を手入力で対応します。
CIMG9820

■Message入力時のスマフォ
CIMG9821

■Message欄への入力例(角度123°を設定)
コマンド ”M123” を入力後右の▷をタッチしてESP32へUDPデータ送信です。
CIMG9822

このアプリはWebのQRZ.COMなどでの局検索での角度情報やハムログでアマチュア無線局のコール登録者検索時に表示される角度を入力すると、そのアマチュア無線局の方位へピンポイントでローテーター(1200FX)が回転して合わせてくれるというわけです。前のアプリの固定設定の角度以外の角度を任意に設定し、UDPデータ化して送信することが出来るということです。
(勿論、利用するWiFiのネットワークは利用可能なネットワークでESP32側もスマフォ側も同じ設定に予め設定しておきます。)

方位角度設定が自由になったのでローテーターコントロール用として、ある程度の利用価値があるアプリかと思います。

ただし、アプリの機能では角度を設定送付するだけなので、少し物足りないです。この点は、アプリにない機能として、クライアント側での設定角度のUDPデータ送出後に親側のESP32から現在の角度情報をUDPデータで常時送出し、クライアント側でこれをUDP受信し設定するまでの角度情報が逐次受取表示出来る様な双方向のUDP通信が必要かと思います。検討し双方向UDP通信で出来る様にしたいと思います。ない機能は考えて製作するしかありません。これが出来ると、基本機能が充実した事になり、一段と利用価値が上がると思っています。

つづく?






MODEL 1200FXローテーターその23

一連のスマフォUDP通信でのリモコンもどき制御と、Logger32モード時の動作確認も上手くいき、今まで動作確認を続けてきていますが、特に問題となるような動作も無く、ほぼケースに組んでも良いレベルになった気がします。ここまでたどり着くまでは、単に今までは動作させるために、新たにインターフェースを追加したりといった気の赴くままの対策を講じていった結果、うまく動作しているので良いと考える節もありますが、よくよくあらためて考えてみると少しパーツが増えている、いわゆる冗長な状態のインターフェースになってしまっています。一番最初の頃のRS232Cインターフェース構成はArvelの232Cインタフェース+レベル変換IC回路追加でESP32DevKitCのシリアルポートRX,TXに接続していました。専用ICなので使用するコンデンサの数が少し多く、追加回路として実際に使用を考えるとテストでは良いのですが、実装(パターンにいれる)するには不向きでした。その後は、Arvelの232Cインタフェースとレベル変換回路とを1つのインタフェースで対応できるという秋月電子の超安いAE-FT234XDを使いました。
(このAE-FT234XDをTS820SのDDS+VFOからのシリアル通信用インタフェースとしてPCに繋ぎWindow10でのハムログでの周波数読み取りで問題なく使用しています。)

AE-FT234XD

わたしのテストする環境が古いWindows(XP)を使うという確認方法が悪いのが原因なのですが、古いPCでは、これが曲者で、デバイスドライバーが機能したりしなかったりと言うことがあり古いWindowsPCでも新しいWindowsPCでも安定に動作する様に新たに、Arvelの232Cインターフェースと9pのソケット付きのレベル変換回路での構成に変えました。コレはPCとの接続はArvel+レベル変換回路を通してESP32DevKitCのシリアルRX、TXポートに繋がるのですがPCとESP32DevKitC間には2つのデバイスが存在している状態です。

232レベル変換回路

なのでシンプルなAE-FT234XDより安定に動作してくれるレベル変換機能のあるRS232Cインタフェースがないかと(安いのが条件です。Hi!)ヤフオクを見ていたら、目的に対応する232Cインタフェースが安い価格で出品されていました。使用方法は、無線機FT-857のシリアル通信用関連で使用していたようです。早速オークション参戦です。このようなインタフェースを使う人は限られているせいかあまり参戦者が多くなく、超破格値で落札出来ました。新品で今も販売はありますが1K以上はする様です。


範囲を選択_339

ESP32DevKitCに接続で使用する線種はFTDI232のピンは6本ありますがその内の
2:RX、3:TX、4:VCC、6:GND の4本を使います。

ピンを手前にして上から見てのピンの割り当て名(設定ピン)
1:DTR
2:RX
3:TX
4:VCC
5:CTS
6:GND

今までの変換回路に繫いだESP側よりの4本の線はそのままFTDI232の
上記4本に接続して使用します。レベル電圧も5Vと3.3VがPINコネクタで
選択設定出来るので、ESP32DevKitCのI/Oレベルに合わせ3.3Vに設定して
使います。

早速、実際に今までのインタフェースと交換して動作も確認してみました。
FTDI232

このFTDI232インタフェースに繋がるUSBコネクタケーブルは少し古く大きめのプラグタイプですが、PC側は通常のUSB2.0のコネクタなので、問題はないです。

新しいWindow10では、デバイスドライバーのインストールも要りませんでした。
プラグアンドプレイ的に動作してくれました。FTDIのデバイスドライバーは以前のAE-FT234XDを使用の際にデバイスドライバーをFTDIのデバイスドライバのWEBページよりインストールして使用していましたので、その時に関連するデバイスドライバーがインストールされていたんだと思います。Hi!
今後は、テストで使うWindowsは、セキュリティの関係上,Wndows10でのテストにてしていこうと思います。(あまりにも古いWindowsで確認しても実際に使われる環境ではないし、また実際的でない事より)

仕上げのケースはWiFiのUDP通信を使うのでシールド効果のないプラスチック製にしよう!と決めてはいます。他組込用パーツの設置方法を考えたりするのですが、SW類はどのタイプのSWを使ったら良いかとか、TFT液晶の窓はどのようにしたら良いのかとか、少し迷っていいます。

いま、1つ大事な事を確認していない事があるのに気づきました。基板上の電源回路です。今はESP32DevKitCへの電源供給はUSB端子からコンパイル書き込み含めPCから供給なっていますが、実際はコンパイルして書き込み後はこのESP32DevKitCのUSBは外して使うことになります。なのでUSB以外の5Vの電源を供給する必要があります。この外部供給用の5V用のレギュレータ回路はパターンに組んであるので、その入力側の8Vから12Vぐらいの電圧のDCアダプターを繫いで,動作確認をしなければなりません。

明日は、朝から忙しいので、午後にDCアダプターを探して繫いで確認してみたいと思います。

つづく?

MODEL 1200FXローテーターその22

エモトのローテーター1200FXをスマフォのUDP通信を使いリモートコントロールするための基板作製も完了し動作上のスケッチ修正もほぼ終わり仕上がりが近くなってきていますが、基板完成後まだ一度も確認していないスマフォ操作時に使うESP32DivKitCの各ポートに繋がる下記のSW類の動作確認が残っています。

IO32(Pin7):Logger32とスマフォUDP切り替えSW
IO33(Pin8):角度プリセット(90°)
IO26(Pin10):DOWN(-1°)SW
IO27(Pin11):UP(+1°)SW
IO14(Pin12):15°UPorDOWN SW
IO12(Pin13):設置角度停止時のCWまたはCCW回転用リセットSW
IO13(Pin15):15°UPorDOWN SW

タクトSW位置は操作しやすい様に並べて入れ替えてあります。
左から順番に
−1°SW、+1°SW、プリセット90°SW、リセットSW、±15°SW、±15°SW
CIMG9726

☆ポートIOに繋がるSWの動作説明 ----------------------------------------------------------------------------------------------
IO32:Logger32とスマフォUDPリモコンのモード切り替え(タクトSWでなく切り替え式SW)
”H”時(Logger32モード)
”L”時(スマフォUDPリモコンモード)

上記IO32以外は全部タクトSW(プッシュSW)を使用します。
IO33:プリセットタクトSWはローテーターをいつも決めた方角に止める為に設定する(任意)角度を設定するSWです。私タワーのアンテナでは西方向または東方向を定位置方向としているのでプリセットは90°または270°のどちらかにしますが、現在は90°にしてあります。このSWを押すと設定角度に90°と表示されるので、スマフォのUDP設定ボタンPreset-GOボタンを押すと ”M”コマンドが送出されて90°の設定角度へ回転してゆきます。(風が強く吹く方向にフロントもしくはバックを向けておく風対策の一つにしています。)

IO26のSWの1プッシュでー1°角度を減らします。
IO27のSWの1プッシュで+1°角度を増やします。

IO14のSWの1プッシュ毎の動作
0°→15°→30°→45°→60°→75°→90°→105°→120°→135°→150°→165°→180°→
195°→210°→225°→240°→255°→270°→285°→300°→315°→330°→345°→360°
→345°→330°→315°→300°→285°→270°→255°→240°→225°→210°→195°→180°→
165°→150°→135°→120°→105°→90°→75°→60°→45°→30°→15°→0°
IO14とIO13は回転の抜きが360°の折り返し時に反転してしまうので方向極性はあえて付けていません。この2つのSWは相反する動作をします。
IO14の動作は、このSWを1プッシュする毎に0°からは360°までは下記の様に+15°ずつ増やしてゆきます。角度が360°になると逆方向へで15°ずつ減らしていきます。
IO13のSWはIO14がの動作時には逆のの方向に動作します。逆にIO14がの動作時にはIO13はの方向に動作します。

IO12のSWは角度設定動作完了後にCW,CCW方向へ動かせるようにするための設定後の角度を強制で変更するSWです。スマフォUDP通信で設定角度に設定後は設定角度と現在の角度が同じなのでスマフォのCW,CCWのコマンドは動作しない状態です。このSWで現在の位置角度により360°または0°に自動判断で設定角度を設定しUDPのCW,CCWが動作出来る様にします。単独で設定角度に関係なくローテーター角度をスマフォUDPコマンドのCW,CCWで方向を合わせたりしたい時用のリセットSWです。
---------------------------------------------------------------------------------------------------------------------------------------------
CIMG9731

先ずはSW類の接続です。タクトSWがたくさんあるので、ブレッドボード上に取り付け、ボード用線材で配線を行ないました。

肝心の各タクトSWの動作確認ですが、TFT液晶での表示も全く変な表示はありませんでした。意外とすんなり各タクトSWの動作チェックが完了しました。

スマフォでの各操作の確認は、もう少し続けたいと思います。
別途、Logger32の動作するWindows10の動作がかなり遅い状態なので、これも少し原因を確認したいと思っています。

つづく?

MODEL 1200FXローテーターその21

色々と操作の確認をしていて、とても重要な問題に気づきました。前回に行なったスケッチでTFT液晶表示のフォントサイズの変更を行なった事による問題です。TFT液晶表示の為、スマフォとLogger32の切り替えを明確化するためにモード選択SWの判定ルーチンを新たに追加しました。(追加前もモード選択SWのルーチンは既にあったのですが、別のルーチンとして動作で使いませんでした。)このスケッチによる変更修正による表示動作に関しては特に問題ありません。
問題の内容を説明します。この変更修正前のルーチンでの動作では、スマフォのUDP通信モードに於いてもLogger32のDX Spots map上のインジケータが連動動作していました。いわるるノイマン型でスケッチしていましたので、シリアル通信でのLogger32へのローテーターの現状角度データ送出もスマフォ選択時にも行われるスケッチでした。しかし、TFT液晶スケッチ変更修正(新たにTFT液晶表示の為のSWの検出分岐)によりスマフォモード選択時はスマフォモードの処理のみ、Logger32の選択モードではLogger32の処理のみとして動作する状態に変えてしまいました。ついついTFT液晶表示のみを考えてしまったスケッチにしたことにより、新たに問題を自ら作りだしていました。スマフォモード選択時のLogger32へのデータ送出がされない状態にした事です。スケッチ変更修正後でのスマフォ選択時動作はLogger32のDX Spots mapの現在インジケータ指示は動かず停止したままの状態となってしまったのです。この状態で発生する問題があります。スマフォ選択モードとLogger32のモードを切り替えた時の角度の違いによる問題です。簡単に説明すると、Logger32からスマフォ選択に切り替えた時に、スマフォの最終UDPコマンドとLogger32の最終設定角度(マウスによる角度設定赤のライン)が違っていると切り替えた瞬間にローテーターがスマフォ設定角度に動いてしまう現象が起きてしまいます。この現象を避ける為にもスマフォ選択時もLogger32のDX Spots mapも連動していることが必要です。つまり最終のLogger32の現在位置(マウスで赤ラインでクリック設定した角度)をモード切り替えSWでスマフォ選択する前に、予めLogger32の角度と同じ角度をスマフォのUDPコマンドボタンで押して設定角度を同じにすることができれば問題は発生しません。

Logger32の最終設定角度(マウスによる赤ラインでのクリック設定)
CIMG9721

予めLogger32のDX Spots mapのマウスでの赤ラインの角度にスマフォ
設定に切り替える前にUDP通信でM180のコマンドを送付設定したあと
で切り替えた時のTFT液晶表示。
CIMG9722

切り替え時の設定角度差が2°、3°度位の時の即収束動作するケース以外は、同じ設定角度(0°、±1°以内)になるので、全く動くことはありません。
切り替えをスマフォ選択時からLogger32選択時への切り替え時も全く同じです。スマフォの設定角度表示されている値に、Logger32のDX Spots map上の同じ角度を赤ラインで合わせマウスでクリックすることで、同様に設定角度を同じにする事が出来ます。ラフにクリックでも問題ありません。(同じ角度になる操作を実際に確認してみると、±1°より大きな数°の角度違いは、即収束動作してくれるので、問題はないようです。)

スマフォ設定時にUDPで180°設定にしておきLogger32のDX Spots map
上でマウスで赤ライン180°クリックしてからモードSWを切り替えた時
の値です。
(クリック誤差による±1°差は問題無く動きません。仕様です。)
CIMG9725

1200FXの指示によりリモート端子から出ている電圧が元の角度情報
源です。
CIMG9723

この問題に対してのスケッチで行う対策としては、モード切り替えSWの新たに追加した判断ルーチンは削除し、スマフォのUDPモード選択時もLogger32からの周期的に送られるタイマーコマンド”C”に対して現在のローテーター角度データを返送するスケッチに戻します。TFTの表示だけは既存のモードSWスケッチルーチンがあるので、表示が問題時と同じになるようにスケッチを再検討し修正します。

既に修正実施して、表示も前と同じ表示をするようになりました。今の所は問題なく動作してくれています。その他、外部SW(プリセット、+15°UP、-15°DOWN、+1°UP、-1°DOWN、がたくさんあるので、これらのSW操作でのTFT表示についてのデバッグも行う予定でいます。

実際に使って動かし、デバッグ確認しながら改善修正のコーディングする事は毎回必要な状態が起きていますが、1回で上手くいった時のコーディングより、スケッチのルーチンの構成の勉強にはなります。

つづく?


アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード
  • ライブドアブログ