jl7gmnのblog

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

2022年04月

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

エモトのローテーター1200FXをハムアプリケーションのLogger32のローテーターコントロールで動かす為のUDP通信上でのシミュレーションコマンド制御が上手く行きましたので、スマフォ側での操作専用の制御コマンドを追加しました。追加と言っても、既にESP32DevKitCにあるプリセット値を+1カウントアップするSW、または−1カウントダウンするSWと同じ動作をスマフォのボタンで行う追加です。スマフォ側はボタンのラベル設定とコマンド値設定および、CR自動追加設定は他のどのコマンドボタンとも同じ設定方法です。また、プリセット値用以外にローテーターのプリセット後動作完了後のリセットSWと同じボタンも設定しました。またプリセット角度0°のボタンも追加しています。

スマフォ設定はボタンのラベル設定とコマンド設定(アスキー文字)だけです。
Z:プリセット動作完了後のCW、 CCWスマフォボタン操作イネーブルとするリセット
D:プリセット値−1(DOWN)
U:プリセット値+1(UP)

CIMG9572

UDP通信で送信される追加コマンドがESP32で組んだデコードスケッチでデコードされるので、後は分岐ルーチンへの対応するスケッチを追加コーディングしてゆくだけです。

switch構文に追加した上記のコマンド(Z, D, U)のスケッチです。
switch(i[0]){
  case 'Z'://preset is finish then enable CW CCW button
            RotSTOP();
            if((((delta == 0)or(delta ==1)or(delta == -1)))and((Readkakudo >= -5)and(Readkakudo <= 180))){
               kakudo = 360;
               s = 48 ;
            }
            if((((delta == 0)or(delta ==1)or(delta == -1)))and((Readkakudo > 180)and(Readkakudo <= 365))){
               kakudo = 0;
               s = 0 ;
            }
            kakudo=kakudo;
            if((Readkakudo == 360)or(Readkakudo == 359)or(Readkakudo == 361)){
                 if((delta == 0 )or(delta == 1)or(delta == -1)){
                     kakudo = 0;
                     s = 0;
                  }
             }
             break;
 case 'U'://preset +1 When push UDP Apprication PRESET-UP button
             udpupdn = 1;
             kakudo = kakudo+udpupdn;
             udpupdn = 0;
             if(kakudo > 360){
                kakudo = 1;
             }
             kakudo = kakudo;
             break;
 case 'D'://preset -1 When push UDP Apprication PRESET-DOWN button
             udpupdn = -1;
             kakudo = kakudo+udpupdn;
             udpupdn = 0;
             if(kakudo < 0){
                kakudo = 359;
             }
             kakudo = kakudo;
             break; 
            
以下省略〜

ESP32DevKitC側には15°ずつアップまたはダウンするSWがありますが、スマフォには追加しないことにしました。先ずスマフォの操作ボタンが多くなると煩雑になってしまう事と、15°ずつのアップダウン操作は出来ませんが、既にボタンに設定してある0°、90°、180°、270°、360°のプリセットボタンが45°ずつですので停止ボタンとの組み合わせて十分プリセットが出来るからです。これらのプリセット角度ボタンの近い角度ボタンを押してローテーターの回転し始めで停止ボタンを押すと回転が止まります。この状態でプラスマイナスのスマフォボタン操作で1°ずつアップまたはダウンにて目的とするプリセット角度に設定が十分可能だからです。設定し終わったらPRESET-GOボタンを押すだけです。ESP32DevKitCのPRESET-GOと同じでプリセット動作開始操作となります。
他、スマフォの0°、90°、180°、270°、360°のプリセットボタンはどれもホームポジションに設定出来るボタンとして考えても良いかと思います。また、ESP32DevKitC側にはホームポジションとして90°だけSW設定していましたが、スマフォのアプリボタンに任意の角度をコマンド設定すれば自分専用のホームボジション角度設定が簡単に出来ます。ESP32DevKitCのスケッチ追加などは不要です。M***の***の角度設定コマンドをボタンに設定するだけです。
自分のアンテナのホームポジション角度を設定する場合、北を0°として右回転で359°までの間の角度のうち例えば、135°がホームポジション角度だとするとスマフォアプリのコマンドは M135 を設定でOKという事です。
下記は90°のプリセットですが、labelを ”PRESET135", commandを "M135" にするだけです。
ラベルは任意です。ボタンに表示するラベルですので HomePosition でも他何でもOKです。
CIMG9567

一通りESP32DevKitC側の操作SWの全機能はスマフォのアプリボタンに設定出来ました。
動作確認は続けていますが、今の所はスマフォ制御にて変な動作は全くおきていません。

つづく?

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

変な時間に目を覚ましたので、ローテーターのアプリケーションでのシリアル通信による方法をスマフォのUDP通信を利用して、疑似シミュレーションをしてみることにしました。疑似シミュレーションとはいえそのままシリアル回線を繋ぎ送られてくるシリアルデータをアスキーコマンド文字に変換するだけのルーチンを組めばそのままアプリでのローテータプリセットが動作します。先ずはアプリケーションから送られるコマンドを確認しました。これは有能なハム用アプリのLogger32でローテーターコントロールに対応するYAESUのGS232A(B)の水平角度セット関連のコマンドを一部ですがそのまま使用します。GS232A(B)の取扱説明書からの確認です。

R [ENTER]:右回転
L [ENTER]:左回転
A [ENTER]:右回転または左回転の停止(ストップ)

Mxxx[ENTER]:水平ローテーターの角度セット(水平ローテーターの方向が、xxxになるまで回転
(000〜450 または 360   数値を3桁で入力)

上記が設定した主なコマンドです。現在の角度チェックコマンドの C[ENTER] はディスプレーに表示されているので不要で使いません。アプリケーションで動作上必要な場合は組み入れることにしています。

これをスマフォのアプリ(UDP TCP Server)に設定します。
CIMG9563

Button configへのCCWのラベルとコマンド”L”の設定です。
CIMG9564

STOP(停止)コマンド ”A"の設定です。
CIMG9565

CWのコマンド ”R”の設定です。
CIMG9566

アプリケーションからの送信を想定したMコマンドでのプリセット角度90°の設定です。("M090")
CIMG9567

他の角度180°、270°、360°もボタン5,6,7に同様に設定しています。

もう一つ必要なのがアプリケーションとは関係なくディスプレー側に付く角度ステップSWでのプリセット値に対して動かす為のコマンドも設定してありあす。PRESET-GOラベルで”M”に角度xxxの付けない場合の特別なアプリケーションとは関係ないコマンドをボタン8に設定しました。
コマンドMの解析で角度プリセット値が無い場合の処理で対応しました。
CIMG9568

なお、コマンドはアスキー文字です。それとコマンド仕様通りにアスキー文字の後には自動でCR(キャリジリターンキーコマンド)が付くようにアプリの Settings で add Carrige Return に☑チェックを入れておきます。
(注意事項としてGS232A(B)のコマンド説明の中に”LF”コマンドは入れない様にとあります。)
こうすると自動で CCWの場合 ”L”、"CR"がスマフォのCCWボタンを押すとコマンドで送出されます。


これをESP32側でデコードします。
  char i[64];
  j = udp.read(i,64);
  i[j]='\0';

アスキー文字は数値で表示されますが、コマンドはi[0],i[1],i[2],i[3],i[4] .....の配列に入ります。
単体のコマンドはi[0],i[1]に入ります。CCWだとコマンド”L”なので、それぞれデコード値は"76","13"となります。

プリセット角度付き設定コマンドの場合はi[0],i[1],i[2],i[3],i[4]にアスキーコードで入ります。
プリセット90° の場合 コマンド "M090" です。

コマンドでのデータを文字としては入手出来たのでプリセット付き設定コマンドの場合は角度を抜き出します。100°以下の場合角度が3文字で0が入るので、Mより後が角度データですので文字数値変換で0を取り除きます。"090" を数値の90にします。100°以上は問題なく3桁の整数値に変換されます。

主な変換部です。
substringを使い1文字目+1以降全部を抜き出します。"090"
 String kakudomoji =gattai.substring(1);  

文字を数値化します。整数値の90に変換されます。
int32_t suuchikakudo =0;
                   suuchikakudo = kakudomoji.toInt();
後はメインルーチンで角度設定用変数 kakudo にプリセット値のsuuchikakudo を入れればプリセット値の角度になるまで動いてゆき自動収束動作後にローテーターが止まります。

なおコマンド毎の動作はswitch 構文で コマンド自体のi[0]で分岐処理しています。

 switch(i[0]){
        case 'A':
            RotSTOP();
            Houkou = 0; //CW:1 , CCW=2
          //digitalWrite(ledccw,0);
          //digitalWrite(ledcw,0);
          break;
        case 'L':
            RotCW();//change
            Houkou = 2; //CW:1 , CCW=2
          //digitalWrite(ledccw,1);
          //digitalWrite(ledcw,0);
          break;
        case 'R':
            RotCCW();//change
            Houkou = 1; //CW:1 , CCW=2
          //digitalWrite(ledcw,1);
          //digitalWrite(ledccw,0);
          break;
以下省略〜

上記の設定でアプリケーションを想定したコマンドでも動作するようになりましたが、やはり問題はありました。自動収束動作をさせた為にプリセット値とリアルタイムの角度データの差分が−1で停止もあるのでこの時に次のプリセットの動作方向が逆に動いて行くエラーです。対策としてプリセットで使用した差分値は使わずにプリセット停止状態の時のリアルタム角度とアプリからのコマンドプリセット値による別の差分値で利用することで新たなプリセット角度コマンドとのプリセット差分はCW方向でもCCW方向でも正常動作するようになりました。
Logger32でのローテーターコントロールは画面上の任意?角度の位置をクリックした時に例えば90°の位置だった場合コマンドの[M090][CR]がシリアル出力されるのだと思います。想像なので実際のアプリのシリアル値や操作も確認しないといけないですね。
今回の疑似アプリ対応スケッチはもう少し色々設定操作して問題がないか見てみます。

つづく?

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

エモトの1200FXローテーターのスマフォでのUDP通信でのコントロールスケッチはどんどん進化させています。今回はプリセットSWの設定出来ていない細かな角度のスプレッド設定(昔作製した短波真空管ラジオにつけていたメインバリコンとスプレッドバリコンでの細かい周波数合わせ込みが出来る機能に似てるのでスプレッド設定の言葉を使用しました。)が出来る様にしました。プリセットSWがメイン角度設定用とすると、スプレッドSWとして±1°単位での細かな角度設定機能が追加されたことになります。このスプレッドプリセットSWを追加することで角度プリセット値は0°〜360°まで1°ステップで設定が可能となりました。元々の仕様も分解能1°としましたので仕様通りに使用することが可能となりました。これはアマチュア無線用のアプリケーションに搭載されているローテーター角度プリセットなどのシリアルデータ方式での制御で行なっている様に今回のローテーター制御に対応させる場合に1°単位でのデータであれば0から360°の範囲で角度プリセット制御は出来るということでもあります。まだまだ他のアプリのローテーター制御のフィーチャー追加は先の事ですが Hi!
追加した±1°の対応するSWは下記の右側の茶色のタクトボタンSW2個です。白い線が繋がる左側のSWが−1°ずつ角度を減らします。橙色の線が繋がる右側のSWは+1°ずつ角度を増やします。

追加となった±1°用のプリセットSW2つ(右端2つ)
CIMG9559
左から順番のSWの動作
1.−15°ずつの角度プリセットSW
2.+15°ずつの角度プリセットSW
3.スマフォのアプリの回転開始用CCW SW, CW SWのイネーブルリセットSW(プリセットされた後は機能しない状態SWの強制押下可能化解除用SW)
4.アンテナのホームポジションSW(スケッチ上であらかじめコンスタント値として設定)
5.今回の-1°設定のスプレッドプリセットSW
6.今回の+1°設定のスプレッドプリセットSW

新たに追加は5と6です。
角度の360°と0°のところの動作は下記の様に同じ位置である(0°)と(360°)は2回表示ならない仕様にしました。
0°から-1°した時の角度表示は 0°(360°)→359°
360°から+1°した時の角度表示は 360°(0°)→1°

新たに追加のSWの使い方としては、大まかに±の15°SWで目標のプリセット値の近くまで設定してからスプレッドプリセットSWの±1°ステップで設定値までもってゆき合わせるやり方になります。ざっくり合わせてから細かく合わせ込むというところですね。


プリセットは単に角度の設定値にあわせて停止するのですが、実際のローテーターはアンテナがあり回転の勢いがあり設定値で止めるとオーバーラン状態です。停止手前でコントロールを停止してやる必要があったりとスケッチ上の工夫が必要です。特に1200FXではスピード設定ツマミがあるので、スピードの速い時と遅い時では、事前停止の位置のスケッチを変える必要が出てきますので、基本仕様としたのはスピードの中間設定時を標準としてスケッチしました。また、位置情報の電圧値をA/Dコンバーターで検出して角度に変換している方式なので、A/D変換にも変換誤差があったりします。またローテーター自体で使用している角度電圧を発生する回路部品の直線性等も精度に影響がでる要素の一つでもあります。また、角度電圧値として使用するA/Dコンバーター入力信号自体のノイズもA/D値への変換誤差に現れます。角度電圧のA/Dコンバーターでの読み値を2000回の平均値を使う事で突出値は平均化されていますが、別のノイズがある様で入力段へのLPFの組み入れの必要性があります。実際LPFを入れないとA/D変換値が相当バラツキます。停止していても値が動くという問題です。何も無いと補正してもそれ以上にバラツキが出る所です。LPFの積分値を大きくするとノイズは減りますがその分リアルタイムの電圧読み取りが出来なくなるので、停止精度に影響が出てきます、電圧値の遅延がない程度の適度なノイズを取るだけの軽いLPFにする事も重要です。ここの精度もかなりの位置ズレとして効いてきます。プリセットした角度の値とは異なった表示角度で停止するのは当たり前と思わなければなりません。シビアに捉えると、このズレは現状の補正を今以上に精度を上げた補正にする必要がありますが、実用上を考えた場合特にHFで使用する実際のアンテナを考えると、ビームでも半値角(半値幅)も意外と広いので2°3°のズレは全く影響はないと言えます。もっと言うと15°ずれても交信には全く問題ないです。これはアンテナを回して受信の信号の強さを見てると自ずと納得出来る内容です。またアンテナの設置上の位置ずれがあったりすると全く持ってして、角度精度は意味を持たなくなることは容易に理解出来ます。精神的な点で気にしてるだけと言っても過言ではないのであまりシビアに設計はしなくてもいいかと思います。HFはある程度の精度(プラスマイナス5°以内)であれば実用上全く問題無いと私は思います。UHF帯、ましてSHF帯は違いますがHi! プリセット値に対しての精度は±1°以内に出来ます。
方角合わせ込み精度には余り関係がないプリセット値への回転停止制御ですが、今回はプリセット値に対しての自動収束をする様にスケッチを組みましたので、間違いなく設定した値と同じA/D読み取り電圧の角度表示が同じになるまで制御動作を行ないます。特に±1°以内で停止した場合でも本来は問題ない停止位置ですが、今回は±0°になるまで制御し続けます。多少時間がかかるのは止まった位置による事がほとんどで、多少はバラツキありますが、いつの間にかドンピシャになっています。ほっておけばプリセット角度と同じ角度で止まってくれます。面白い事に今回の追加SWでの+1°、または-1°を押して行くと追従して角度を合わせ込み始めます。ポンポン押して+3にしても押している間から合わせ込み動作しますので追っかけて来る感じといえば解るかと思います。面白いです+6°より大きな差になると制御は止まる様にスケッチしてますが、いくら早くSWを押してもリアルタイム追従するので、追従を止めるまでは出来ませんでした。

ここの所ローテーターのプリセット確認を色々飽きるくらいやっています。気づいたのはスケッチのmap機能をつかった時の0°以下にした時の時のmapでの設定値が以上に大きな値になることがありました。動作上はエラーは無いですが、値が気になっています。使い方がまずいのかもしれません。少し見てみようかと思います。

つづく?

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

ESP32DevKitCをブレッドボードの大きい方に作り直しました。ユニット毎に線材で繋がっていたので煩雑だったのでこれでだいぶスッキリしました。
少しの間ですが、かなりのステップアップを行ないました。
その一つとしてプリセット角度設定用の15°づつ変化させるSWが1つでしたが逆向きに変化させるSWの追加を行ないました。また、プリセットの方向に一致した時にはスマフォからのLEFT、RIGHTボタンが効かなくなるので(当然プリセット完了後もプリセット機能が動いているため)強制的に0°から180°のプリセット完了後にSWで360°にする事でLEFT、RIGHTボタンが使用出来る様になります。同様にプリセット181°〜360°内のプリセット完了後にSWで0°にするSWです。リセットSWの様なものです。Hi!
もう一つ追加のSWはホームポジションプリセット設置ボタンです。いつもお決まりの位置に向けるプリセット値での固定(今は90°設定で私のアンテナホームポジションにしてみました。)です。押すと90°のプリセット設置値になります。

CIMG9533

CIMG9538

左がプリセット選択SWそのとなりが左の逆動作するプリセット選択SW
左から3番目はリセットSW(プリセット完了後に押す為のプリセットを0°または360°にするSW)
一番右がホームプレリセットSW(いつも90°で優先に設定されます。)
CIMG9534

スマフォからのUDP通信でおくられるアスキーデータのLEFT、RIGHTコマンドを受けると対応して光ります。排他的に光ります。
CIMG9541

1番上が読み取りADコンバータから算出補正処理したリアルタイム角度表示用
2番めがプリセット方向表示
3番目はスマフォからのコマンド(数値アスキー)表示です。
CIMG9540

プリセット方式は自動である程度カウントが収束するようににスケッチを組みました。見てると面白いです。特にプリセット停止時±2カウント位では上手く±1°または0°にしてくれます。

 

±1カウント時には微妙に収束機能が働いていてプリセット値とリアルタイム角度差分0を目指してCW、またはCCW信号を繰り返し送ってくれます。LEDが点滅するので動いているのが分かります。プリセット動作時はCW、またはCCW時は完全に対応するLEDは点灯しています。



フマフォはアンドロイドでアプリケーションのUDP TCP Server を使っています。他のアプリケーションコマンドボタンのものでは、誤動作がありましたが、このUDP TCP Serverは良く出来ていると思います。エラーはいままで一度もありませんでした。オススメです。

CIMG9547
キーの設定はボタン名そのものです。

CCW :反時計方向で回す手動ボタンです。
STOP:回転を止めるストップ機能ボタンです。
CW   :時計方向で回す手動ボタンです。
PRESET-GO:呼んで字の如くプリセット値へ向けて回転-GO!です。後からフィーチャー追加しました。
前回のスケッチでのUDP通信はESP32に書き込みした後には、SSID パスワードでの通信接続するためにはスマフォからWiFi回線を一端切ってまたオンにする必要があります。何とか自動で出来たら良いのですが、私のレベルでは今は手動でWiFi回線をON-OFF-ONで対応です。その後上のUDP TCP Serverアプリを起動するとすぐ繋がります。この通信が上手くできているかの確認としてSTOPボタンでコマンドがTFT液晶の一番下に表示されればUDP通信は上手くできている事になります。UDP通信の確認にコマンド表示は役に立ちます。Hi!
CW 、CCWと押すとボタンの方向に合った回転をしてくれます。最初はSTOPボタンとの3つのボタン操作で実際のアンテナを動かして遊びました。また、面白いことに家の外までUDP通信が出来るので、タワーの下からスマフォでローテーターを制御出来たのは感激でした。スマフォのUDP通信でのローテーターコントロールはとても便利この上ないです。その後には追加機能のプリセットボタン(PRESET-GO)機能を検討し追加しました。まだまだ調整して詰めるところもありますが、それを検討するより、プリセットしては回転させ、いろいろな角度とかでの動作を試すのが結構楽しいものです。自動で収束する様な仕様にして正解だったかなと思います。

つづく?

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

ローテーターの角度表示が上手くいったので、次のステップとしてスマフォからのコントロールをやってみることにしました。
結果から言うと上手くゆきました。

スマフォでのコントロール

ESP32のUDP通信機能を使い、スマフォで使えるUDP TCP Serverという素晴らしいアプリケーションがアンドロイド用にあります。ほかにも幾つかありましたが、他のものではエラーデータが時々発生して上手くなくこのUDP TCP Serverアプリがとても安定したアプリでしたので採用しました。
参考にしたWebです。

CIMG9529
今回はローテーターの角度表示のESP32DivKitCとは別のESP32DivKitCボードを使い実験しました。
上手くいったので、後で表示用のESP32に移植します。(ポートを選んで組込)表示用のESP32はTFT接続ポートも結構あり、他A/Dポートの関連で2つのポートもあります。これら以外で2つのポートを選んで組込します。

CIMG9526

スマフォからのUDP通信で アスキーデータをESP32で受けてフマフォのCCWボタン、CWボタン、OFFボタン対応のアスキーデータをデコードして、ポートに出力するという単純な動作です。ポートにはNPNトランジスタスィッチング回路が繋がって、オープンコレクタ出力がREMOTE端子へ繋がりON/OFFSW代わりとなります。CWとCCWの2つのトランジスタのスィッチング回路で対応です。

ESP32DevKitCのスケッチです。

// ESP32_WiFiUDP
// 2022APR16

#include <WiFi.h>
#include <WiFiUdp.h>

const char ssid[] = "***************"; //ご自分のルーターのSSIDに書き換えてください
const char pass[] = "***************"; //ご自分のルーターのパスワードに書き換えてください

const int localPort = 9999;      // ポート番号

const IPAddress ip(192, 168, 4, 3);       // IPアドレス(ゲートウェイも兼ねる)
const IPAddress subnet(255, 255, 255, 0); // サブネットマスク

WiFiUDP udp;
const int ledccw = 4;
const int ledcw = 0;

void setup() {
  Serial.begin(115200);

  WiFi.softAP(ssid, pass);           // SSIDとパスの設定
  delay(100);                        // 追記:このdelayを入れないと失敗する場合がある
  WiFi.softAPConfig(ip, ip, subnet); // IPアドレス、ゲートウェイ、サブネットマスクの設定

  Serial.print("AP IP address: ");
  IPAddress myIP = WiFi.softAPIP();
  Serial.println(myIP);

  Serial.println("Starting UDP");
 
  udp.begin(localPort);  // UDP通信の開始(引数はポート番号)

  Serial.print("Local port: ");
  Serial.println(localPort);
  pinMode(ledccw,OUTPUT);
  pinMode(ledcw,OUTPUT);
}

void loop() {
  int j,k;
  char i[64];
  while(1){
    if (udp.parsePacket())
    {
      j = udp.read(i,64);
      i[j]='\0';
      Serial.print(i[0]);
      Serial.print("\n");
   
      k = atoi(i);
      Serial.print("k= ");
      Serial.println(k);

      switch(k){
        case 0:
          digitalWrite(ledccw,0);
          digitalWrite(ledcw,0);
          break;
        case 1:
          digitalWrite(ledccw,1);
          digitalWrite(ledcw,0);
          break;
        case 2:
          digitalWrite(ledcw,1);
          digitalWrite(ledccw,0);
          break;
        case 3:
          digitalWrite(ledccw,0);
          digitalWrite(ledcw,0);
          break;
        case 4:
          digitalWrite(ledccw,0);
          digitalWrite(ledcw,0);
          break;
        case 5:
          digitalWrite(ledccw,0);
          digitalWrite(ledcw,0);
          break;
       default:
          break;
      }
    }
    delay(100);
  }
}

スマフォでの使用は0,1,2の3つです。
0:停止
1:CCW
2:CW
数値3から5までは予備ボタンスケッチで0と同じ停止です。(停止コマンドとして設定)
スマフォのアプリではNumber of buttons in use で表示ボタンを任意に決めることが出来ます。ここで表示しない設定なのでスケッチがあっても問題はありません。
ESP32の出力ポートについてですが、そのままでの動作では同時出力もなりますので、ポート出力(CW,CCW)は排他的にしなければなりませんので、動作メイン設定以外の出力ポートはあえて強制停止としてスケッチしてあります。

簡単なリモコンができました。
これだけでも便利で当分使用出来ると思います。
先ずは実際に試してみたいと思います。
まだまだESP32の表示部への組込等、ステップアップは続きます。

つづく?

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

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