無線ブログ集
メイン | 簡易ヘッドライン |
MODEL 1200FXローテーターその6 (2022/4/28 6:41:07)
変な時間に目を覚ましたので、ローテーターのアプリケーションでのシリアル通信による方法をスマフォの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)に設定します。
STOP(停止)コマンド ”A"の設定です。
CWのコマンド ”R”の設定です。
アプリケーションからの送信を想定したMコマンドでのプリセット角度90°の設定です。("M090")
もう一つ必要なのがアプリケーションとは関係なくディスプレー側に付く角度ステップSWでのプリセット値に対して動かす為のコマンドも設定してありあす。PRESET-GOラベルで”M”に角度xxxの付けない場合の特別なアプリケーションとは関係ないコマンドをボタン8に設定しました。
コマンドMの解析で角度プリセット値が無い場合の処理で対応しました。
なお、コマンドはアスキー文字です。それとコマンド仕様通りにアスキー文字の後には自動で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();
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;
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]がシリアル出力されるのだと思います。想像なので実際のアプリのシリアル値や操作も確認しないといけないですね。
今回の疑似アプリ対応スケッチはもう少し色々設定操作して問題がないか見てみます。
つづく?
execution time : 0.032 sec