jl7gmnのblog

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

2020年10月

Candle for LINUXその28

今日は、有給で休みなので、仕事を忘れて思いっきりTS820の外部DDS−VFO の問題をみることができています。結果前回のほぼ出来上がったTS820の外部VFOの電源ON時の開始バンドが本体のTS820のバンドSWと異なるという問題は、解決しました。ただ、この対策を見つけるまでがとても、大変でした。
この対策の検討記は後になります。

先ずは、問題が解決した電源ON時の外部DDS-VFO側の動画です。TS820本体側のバンドSW設定が21MHzです。オリジナルのスケッチでの初期設定バンドは7MHzにしています。
電源ONから一旦電源OFFにして、再度電源ONで外部DDS-VFOは初期設定の7MHzになるのと同時に外部DDS-VFOからTS820本体へバンドSW確認リクエストが送られます。これがTS820本体側でデコードされ、一定時間経過に外部DDS-VFOにバンドSW設定の情報を送り返すシーケンスです。通常のバンドSWを回して送出されるのと同じバンド情報です。外部DDS-VFO側がこのバンド情報を受信して、スケッチ初期設定の7MHzが実際に設定されているバンドSW周波数の21MHzに切り替わリます。とにかく電源ONするだけで外部DDS-VFOのバンドが本体設定のバンドSWと同にする事が出来る様になりました。やっつけ仕事感があります。とにかく動作すればいいのであって、本当に良い方法かどうかは、今の段階ではわかりません。ArduinoNANOやArduinoUNO,とくにESP32DivKitCについては、手探り状態なのは変わりありません。サンプルスケッチで動かして、確認し動いた時に感動しているレベルですから!Hi!

外部DDS-VFOの電源ON時開始時(REC/XMIT)のTS820本体の
バンド設定SWとの同期化の動画です。


ここからが、上記の電源ON時のTS820本体と同期するまでに色々と出た問題を私なりに、それぞれ原因等を考え、対策し、クリアしていった事についての記載です。ほぼデバッグ処理から始まります。Hi!

とにかくデバッグするためにはオリジナルとの比較が重要です。私は、動作比較確認する必要があるのでESP32DivKitC用の実験基板をオリジナル状態(VFOsys.ino)で準備しました。これで、製作中のスケッチVFOsys-SERIAL.inoとESP32DivKitCのオリジナルVFOsys.inoとで、各ポートの比較確認が出来るようになりました。これで解ったのが、シリアルのTXポートが通常のオリジナルと異なる動作になっている事でした。前にVFOsysの仕様で、と書きましたが、これはとんだ私の思い込み間違いで、私のスケッチ追加によって起きていることでした。オリジナルではTXポートが安定のH状態なのが、何かの原因で信号?が送出されている状態です。この信号が常時出ていることで起きているだろう2次的な問題もありました。TS820外部DDS-VFOのESP32DivKitCのTXポートからはいままでは出ていなかった信号が出ているような状況です。TXポートを外して使えば、問題はありません。が、今の対策は使う事が前提で進めていますから、解決しないと進みません。大変厄介な内容ではあります。TS820の外部DDS-VFOの電源ONによる問題解決対策の前に、この原因追求をしなければなりません。

まず考えたのが、シリアルポートであるという事なので、シリアル通信に関わるスケッチが追加されてこの様になっているのだ。という事です。オリジナルにスケッチ追加して起きている事は100%明らかです。ということで、追加したルーチンを全部 /*   追加ルーチン */ にて、間違いなく箇所を外し100%問題がなくなるかを確認しました。すると、TXポートは送出信号?がでなくなりました。Hでオリジナルの状態と同じです。場所は大当たりというか、追加した事で問題がおきた所ですから当然といえば当然です。原因のスケッチ部ということになります。ここで、原因の箇所を確認するために、考え方を開発中のスケッチでなく、オリジナルとして準備した実験基板で何をすればTXポートが信号送出状態?になるのかを試すことにしました。試すことは、作製しているスケッチ、VFOsys-SERIAL.inoで追加し書いた同じシリアル通信関連のスケッチ、1センテンスを追加してTX ポートの状態が同じ様(送出状態)に再現するかを確認することです。この方法は功を奏しました。ほぼ、1発で原因が分かる事になります。とにかく唖然としました。スケッチを書いていて通常にデバッグで使用するものだと思っていたものが実は、シリアルのループ内ではTXポートに影響が出るということです。Arduinoでは当たり前のデバッグ手法だけにこれは、シリアル通信処理時は気をつけなければならないということになります。ここまで書けば解ると思いますが、原因はループ内で使ってた、値確認で使うSerial.Println();です。確認用のSerial.printlnをすべてコメント化または削除でTXポートへは送出信号?はでなくなり、オリジナル時のTXポートのH状態にて安定しました。あっけなく再現したので、VFOsys−SERIAL.inoの変数値等の確認で入れてあるSerial.printlnをすべてコメント化(//)しました。
このコメント化ですべてTXポートの状態は解決しました。ホッとしました!

次は、外部DDS-VFO側が電源ONしてからTS820本体へバンドSW確認リクエストを送出する必要があります。この部分のスケッチを追加しなければなりません。以下の様にリクエストコマンドをバンド情報以外であれば何でも良いので、下記に独断で決めました。

バンドSW確認リクエストコマンド:”99;”

これは、送る自分で受信するのと同じく”99”にデリミタの”;”を付けて送ることにします。前にも書きましたが、key=Serial.readStringUntil(';'); でデリミタ”;”までのデータを読み込む仕様に合わせます。

このコマンドをVFOsys-SERIAL.inoのvoid setup() ルーチンの各初期化ルーチンの1から8がありますが、これらの初期化が終わってから送出するように一番最後に追記しました。(最後の ”}”の手前、本当の一番最後です。

void setup()ルーチンの各初期化ルーチン
1.create tasks on core0
2.set up Interrupt Timer
3.Counter setuo for Rotary Encorder
4.display_init();
5.trans65k();
6.init_Dial();
7.GRAM_clr();
8.si5351_init();

追加は単純に20回のバンドSW確認リクエストコマンド:”99;” を送るだけです。回数は気持ち多めでということで適当です。後で、十分に動作する(受け取れる)回数まで減らし調整します。

for(int i=0; i<=19 ; i++){
       Serial.println("99;");
 }
void setup()ルーチンでは1回だけの動作ですから、TXポートからは各初期化後の最後に20回のバンドSW確認リクエストコマンドが送られるだけです。void loop()ルーチンのように繰り返しはありません。1度だけの送出(”99;”リクエストコマンド)20個のデータだけという事です。ここが大切です。

TS820外部DDS-VFO側では、電源ONでリクエストコマンド”99;”を送り、初期設定された周波数を本体から送られてくる今現在のTS820のバンドSWのバンド情報を受信して、そのバンド情報に対応する周波数に変わります。(受信のバンド情報デコードは電源オン後リクエストに対し送られてくるバンド情報と通常時のTS820本体のバンドSWを回して送出されるバンド情報は全く同じコマンド体系です。)


外出するので、一旦終了します。

つづく?
続きを読む

Candle for LINUXその27

TS820の外部VFOのDDS化でのTS820側のArduinoNANOと外部VFOに組み込むESP32DivKitCの送受のシリアル動作も運用時のスケッチは双方とも問題なく動作しています。いじっていて、もう一つの問題を見つけました。今現在のTS820のバンド選択SWを動かすことでの動作は100%です。?問題はありません。もう一つの問題とは、実際の運用開始の状態開始時の事になります。ただ、VFOsysの元々の仕様でもあります。VFOsys内のルーチンにて固定周波数で設定初期設定されるようなスケッチになっているという事です。どんなことかと言うと、実際の動作では次の様になります。
TS820の電源を入れ本体が動作します。次に外部DDS-VFOに切り替える為にREC/XMITの状態にて電源ONになります。この時点では、TS820の本体ArduinoNANOからは何も送出されず、スタンバイ状態です。外部DDS-VFO側も電源ONになりますが、本体側の情報が無いためにスケッチ初期の設定バンドで開始されます。ここなんです。TS820本体のバンドSWの位置にかかわらず、DDS−VFO側はスケッチ記載の固定バンドにて開始されてしまいます。とにかく外部DDS-VFO側が後から電源ONとなるために、本体からのバンドSWの周波数情報が全くない状態です。逆であれば、次の対策の③で何とかなるんですが、これを何とか対策しようとして色々と考えていました。Hi!

ある程度の暫定対策が幾つかたちました。先ず何も対策しない方法として、使い方対策としてです。
①使い方対策:外部DDS-VFOにしたら、本体のバンドSWを1つ以上回して、外部DDS-VFOにシリアルバンド情報をもらい同期させてから使用する。以後はバンドSWでの動作は100%(?)問題ありません。

次はSW追加のハードウェア対策です。回路は変わりません。
②ハード対策:本体のTS820のArduinoNANOの元々のバンドデータ送出用のSWをまた引張り出してきます。このSWを1回押すことが必要です。外部DDS-VFOへバンドデータをシリアル通信開始する事で同期させる。これ以降のバンドSWでの動作は100%(?)問題ありません。

次は、アイデアではいいスケッチの追加になりました。実現済みです。
③スケッチ対策:本体のTS820 側のArduinoNANOの電源は後からONにして、Setupルーチンで、自分のバンド情報をチェックして外部DDS-VFOへ自動送出して、同期させる。これ以降のバンドSWでの動作は100%(?)問題ありません。本体のArduinoNANOのSetupの利用でのスケッチ対策です。新たにスケッチも追記し、動作も100%確認出来ました。上手く動作してくれます。これは仕様上付いていても良い動作なのでスケッチは今後もそのままにして使います。

その他の対策
④他の方法を模索中です。頭の中の考えの上では出来る事にはなるのですが、肝心のESP32DivKitCのスケッチが追いつきません。(できるだけ何もSWを押さなくても、ArduinoNANOを後からパワーオンしなくてもいい方法)私のArduinoレベルでは少しハイレベルな内容かと思います。なので、調べて、そして、確認しながら、現在進行形です。①から③は実現出来ています。①から③で問題なく外部DDS-VFOで実用になります。が外部DDS-VFOの電源(REC/XMITに設定)を入れただけで本体の現在のバンドSWと同じバンドにならないとスッキリはしないですね。ただ、もしかすると打ち止めかもしれません。笑!笑!

つづく?

Candle for LINUXその26

VFOsysのTS820VFOのDDS化は、ほぼ終了したかと思っていましたが、とんだ間違いがありました。回路図まで書いて基板パターンをおこしてました。完成に近いと思っていましたが、動作仕様に対しての根本の間違いが見つかりました。TS820本体側からの周波数のストリングデータを送出する時のArduinoNANOの送出のプッシュSWの代わりにタイマーICの555を使う方法に切り替える方式にしたのですが、タイマー出力は仕様通りトリガーに対しL状態からHになり、タイマー時間経過後にLになります。立ち下がりでLの入力をD13ポートが検出してシリアルデータを送出するということで動作は確かにしていました。ところが、よくArduinoNANOを見ていると、LEDが周期的に光っていました。通常時はシリアルデータを送らないということでプッシュSWの対策としたのですが、通常時もタイマーICの555のQ出力はLとなっているため、シリアルデータを送出し放しでした。立ち下がりにこだわり過ぎた対策でのトラブルです。とんだ対策で通常時Hとはなっておらず、L状態なのでD13で検出されて送出しっ放しとなるというのが原因です。先ず原因が明らかなので、タイマーIC出力をそのまま使うとする場合は後に対策回路の追加が必要になります。対策は通常時Hとなるようにすれば良くパルスの立ち下がり動作が必要という事が条件になります。対策は最初の対策検討時に使っていたTTLの74121のワンショットパルスを使うことでできそうです。
トラ技のサンプルページに同様のワンショットマルチバイブレータ2個入りの74HC123Aの例がありました。この例での動作は1番Pin入力、出力は4番Pinですが私の使った下記TTL74121は3番Pin入力、1番Pin出力です。端子設定は同じです。私の場合のパルス幅を決める定数は R:10k、C:10μFにしています。計算上の出力パルス幅は約7msecです。私は1個入りのTTL 74121使用しました。

範囲を選択_115
実験中の追加ワンショット回路です。
CIMG8855

対策の回路の接続は、タイマーICの出力はD13の検出入力ポートからワンショットの入力に繋ぎ変えます。回路図にワンショットTTL 74121の追加をしました。基板も追加修正してあります。
範囲を選択_114

ここでタイマーICの555の出力は前段のトランジスタからの同相のトリガー(L→H)がかかると今までどおりタイマーがスタートし L→H→L と動作します。追加するワンショットパルス回路の動作として、必然的にワンショットのトリガー入力は立ち下がりを選択することになります。タイマーICの555の出力が HからLになる時に74121のワンショットパルス出力QにL→H→Lのパルスがでます。ただQポートではタイマーICの555の出力を繋いだのと同じで通常時LでNGなのでQの反転ポートを使います。反転なので、通常時Hです。ワンショットは H→L→Hと 丁度プッシュSWを押したのと同じ様に動作してくれます。これで、タイマーが終わると(H→L→H)のパルスが1発出ます。少しタイマー定数の調整が必要でしたが、ワンショット回路追加で通常時のシリアルデータの送出がなくなり、バンドSWを回した場合にのみワンショットH→L→Hのパルスが出て、D2からD12の安定になった選択バンドの電圧を検出し、バンド対応の周波数情報ストリングデータを送出してくれるようになりました。
もう変な動作がないかの最終ESP32DivKitCのVFOsysと本体側のバント選択情報送出用のArduinoNANOとのシリアル通信確認をやっています。今の所、本来の仕様通りにシリアルデータの取りこぼしもなくほぼ問題なくVFOsys側でTFT液晶に周波数表示してくれています。VFOに組み込む基板とは別に実験ボードを用意した分での動作チェックの段階ですが、今度こそ、完成です。

バンドSWを想定したロータリーSWを回して周波数がVFO 側に自動で表示されてる動画です。恒例のいじわる試験(バンドSWを速く回す)もやりましたが、クリアしています。


まだ、本体への組み込みがありますので、油断出来ません。少し回路のまとめもしないといけません。また、シリアル送出部の回路全部を10X8cm のEAGLE CADで基板1枚に入れ込みましたがサイズが少し大きいので、820本体の空きスペースに分けて入れられる様にスイッチング回路とタイマー回路、Single Shot回路をArduinoNANOの基板とは分けて、別基板にしようかと考えています。

範囲を選択_116


つづく?

Candle for LINUXその25

TS820用外部デジタルDDS-VFOのVFOsysを元にしたものがだいぶまとまってきたので、TS820本体側へつけるArduinoNANOのシリアルデータ自動送出部の回路図をEagle CADで書き、ついでに週末のCNCマシーンでの基板切削用にパターンをおこし準備しておきました。

先ずは、バンドSW位置で自動シリアルバンド情報を送出する回路図です。

範囲を選択_112

あまり細かいことは記載していませんが、ArduinoNANOのデジタルポート(入力ポート)のD2〜D12 までは、TS820本体の各バンド選択時に電圧が印加される発振回路の+B電源(+9V)につながります。+B電圧は+9Vなので、ArduinoNANOへは直接はつなげません。抵抗で分圧して4.5Vにてポート入力なるようにしました。各入力ポートへは、ダイオードを通しトランジスターで同相でのスィッチングをします。その出力は、タイマーICの555のトリガー入力ポートに入ります。するとタイマーICのCRによる時定数設定時間分経過まで出力が出ます。この出力の立ち下がりをArduinoNANOの以前の送出用SWの代わりに繋ぎArduinoNANOはD2〜D12までの電圧のあるポートに対するシリアルデータを送出するということになります。メモリ付きの液晶オシロスコープで確認したトリガーとタイマーの関係です。

実験基板のバンドSWを1.9MHZ→3.5MHz→7MHz→14MHzと切り替えた時のトリガーと出力です。
CIMG8847

メモリ機能があるので、拡大して詳しく見るとおおよその時間がわかります。
入力トリガーの H→L→H のLの時間はおよそ22msec位ですが、これはまちまちです。
トリガがHからLになった時に出力がLからおよそ106msecの間Hとなっています。
この状態は入力のトリガーがLの状態はまだバンドSWが囘し終わってない状態です。タイマー出力が出ている間に入力ポートに電圧がかかります。電圧がかかって安定した状態になってからタイマーがHからLになり、この立ち下がりをArduinoNANOのD13ポートの入力に入れます。ソフトウェアで電圧のかかったポートをチェックして、そのポートに対するシリアルバンド情報を送出するという具合です。

CIMG8846

1.9MHzの状態からロータリーSW2つ回した7MHzの時の状態です。7MHzの+Bの安定時間とタイマー出力の立ち下がりのタイミングです。上側が7MHzの発振部+B電圧です。下がタイマー出力です。+B電圧はほぼ瞬時に安定していますから、十分7MHzのタイマーが立ち下がる時点では超安定状態です。問題なく7MHzのD4ポートを検出して7MHzのシリアルデータを送出しています。ちなみに3.5MHzでのタイマーも約120msec動作しているのがわかります。タイマーの時間設定は100msecで設定してるのが丁度いい具合かもしれません。ちなみに、+B電圧が隣のバンドにつながるまでの未接続時間をみると約20msec位のようです。通常のバンドSW操作のときです。残念ながら画像容量が5MBを超えたらしく、カメラデータのアップロードが出来ませんでした。再起動後にアップロード出来ました。

WiFiが止まっていたためにアップロード出来なかったようです。容量のメッセージは回線が繋がらない時にも出るようです。

上のch1が7MHzの+B電圧で、ロータリーSWでバンドを14MHzに変えた時に7MHzの+B電圧が下がり約20msec経過後にch2のバンド14MHzの+B電圧が立ち上がっています。これがバンド間のタイムラグで、とりも直さずタイマーICの555のトリガー入力に入るスィッチングのトリガーそのものです。

CIMG8854

このライムラグ時間は最初の約22msecスィッチングのトリガーの時間とほぼ同じです。仕様上回路構成からそうなる。Hi 
トリガの時間経過後に最終SW位置の+B電圧が即安定していることになります。

CIMG8853
いずれにしても、タイミング的には全く問題ない様です。トリガーがかかってから約100msec後D13ポートがD2からD12のどれか1つの+B安定電圧を検出しポート割当の周波数データのシリアルデータを送出してくれていることが分かります。

ブログアップロード時にWIFIが停止してしまい、かいたブログをLibreOfficeCalcにコピペして、再起動しました。再度記事を入力するつもりでいましたが、39分前のデータが残っているとメッセージがでてくれて、確認すると、実際まるまる残っていてホッとしました。写真もアップロード大丈夫でした。ただ、題名は消えてましたので、再度入力して、今アップしています。何ヶ月かに1回はこんなトラブルがあります。ヤフーのときも、同じく途中で回線がきれて、再起動することがありました。その時も書いたデータは残っていましたから、ライブドアのブログも案外バックアップしてくれてる様なので、ほんと助かります。

つづく?

Candle for LINUXその24

TS820の外部VFOのVFSsysでのデジタル化とその自動バンド設定化も順調になってきました。記録残してなかった、TS820本体に追加するArduinoNANOのシリアルデータ送出部からのシリアルバンド情報をデコードするシリアルデータ受信部のVFOsys(ESP32DivKitC)へのスケッチ追加したVFOsys−SERIALルーチン void loop() まるまるを載せたいと思います。所どころ説明箇所がスケッチ内位置前後してますが、思いついて書いてる面もありあますので、スケッチ位置を頭で描いて補正願います。

先ずその前に動作説明です。追加スケッチ部の動作はシリアルデータを受取し、受信シリアルデータからバンド情報を抜き出して、対応する周波数の設定用の変数frqにfreq**を、VFO出力を5MHz台にするバンド毎に対応する為に、HET_FREQ(私が追加した変数)にHET_FREQ**を入れます。HET_FREQ**はバンド毎にfreq**と共に#define定義しておきます。バンド毎のHET_FREQはTS820の取扱説明書にも情報は記載されています。(入れる定義はfreq01〜freq11,HET_FREQ01〜HET_FREQ11です。)
上記2変数がループ内(void loop())で自動で読み込まれVFOsysのTFTの周波数ディスプレーに周波数が設定されて、VFO出力もバンドによらず、常にTS820用の5.5MHz〜5.0MHzの周波数に応じた出力になります。どのバンドも同じように対応なります。

一部最初に使った変数設定値など、不必要な箇所はコメント化(//)してあります。
freq**、HET_FREQ** この2つの実際の定義部です。コメントの日本語追記はあまり良くないので、英語でのコメント追加です。わかればいい程度ですので、文法は適当です。Hi!
このfreq**は自分でアマチュアバンド内の好きな周波数に設定できます。TS820本体のバンドスィッチで目的のバンドにしたら外部VFOでの周波数表示部に設定される初期設定周波数になります。運用開始の周波数です。今はテスト用の周波数設定で、まだ全部は設定してませんが、例えば、7MHであれば、CWを中心にする場合などは 7025000 とか、私の場合はSSBがほとんどなので7100000にしてあります。頻度の多いモードでの運用がしやすくなります。他のバンドも自分に合わせて設定すると良いかと思います。Hi!


// select frequency default   2020.oct.18
#define freq01   1800000
#define freq02   3500000
#define freq03   7100000
#define freq04  14000000
#define freq05  15000000
#define freq06  18000000
#define freq07  21000000
#define freq08  28000000
#define freq09  28500000
#define freq10  29000000
#define freq11  29500000


// Using Serial band data to change selected band freq 2020.oct.18
//#define HET_FREQ 12500000     //VFO Heterodyne freq for 40m BAND
                 //Setting HET_FREQ after read Serial DATA
#define HET_FREQ01  7300000    //1.9MHz VFO Heterodyne freq for 180m BAND
#define HET_FREQ02  9000000    //3.5MHz VFO Heterodyne freq for 80m BAND
#define HET_FREQ03 12500000    //7.1MHz VFO Heterodyne freq for 40m BAND
#define HET_FREQ04 19500000    //14.0MHz VFO Heterodyne freq for 20m BAND
#define HET_FREQ05 20500000    //WWV 15.0MHz VFO Heterodyne freq for 21m BAND
#define HET_FREQ06 23500000    //18.0MHz VFO Heterodyne freq for 17m BAND
#define HET_FREQ07 26500000    //21.0MHz VFO Heterodyne freq for 15m BAND
#define HET_FREQ08 33500000    //28.0MHz VFO Heterodyne freq for 10m BAND
#define HET_FREQ09 34000000    //28.5MHz VFO Heterodyne freq for 10m BAND
#define HET_FREQ10 34500000    //29.0MHz VFO Heterodyne freq for 10m BAND
#define HET_FREQ11 35000000    //29.5MHz VFO Heterodyne freq for 10m BAND
long HET_FREQ;

const long awase=150;    //frequency [Hz]周波数補正 add 2020/sep/20

今回は関係ありませんが、最後のawase=150;は前のブログにかいた私が使ってるSI5351Aでの周波数補正値です。

あと、全バンドにするためにオリジナルで7MHzに設定していた関連箇所はコメント化(//)し、値を自由に変えられる単なる変数に変更追加します。また、シリアルデータ受信で使用する文字変数 dispkeyも追加します。

/* Frequency setting */
//#define init_freq 7100000      // Initial Frequncy[Hz]

/* Global */
//long frq=init_freq;
ここのGlobal に上記のコメントの代わりに追加します。
long frq ;             // change variable value setting after read Serial data

String dispkey ; // add 2020.oct.17 for Serial Rx

所どころのSerial.print,Seri.println等はシリアルモニタでの値確認用です。void setup()に追加して確認で使ってました。

void setup(){
Serial.begin(115200); //add 2020.oct.18
.
.

動作時は本当は消したほうが良いかもしれませんが、消していません。支障も出ていませんし、確認はまだ継続中なので、そのままにしておきます。


実際のループルーチン内に追加した箇所(青文字部)になります。
確認で使用した変数で未使用文はコメント化(//)青字になってます。(スケッチ検討で追加した変数だが、上手くなくて既にスケッチを消しているので、もう使われていない、いわゆる変数の残骸です。)

//-----------------------------------------------------------------------------------------------
void loop() {    // (core1)
//-----------------------------------------------------------------------------------------------
    char str[64];
 
    if(f_dchange==1){         //if need to renew display, set this flag to 1
        f_dchange=0;          //if frequency changed, set this flag to 1       
        //GRAM_clr();
        boxfill(0,0,Nx-1,Ny-1,cl_BG);        
        //Display Dial
        Dial(frq);            //long frq=init_freq ;#define init_freq 7100000
         
      // box(7,100,153,126, 0xa0a0a0);
      //  box(6,99,154,127, 0xa0a0a0);
        
        
        //-------- Display Digital Frquency ---------------------------------------
        sprintf(str, "%3d.%03d,%02d",  frq/1000000, (frq/1000)%1000, (frq/10)%100 );
        //disp_str16(str,17, 105, 0xffd080);  
        disp_str16(str,17, 110, 0xffd080);              
        sprintf(str, "MHz" );
        //disp_str12(str,120, 106, 0xffd080);
        disp_str12(str,120, 111, 0xffd080);  
        
        if(f_redraw==0){
          trans65k();       //Convert 24bit image to 16bit image
          f_redraw=1;       //uint8_t f_redraw;
        }            
    }
    

    //***********************************************************************   
    String key;   // add 2020.oct.18 rescieve data
    //String ireko2; // add 2020.oct.18
    
    //String key2;
    
    // Serial Rx routine add 2020.oct.18
    if(Serial.available() > 0){
      key = Serial.readStringUntil(';'); //read one String
      dispkey = key;
      //key2 = key;
      Serial.print(key+"A");
      Serial.write("\n");
    
    }
    String ireko = dispkey.substring(0,12);
    //Serial.println(ireko);

    //String bdat ; // "01","02",e.tc 8byte String data
    //int ibdat   ; //  1,2,etc after change String to integer
    String bdat = ireko.substring(0,2);
    //Serial.println(bdat);
   
   
    if (bdat == "01"){  // 1.9MHz
      frq = freq01;
      HET_FREQ = HET_FREQ01;
      f_dchange = 1;
    }
    else{
      if(bdat == "02"){ // 3.5MHz
        frq = freq02;
        HET_FREQ = HET_FREQ02;
        f_dchange = 1;
      }
      else{
        if(bdat == "03"){ //7.1MHz
          frq = freq03;
          HET_FREQ = HET_FREQ03;
          f_dchange = 1;
        }
        else{
          if(bdat == "04"){ //14.0MHz
            frq = freq04;
            HET_FREQ = HET_FREQ04;
            f_dchange = 1;
          }
          else{
            if(bdat == "05"){ //WWV 15.0MHz
              frq = freq05;
              HET_FREQ = HET_FREQ05;
              f_dchange = 1;
            }
            else{
              if(bdat == "06"){ // 18.0MHz
                frq = freq06;
                HET_FREQ = HET_FREQ06;
                f_dchange = 1;
              }
              else{
                if(bdat == "07"){  // 21.0MHz
                  frq = freq07;
                  HET_FREQ = HET_FREQ07;
                  f_dchange = 1;
                }
                else{
                  if(bdat == "08"){  // 28.0MHz
                    frq = freq08;
                    HET_FREQ = HET_FREQ08;
                    f_dchange = 1;
                  }
                  else{
                    if(bdat == "09"){  // 28.5MHz
                      frq = freq09;
                      HET_FREQ = HET_FREQ09;
                      f_dchange = 1;
                    }
                    else{
                      if(bdat == "10"){  // 29.0MHz
                        frq = freq10;
                        HET_FREQ = HET_FREQ10;
                        f_dchange = 1;
                      }
                      else{
                        if(bdat == "11"){  // 29.5MHz
                          frq = freq11;
                          HET_FREQ = HET_FREQ11;
                          f_dchange = 1;
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }

    Serial.println(f_dchange);
    //********************************************************************        

 
    delay(1);  
     //digitalWrite(LED_BUILTIN, 1^digitalRead(LED_BUILTIN) ); //  Toggle LED     
}


このループルーチンでの周波数設定はシリアル情報をデコードして、抜き出したバンド情報文字値で、バンドを特定し、周波数とVFO用の周波数に変換する為のHET_FREQを設定します。この後でf_dchange=1;とします。
スケッチではf_dchangeが1の時の条件で周波数設定される様になっています。設定後はすぐf_dchangeは0の周波数設定なしになります。この条件を使いシリアルデータでデコード値(バンド情報文字値)で周波数とVFO出力周波数用変換値を設定したら、f_dchangeを1にして書き込みするという風にスケッチしました。周波数が設定されると、f_dchange=0;になり書き込みなしで、DDSの周波数がロータリーエンコーダーで自在に運用出来る通常時の状態になります。ループルーチンでこのf_dchangeは常にチェックがかかっているので、f_dchange=1;となると即、周波数の設定がされるという具合です。

シリアルデータデコード受信部のスケッチ変更についてでした。

思うに、シリアル送信部のデータの仕様は周波数対応番号情報のみ (”00” 〜”11”)で良かったのですが、スケッチコーディングして、コンパイルした後の動作確認時に数値文字情報ではどのバンドかがわかりにくいために周波数情報を追加して ”00  1.9MHz;"等としていました。完成したら、”1.9MHz”等の各バンド周波数文字部をなくしてもと思ったりします。送る情報は短い程良いのではと思います。一部シリアルデコードのバンド情報抜き出しのスケッチ箇所も省略できます。データ最後検出のデリミタ(くぎり)の”;”はなくせません。”00;”です。シリアル受信部でSerial.readStringUntl(';')でシリアルデータの区切りまで読み込むスケッチとしています。現状、周波数文字部は、デバッグではやはり必要ですね。

今の時点で、電源を入れた時の設定バンドでのシリアル通信出力でVFOにきちんと周波数設定されるかが、少し気になるところです。実験ボード上で、2つArduinoNANOでは問題なく周波数選択したロータリーSWのバンドで設定されます。TS820の本体の電源に繋いでどうかが、少し気になるところです。
もう少し、時間をかけて、ArduinoNANOの送信部とHSP32DivKitCの受信部との通信でチェックをしてみます。

そういえば、つい先週、オークションで100円で落札した綺麗なTS820のフロントパネルがある。今のTS820のフロントの上部が特に塗料が剥がれて使用感たっぷりで見栄えが悪いので、交換もしたいです。これを含め、いまのVFOsysのデジタルDDS−VFOシリアル化検討で、やったことをきちんと記録をとってなかったりとか、(メモ程度はある)まとめてなかったりとか、やり残しがたくさんあります。実機での確認はもう少し先になるかなといったところです。

つづく?

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

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