無線ブログ集
メイン | 簡易ヘッドライン |
リンク 単体表示
jl7gmnのblog (2024/7/3 7:06:06)
現在データベースには 156 件のデータが登録されています。
TS820 DDS-VFOその20
(2022/3/23 2:51:43)
先ずはDDS-VFOの全3基板を組込できました。ただしHAMLOG用のシリアル用のUSBケーブルをどうするか(コネクタ設置かケーブル引き出しか)という事とRITの設置SWの設置方法は、未だ思案中です。
一眠りして目が覚めたので、一昨日にTS820 DDS-VFOの3基板を本体に組込みしたので纏めます。
TS820本体の送受信時の切り替えの為に追加した2石トランジスタスイッチング回路での送信検出も問題なく動作してくれています。送受信時のRIT動作も、表示も問題ありません。回り込みでの異常動作なども全くありません。実際の試験運用の交信テストはバンドコンディションの良い21MHzで数十局のWとも問題なく出来ています。運用実績もできたので本体に組込開始です。
TS820
DDS-VFOの設置場所は元のアナログVFOの取り外しスペースで、ここに十分入ります。今回はネジ止めは基板側だけにしてL平板アングルをカットしてカウンターユニットのケースに超強力両面テープにて貼り付ける方式です。簡単に適切な位置にTS820
DDS-VFOを取り付けする事が出来ます。以下設置位置の写真です。強力な両面テープで、TFTの液晶の設置でも使った物です。HI!
■真上方向よりの写真
■前方やや斜め上からの写真
■右斜め上方向よりの写真
■フロントの写真
■フロントデジタルサブダイヤルとデジタル表示部の拡大写真
先ずはDDS-VFOの全3基板を組込できました。ただしHAMLOG用のシリアル用のUSBケーブルをどうするか(コネクタ設置かケーブル引き出しか)という事とRITの設置SWの設置方法は、未だ思案中です。
つづく?
TS820 DDS-VFOその19
(2022/3/16 0:05:49)
この間注文していたロータリーエンコーダ2個が着弾しました。
手持ちで、E6B2-CWZ6C
のロータリーエンコーダは 1000P/R, 2000P/R の2つしかなかったので新たに1000P/R
と500P/RのロータリーエンコーダをAliExpressにてオーダーしておいたものです。3月8日注文で3月15日到着なので1週間で届きました。1ヶ月はかかるかと思っていましたので、今の時期ではとても早い方ではないかと思います。
Φ6の連結ジョイントも付属しています。ただし重量感がなくプラスチックを使った
ケースのようで、とても軽いです。2000P/Rのものはそれに比べるとやや重量感が
あります。
500
P/R 5 to 24V DC
1000 P/R 5to12V DC
早速ブレッドボードのTS820 DDS-VFOのロータリーエンコーダと入れ替えての
動作を確認です。接続は前のものも中華製でP/R以外は全く同じ仕様です。
全く同じ配線で使用出来ます。
型番での仕様一覧表がありました。
E6B2-CWZ6Cは 出力形式がNPNオープンコレクタ出力です。
実際にいまブレッドボードで繫いであるのは 2000P/R です。そのまま交換してみると
全く使いづらいので、500P/R, 1000P/Rに取り替えた時の操作しやすい設定値をスケッチを変えて確認してみました。freq_step
を変えてのテストです。デジタルサブダイヤルの早回しとスローでの微調整時の動作が同じようになるような設定値です。
対象となるスケッチは下記部になります。確認後// でコメント化しておきました。
//#define freq_step 10 // step[Hz]
#define freq_step 1.0 // step[Hz] 2000P/R
//#define freq_step 3.0 // step[Hz] 500P/R
//#define freq_step 1.5 // step[Hz] 1000P/R
上記のfreq_step の設定は、デジタルサブダイヤルの早送り時と微調整の両方がバランス良く動作する値に設定するのですが、感覚的なものですのでひとによっては他の設定値の方が良いかもしれません。
#define freq_step 1.0 // step[Hz] 2000P/R
//#define freq_step 3.0 // step[Hz] 500P/R
//#define freq_step 1.5 // step[Hz] 1000P/R
上記のfreq_step の設定は、デジタルサブダイヤルの早送り時と微調整の両方がバランス良く動作する値に設定するのですが、感覚的なものですのでひとによっては他の設定値の方が良いかもしれません。
とここまで、すんなり順調に確認できた様に話が進んでいますが、最初に交換しただけでは、ロータリーエンコーダを回しても、周波数の変化もなくて、まがい物を掴まされたかもなどど、勝手な思いを巡らせてました。なぜ交換しただけでは動作しなかったかと言うと、今までのロータリーエンコーダーがたまたま上手く動作していたからなのです。何かと言うと、電源の仕様です。1000P/R用の仕様の電源電圧は5Vから+24Vが動作範囲の電源電圧です。が、実際はESP32DevKitCの+3.3Vにて動作させていました。このため2000P/Rのロータリーエンコーダーはたまたま動いてくれていた事になります。ところが、500P/R
と1000P/Rは+3.3Vでは動いてくれない仕様通りのロータリーエンコーダーであるということなのです。電源電圧を+5.0Vにつないで、2つとも問題なく周波数を変えることが出来ました。
つづく?
TS820 DDS-VFOその18
(2022/3/15 22:18:30)
あるものは有効に使いましょうということで古いWindowXPで起動したハムログにデバイスドライバーのインストールに成功したFTDIのUSBシリアル変換小型ユニットでESP32DevKitCのシリアルTXポートに繋ぎ送出されるKENWOODコマンド体系のシリアル周波数データをハムログに実際に取り込みさせている動画を取りました。問題なくバンドSW切り替えでの周波数もロータリーエンコーダをまわしての設定周波数も取り込んでくれています。
画像があらくて見づらいですが、ピクチャ−インピクチャ−で見ると案外周波数が
見やすいようです。
FTDIのAE-FT234XD USBシリアル変換ユニットのRXをESP32DevKitCの
シリアルTXに繫いであります。後からハムログからの周波数設定も予定してる
のでTXもESP32DevKitCのシリアルRXに繫いであります。
FTDIのデバイスドライバーでなんだかんだありましたが、問題なくCOMポート12
がインストールされています。インストール済みなのでプラグ・アンド・プレイで
動作してくれます。
ハムログへの周波数取り込みがとてもうまくいっているので、次はWindow10でのAE-FT234XDのUSBシリアル変換ユニットのデバイスドライバーインストールをして、Window10で起動したハムログでのTS820
DDS-VFOからの周波数シリアルデータ送出での周波数取り込みを確認してみようかと思います。
つづく?
TS820 DDS-VFOその17
(2022/3/15 7:04:51)
TS820本体の送受信切り替え様のトランジスタ2石のスィッチング回路は上手く動作してくれました。この確認時にとんだハプニングが起きてしまいました。バンドSWのナットが緩んでチェーンでロータリーSWを回転させているのですが、空回りして、バンドSWが動かない状態が発生してしまいました。上下のカバーを外しPLLユニットを外して、しかもパネルも外さなければ見れません。つまみ類も全部はずします。それからバンドSW周りの確認です。丁度動かない状態が最初のバンドですのでチェーンがはずれている状態にしてWWV/15MHzとなるようにバンドSWを左回転させあわせます。単なるバンドSWは周波数が変わるだけの動作です。ある程度いじっている内に大体状況が分ってきます。チェーンをかけるのも合わせてから上記の位置に合わせておいてチェーンを掛けます。ギヤを緩ませてやる方法もあると思いますが、なるだけ変化は少ない現状から行うのが早く元に戻すコツです。余りパラメータが増えると混乱のもとになりますので!ということで無事バンドSWが元の動作に復帰しました。
良いことがあって、悪いことがあって、また良いことがありました。先のシリアルUSB変換基板が古いPCで動作しないという状況が改善動作できたということです。FTDI社製のAE-FT234XDの超小形USBシリアル変換モジュールがWindowsXPではドライバー自体が最初インストール出来ない状況であきらめていましたが、しつこくネットを見たりしていて、あるやり用にてインストール可能になりました。次の手順です。
まず最初にAE-FT234XDをPCのUSBに繫いで、デバイスマネージャーを開きUSB(Universal Serial
Bus)コントローラーに表示された不明なUSBデバイスを削除します。この後にFTDI社のホームページから対象のWindowOSのデバイスドライバーをダウンロードします。私が使いたいのは古いPCのWindowXP用です。
CDM21228_Setup.exe (容量2400KB)のアプリケーション式のインストールファイルです。
FTDI社のホームページから実行型のセットアップEXEをダウンロードします。結構な時間かかります。
一端AE-FT234XDのUSBをPCから外します。この状態でダウンロードしたアプリケーションを実行します。アプリインストールを実行していくとFTDI
COM Driver
Pack..使用できます。が2行表示されるとドライバーのインストールの成功です。後はまたAE-FT234XDをPCのUSBに挿します。新しいハードウェアが見つかりましたのの表示が出れば、上手く設定されています。プラグ・アンド・プレイのPCの自動インストールでCOMポートに設定が表示されれば完了です。後はシリアルポートの設定をプロパティで行ないます。なおWindowXPをネットにつないでおくのは危険なのでアプリケーションをダウンロードしたらネットから外します。ダウンロード時のみ繋ぎます。
ハムログがXPで十分動作するため何とか、今回USBシリアル変換モジュールのデバイスドライバーをインストール出来ないかと、ネット情報を見たり、色々とやってみて上手く動作にこぎつける事ができました。途中、署名がないエラーとか、色々ありましたが、全てNGな箇所のコントロ−ラを削除してから、新たにインストールするのがベストということです。(あくまでもXPの場合です。)
ボードでの実験でシリアル通信でやることがあるのでXPはまだまだ活躍してくれるでしょう。
つづく?
TS820-DDS-VFPその12
(2022/3/14 2:36:48)
TS820S本体に組み込んでの試験運用では、最初ノイズによる誤動作を対策して上手く動作し始めたかの様でしたが、RX-RITの動作をもう一度確認すると動いたり動かなかったりと、ノイズの回り込みだけではない何かまだ不安定さがありました。原因を追うべく、実験ボードにてESP32DevKitCのポートを1つ1つ比較確認してゆくと組込基板と異なる状態のポートがありました。実験ボードでは本体側のバンドSWのシミュレーション回路は接続せず、単にポートに電圧を掛けてテストしていました。これが問題でした。実際の回路と接続しないでテストしていた事で確認もれがあった事です。実験ボードを実機組み入れ時に初めてドッキングしたことより、確認出来ていないことでの問題発生です。要は確認不足です。他に大きな別の問題も新たに分かりました。まず不安定動作を招いていた原因が分かりました。バンドSW検出時にパルスをゲートICの74121から出力するのですが常時”H”レベルでバンドSW変えた時を検出時に”L”パルスを出力し、ESP32DevKitCでバンドSWの位置を認識する仕様としていました。この端子がESP32DevKitCのポートIO16に繋がっています。この端子が起動時は”H”レベルとなっています。このバンド情報SWが変わった時にはパルスが発生されますが、通常の”H”レベル時の動作スケッチ時にバンドSWの状態を検出するスケッチをメインに書いてあります。ここでのバンド検出を行うスケッチが優先になっていました。つまり、パルスでのバンド検出はしなくても、本体のバンドSWの位置は全ポートをESP32DevKitCに繫いでありこのルーチンスケッチでバンドは検出されています。と言うか検出するようにスケッチしてました。何とパルス回路検出はソフトウェアスケッチでバンド検出してるので、不要なのです。スケッチでのバンド検出とハードでのバンド検出を2重に無駄に行う状態でした。たたまたまハード側も”L”パルスを出した時の論理が合い、動作していたと思われます。これに気づきました。やってもうた!失敗感ヒシヒシです。早速ハード側のバンド検出を使わない様にしての確認です。パルス基板からタイマーICとパルスゲートICを全部抜いての確認です。やはり案の定、推測したとおりでした。問題なくTS820のバンド検出もできます。RIT-SWも安定して動作しています。ノイズが原因だけではなく回路設計とスケッチの両方のミスと言えます。ハード出力で検出するか、ソフト端子の状態で検出するかをごちゃ混ぜにしていたと言うことです。簡単に言うとバンドの全情報をESP32DevKitCに繋げば、ハードによるバンド検出用のパルスは不要ということです。スケッチでポートの状態を読みとるだけでバンド検出は出来ます。ただ、パルス回路を使ったスケッチを優先にスケッチをかけばそれはそれでバンド検出は可能です。以前に実際に外部VFOを使ってパルス回路で完成してあります。ソフト側での検出の重きを置くスケッチとするとパルス回路は不要となり、パルス検出回路に重きをおいてスケッチするとそれはそれでバンド検出はどちらも可能な事です。
ハード仕様で製作をしてきましたが、今回はソフトウェアでバンド検出することにします。理由としては組込回路が小型化できるからです。
以上とんだハードの茶番スケッチでした。気を取り直して、ゲート回路を取り除いた回路に修正し検出基板をEAGLEで修正しておきました。今後の為に、書き直しました。かなり基板サイズも縮小できますが、単にゲート回路を削除しただけです。回路図の修正が主です。パターンサイズ縮小での本修正は、今後の予定となります。その他、抵抗アレーの現物素子数が6個なのに8個の抵抗アレーを使っていた間違いも修正してあります。
最終のバンド検出基板(ゲート回路を全部削除)と9Vと5Vの電源回路だけが残りました。
仮のバターン。今後にサイズを縮小を予定(いつになるやら?)
本当に動作が安定したので、TS820の取説からRITの可変範囲がどれぐらいになっているか確認しました。バリキャップに電圧をかける方式でVRの可変範囲で±3KHz動かせるようなっている様です。現状のTS820DDS-VFOにつけたスケッチで対応では現在±500Hzですが、少し広げて±1000Hz(±1KHz)と少範囲を広げる(2倍)変更をしました。
TS820本体組込のデジタルサブダイヤルでは表示範囲が限られていて、見ることは出来ませんが、スケッチ検討時の確認用としてTFT液晶にRITの設置状態とRIT時の周波数表示、並びに送信受信の表示
”TX"、"RX" を付け足しました。送信表示
"TX"だけは周波数の前に付けたのでTS820実機の窓から見れます。RIT周波数用に変数を追加で対応しました。注意しなければならないのは周波数の上側か下側かのバンドの周波数と5M台VFOのプラス側とマイナス側の変化は逆となる事です。ヘテロダインでの注意点です。最終的には試験運用で試して問題ないことを確認する必要があります。
この部分のスケッチは次回防備録的として残します。
他、組込用に残っていたTX−SWのポート入力に合わせる分圧抵抗を作製しました。TS820側のマイク端子の+12Vが0Vになると送信となるなので+12VをESP32DevKitCの入力ポート仕様の+3.3Vに落とす分圧抵抗回路です。+3.3Vが送信時は0Vになり送信のTX−SWを押したのと同じ動作をすることになっています。これも受信RIT動作時の送信動作がうまくゆくか確認しなければなりません。
先に計算した27KΩと10KΩからなります。抵抗リードがアースに繋ぎます。真ん中の線はESP32DevKitCに繫いで試験してたTX-SWの代わりに検出ポートに繋ぎます。もう片方の線材はマイク端子の2番に綱繋ぎます。RIT-SWは、どうするか現在思案中です。
この分圧抵抗をつけての送信時のRX-RIT動作テストも今回のスケッチ追加書き込みのESP32DevKitCを交換しての確認を予定しています。回り込み対策もいるかもしれません。万が一ですがパッチンコアも用意します。なくてよければ付けません。
つづく?
TS820-DDS-VFOその14
(2022/3/7 2:59:21)
TS820-DDS-VFOでの受信時のRIT追加で、表示は実際には見えない位置ですが、試験段階では重宝すると思いRX: と RIT:
とRIT周波数もTFT液晶上に追加しました。RIT:はRX表示と一緒にしてたのですが、単独での表示に変更し、送受信時も同じ位置に表示するように変更しています。また、送信時の表示だけは周波数の前に”TX”が表示され送信中であることが見える様にしました。単なる表示部のスケッチ修正なので、省略です。
送信の時に元の周波数で送信状態になり受信時にはRITセットの周波数になる実機での確認はまだしていません。後にすることにしました。
ある程度の完成に近くなってきたので、ハムログへの周波数設定を先にすることにしました。
以前の外部VFO時に使っていたスケッチをコピペして簡単に機能追加出来ます。
当初予定していたシリアル通信のポートを前の製作の時と同じにするように戻しました。簡単に検討なしでの対応にするためです。4800BPS用です。コマンド体系はkenwoodにて対応しました。
■Dual Coreでの対応になるので下記インクルードファイルを読み込みます。
#include <freertos/FreeRTOS.h>
【内容】
基本はESP32DevKitCに搭載のDual
Coreのうちのもう1つを追加しハムログへのシリアルデータを送出を担わせます。
Dual
Core化で、かかる変更の主な点は下記になります。
RXD0(GPIO03)をRXD2(GPIO16)に変更
TXD0(GPIO01)をTXD2(GPIO17)に変更
この変更に伴いダブるので該当設定SWのポート入れ替えを行ないます。
RX_RITをGPIO17からGPIO01
CHANGE_BAND をGPIO16からGPIO3
■実際のスケッチ上の定義変更表記は下記になりました。
#define RX_RIT
1 //GPIO01
#define TX_SW 0 //GPIO00
#define TX_SW 0 //GPIO00
#define
CHANG_BAND 3 //GPIO03
#define RXD2 16 //uart RXD2 GPIO16
#define TXD2 17 //uart TXD2 GPIO17
#define RXD2 16 //uart RXD2 GPIO16
#define TXD2 17 //uart TXD2 GPIO17
■変数の宣言部へ追加
String sss; //Send Serial ASCII data to
Hamlog
int count; //Variable
■肝心かなめのvoid
task1(void* arg)タスクルーチンを新たに追加です。
//ADD FOR HAMLOG
void task1 (void* arg) {
while (1) {
String ss0;
String ss1;
String ss2;
String ss3;
String ss4;
String ss5;
String ss6;
String ss7;
String ss8;
String ss9;
String ss10;
String ss11;
String ss12;
String ss13;
String ss14;
String ss15;
String ss16;
char cc[11] = " "; //initialize cc[]
char dinfop0[]= "IF";// command for read setinformation
char dinfop1[]= " ";//TS820*** frequency sprintf(cc,"%011d",frq);
sprintf(cc,"%011d",frq);
ss1 = cc;
char dinfop2[]= " "; // 5 bulank memory nouse
char dinfop3[]= "+0000"; // Rit frequency
char dinfop4[]= "1"; // Rit ON =1, Rit OFF = 0
char dinfop5[]= " "; // 1 bulank nouse for TS711/811/940 XIT
char dinfop6[]= " "; // 1 bulank nouse for TS940only
char dinfop7[]= "00"; // MEMORY
char dinfop8[]= "0"; // RX ;"0", TX;"1"
char dinfop9[]= "1"; //TS820*** 1;LSB,2;USB,3;CW,4;FM,5;AM,6;FSK,7;CW-N
char dinfop10[]= "0"; // 0;VFO-A,1;VFO-B,2;MEMORY, 3;CALL for ONLY TS-711/811
char dinfop11[]= "0"; // SCAN on;1, off;0
char dinfop12[]= "0"; // SPLIT on;1, off;0
char dinfop13[]= " "; // 1 bulank (TONE on;1, off;0 for ONLY TS-811)
char dinfop14[]= " "; // 2 bulank (TONE Frequency for ONLY TS-811)
char dinfop15[]= " "; // 1 bulank (offset for ONLY TS-811)
char dinfop16[]= ";"; // delimitter
ss0 = dinfop0;
//ss1 = dinfop1;
ss2 = dinfop2;
ss3 = dinfop3;
ss4 = dinfop4;
ss5 = dinfop5;
ss6 = dinfop6;
ss7 = dinfop7;
ss8 = dinfop8;
ss9 = dinfop9;
ss10 = dinfop10;
ss11 = dinfop11;
ss12 = dinfop12;
ss13 = dinfop13;
ss14 = dinfop14;
ss15 = dinfop15;
ss16 = dinfop16;
void task1 (void* arg) {
while (1) {
String ss0;
String ss1;
String ss2;
String ss3;
String ss4;
String ss5;
String ss6;
String ss7;
String ss8;
String ss9;
String ss10;
String ss11;
String ss12;
String ss13;
String ss14;
String ss15;
String ss16;
char cc[11] = " "; //initialize cc[]
char dinfop0[]= "IF";// command for read setinformation
char dinfop1[]= " ";//TS820*** frequency sprintf(cc,"%011d",frq);
sprintf(cc,"%011d",frq);
ss1 = cc;
char dinfop2[]= " "; // 5 bulank memory nouse
char dinfop3[]= "+0000"; // Rit frequency
char dinfop4[]= "1"; // Rit ON =1, Rit OFF = 0
char dinfop5[]= " "; // 1 bulank nouse for TS711/811/940 XIT
char dinfop6[]= " "; // 1 bulank nouse for TS940only
char dinfop7[]= "00"; // MEMORY
char dinfop8[]= "0"; // RX ;"0", TX;"1"
char dinfop9[]= "1"; //TS820*** 1;LSB,2;USB,3;CW,4;FM,5;AM,6;FSK,7;CW-N
char dinfop10[]= "0"; // 0;VFO-A,1;VFO-B,2;MEMORY, 3;CALL for ONLY TS-711/811
char dinfop11[]= "0"; // SCAN on;1, off;0
char dinfop12[]= "0"; // SPLIT on;1, off;0
char dinfop13[]= " "; // 1 bulank (TONE on;1, off;0 for ONLY TS-811)
char dinfop14[]= " "; // 2 bulank (TONE Frequency for ONLY TS-811)
char dinfop15[]= " "; // 1 bulank (offset for ONLY TS-811)
char dinfop16[]= ";"; // delimitter
ss0 = dinfop0;
//ss1 = dinfop1;
ss2 = dinfop2;
ss3 = dinfop3;
ss4 = dinfop4;
ss5 = dinfop5;
ss6 = dinfop6;
ss7 = dinfop7;
ss8 = dinfop8;
ss9 = dinfop9;
ss10 = dinfop10;
ss11 = dinfop11;
ss12 = dinfop12;
ss13 = dinfop13;
ss14 = dinfop14;
ss15 = dinfop15;
ss16 = dinfop16;
sss = ss0+ss1+ss2+ss3+ss4+ss5+ss6+ss7+ss8+ss9+ss10+ss11+ss12+ss13+ss14+ss15+ss16;
if(count!=0){
f_dchange=1;
f_fchange=1;
Serial2.print(sss);
delay(100); // need delay value over 80 so that set delay(100)
if(frq>fmax) frq=fmax;
if(frq<fmin) frq=fmin;
}
}
}
if(count!=0){
f_dchange=1;
f_fchange=1;
Serial2.print(sss);
delay(100); // need delay value over 80 so that set delay(100)
if(frq>fmax) frq=fmax;
if(frq<fmin) frq=fmin;
}
}
}
上記のスケッチ中の下記部がロータリーエンコーダを動かした時だけに周波数のシリアルデータを送出する箇所になります。重要なのは、delay(100);小さくしすぎるとサブダイヤルの周波数表示変化がカクカクします。そうならない値がdelay(80);以上ということです。動作上問題がないと確認したdelay(100);に設定してます。
if(count!=0){
f_dchange=1;
f_fchange=1;
Serial2.print(sss);
delay(100); // need delay value over 80 so that set delay(100)
if(frq>fmax) frq=fmax;
if(frq<fmin) frq=fmin;
}
f_dchange=1;
f_fchange=1;
Serial2.print(sss);
delay(100); // need delay value over 80 so that set delay(100)
if(frq>fmax) frq=fmax;
if(frq<fmin) frq=fmin;
}
■void setup(){のシリアルポートの設定追加とDual
Coreタスク宣言追加
void setup() {
//-----------------------------------------------------------------------------------------------
Serial.begin(115200); //add 2021.Sep.19
char str[64];
Serial2.begin(4800,SERIAL_8N1,RXD2,TXD2);// RXD2:16,TXD2:17
//--------- create tasks on core0 --------------------------------
xTaskCreatePinnedToCore(task0, "Task0", 4096, NULL, 1, NULL, 0);// core0
xTaskCreatePinnedToCore(task1, "Task1", 4096, NULL, 1, NULL, 1);// core1
//--------- Set up Interrupt Timer -------------------------------
timer = timerBegin(0, 80, true); //use Timer0, div80 for 1us clock
timerAttachInterrupt(timer, &onTimer, true);
timerAlarmWrite(timer, 10000, true); // T=10000us
timerAlarmEnable(timer); // Start Timer
//-----------------------------------------------------------------------------------------------
Serial.begin(115200); //add 2021.Sep.19
char str[64];
Serial2.begin(4800,SERIAL_8N1,RXD2,TXD2);// RXD2:16,TXD2:17
//--------- create tasks on core0 --------------------------------
xTaskCreatePinnedToCore(task0, "Task0", 4096, NULL, 1, NULL, 0);// core0
xTaskCreatePinnedToCore(task1, "Task1", 4096, NULL, 1, NULL, 1);// core1
//--------- Set up Interrupt Timer -------------------------------
timer = timerBegin(0, 80, true); //use Timer0, div80 for 1us clock
timerAttachInterrupt(timer, &onTimer, true);
timerAlarmWrite(timer, 10000, true); // T=10000us
timerAlarmEnable(timer); // Start Timer
〜省略
}
■void loop(){ 中の追加
下記は削除していたバンド検出回路の通常時”H”レベル、バンドSW動作時”L"パルス送出の回路をやはり使う必要がで出てきました。なぜかと言うとバンドSWを変えた時の情報がない為、エンコーダーが動いている時にシリアルデータを送出するスケッチではハムログのバンドがバンドSWを変えてもそのままとなってしまう現状動作のためです。バンドがかわった時に出す”L”パルスでバンドが変わった時の周波数データを送出させる対策として追加しました。
if(digitalRead(CHANG_BAND)==LOW){ // IF pin24 L PULS IN (ordinary H level)
FrqToHamlog();
}
FrqToHamlog();
}
if(((((((((((digitalRead(TO_ESPD0)==HIGH) // "1" PLL OUT
portD0-D10 condition check
and(digitalRead(TO_ESPD1)==LOW)
and(digitalRead(TO_ESPD2)==LOW)
and(digitalRead(TO_ESPD3)==LOW)
and(digitalRead(TO_ESPD4)==LOW)
and(digitalRead(TO_ESPD5)==LOW)
and(digitalRead(TO_ESPD6)==LOW)
and(digitalRead(TO_ESPD7)==LOW)
and(digitalRead(TO_ESPD8)==LOW)
and(digitalRead(TO_ESPD9)==LOW)
and(digitalRead(TO_ESPD10)==LOW))))))))))){ //29.5MHz
HET_FREQ = HET_FREQ11;
if(p==0){
frq = freq11;
FrqToHamlog();
p=1;
}
else{
if(p==1){
frq = HET_FREQ - 5500000 + o_frq;
p=1;
}
}
f_dchange = 1;
f_fchange=1;//add 2020Dec12
}
else{
if(((((((((((digitalRead(TO_ESPD0)==LOW) // "1" BCD port condition check
and(digitalRead(TO_ESPD1)==HIGH)
and(digitalRead(TO_ESPD2)==LOW)
and(digitalRead(TO_ESPD3)==LOW)
and(digitalRead(TO_ESPD4)==LOW)
and(digitalRead(TO_ESPD5)==LOW)
and(digitalRead(TO_ESPD6)==LOW)
and(digitalRead(TO_ESPD7)==LOW)
and(digitalRead(TO_ESPD8)==LOW)
and(digitalRead(TO_ESPD9)==LOW)
and(digitalRead(TO_ESPD10)==LOW))))))))))){ //29MHz
HET_FREQ = HET_FREQ10;
if(p==0){
frq = freq10;
FrqToHamlog();
p=1;
}
else{
if(p==1){
frq = HET_FREQ - 5500000 + o_frq;
p=1;
}
}
f_dchange = 1;
f_fchange=1;//add 2020Dec12
}
}
and(digitalRead(TO_ESPD1)==LOW)
and(digitalRead(TO_ESPD2)==LOW)
and(digitalRead(TO_ESPD3)==LOW)
and(digitalRead(TO_ESPD4)==LOW)
and(digitalRead(TO_ESPD5)==LOW)
and(digitalRead(TO_ESPD6)==LOW)
and(digitalRead(TO_ESPD7)==LOW)
and(digitalRead(TO_ESPD8)==LOW)
and(digitalRead(TO_ESPD9)==LOW)
and(digitalRead(TO_ESPD10)==LOW))))))))))){ //29.5MHz
HET_FREQ = HET_FREQ11;
if(p==0){
frq = freq11;
FrqToHamlog();
p=1;
}
else{
if(p==1){
frq = HET_FREQ - 5500000 + o_frq;
p=1;
}
}
f_dchange = 1;
f_fchange=1;//add 2020Dec12
}
else{
if(((((((((((digitalRead(TO_ESPD0)==LOW) // "1" BCD port condition check
and(digitalRead(TO_ESPD1)==HIGH)
and(digitalRead(TO_ESPD2)==LOW)
and(digitalRead(TO_ESPD3)==LOW)
and(digitalRead(TO_ESPD4)==LOW)
and(digitalRead(TO_ESPD5)==LOW)
and(digitalRead(TO_ESPD6)==LOW)
and(digitalRead(TO_ESPD7)==LOW)
and(digitalRead(TO_ESPD8)==LOW)
and(digitalRead(TO_ESPD9)==LOW)
and(digitalRead(TO_ESPD10)==LOW))))))))))){ //29MHz
HET_FREQ = HET_FREQ10;
if(p==0){
frq = freq10;
FrqToHamlog();
p=1;
}
else{
if(p==1){
frq = HET_FREQ - 5500000 + o_frq;
p=1;
}
}
f_dchange = 1;
f_fchange=1;//add 2020Dec12
}
}
以下上記と同じようなバンドごとの設定スケッチが続きます。
■上記のバンドSWが変わった時にハムログへ周波数データを単発でシリアル送出するサブルーチンも前のをそのまま使います。
void FrqToHamlog(){ //Frequency Set to Hamlog when setting power on( p=0 then FrqToHamlog();)
//************************ Send Freq & Mode to HAMLOG *****************************
// 2021JAN17 Kenwood Command
//*********************************************************************************
String ss0;
String ss1;
String ss2;
String ss3;
String ss4;
String ss5;
String ss6;
String ss7;
String ss8;
String ss9;
String ss10;
String ss11;
String ss12;
String ss13;
String ss14;
String ss15;
String ss16;
char cc[11] = " "; //initialize cc[]
char dinfop0[]= "IF";// command for read setinformation
char dinfop1[]= " ";//TS820*** frequency sprintf(cc,"%011d",frq);
sprintf(cc,"%011d",frq);
ss1 = cc;
char dinfop2[]= " "; // 5 bulank memory nouse
char dinfop3[]= "+0000"; // Rit frequency
char dinfop4[]= "1"; // Rit ON =1, Rit OFF = 0
char dinfop5[]= " "; // 1 bulank nouse for TS711/811/940 XIT
char dinfop6[]= " "; // 1 bulank nouse for TS940only
char dinfop7[]= "00"; // MEMORY
char dinfop8[]= "0"; // RX ;"0", TX;"1"
char dinfop9[]= "1"; //TS820*** 1;LSB,2;USB,3;CW,4;FM,5;AM,6;FSK,7;CW-N
char dinfop10[]= "0"; // 0;VFO-A,1;VFO-B,2;MEMORY, 3;CALL for ONLY TS-711/811
char dinfop11[]= "0"; // SCAN on;1, off;0
char dinfop12[]= "0"; // SPLIT on;1, off;0
char dinfop13[]= " "; // 1 bulank (TONE on;1, off;0 for ONLY TS-811)
char dinfop14[]= " "; // 2 bulank (TONE Frequency for ONLY TS-811)
char dinfop15[]= " "; // 1 bulank (offset for ONLY TS-811)
char dinfop16[]= ";"; // delimitter
ss0 = dinfop0;
//ss1 = dinfop1;
ss2 = dinfop2;
ss3 = dinfop3;
ss4 = dinfop4;
ss5 = dinfop5;
ss6 = dinfop6;
ss7 = dinfop7;
ss8 = dinfop8;
ss9 = dinfop9;
ss10 = dinfop10;
ss11 = dinfop11;
ss12 = dinfop12;
ss13 = dinfop13;
ss14 = dinfop14;
ss15 = dinfop15;
ss16 = dinfop16;
sss = ss0+ss1+ss2+ss3+ss4+ss5+ss6+ss7+ss8+ss9+ss10+ss11+ss12+ss13+ss14+ss15+ss16;
Serial2.print(sss);
}
//************************ Send Freq & Mode to HAMLOG *****************************
// 2021JAN17 Kenwood Command
//*********************************************************************************
String ss0;
String ss1;
String ss2;
String ss3;
String ss4;
String ss5;
String ss6;
String ss7;
String ss8;
String ss9;
String ss10;
String ss11;
String ss12;
String ss13;
String ss14;
String ss15;
String ss16;
char cc[11] = " "; //initialize cc[]
char dinfop0[]= "IF";// command for read setinformation
char dinfop1[]= " ";//TS820*** frequency sprintf(cc,"%011d",frq);
sprintf(cc,"%011d",frq);
ss1 = cc;
char dinfop2[]= " "; // 5 bulank memory nouse
char dinfop3[]= "+0000"; // Rit frequency
char dinfop4[]= "1"; // Rit ON =1, Rit OFF = 0
char dinfop5[]= " "; // 1 bulank nouse for TS711/811/940 XIT
char dinfop6[]= " "; // 1 bulank nouse for TS940only
char dinfop7[]= "00"; // MEMORY
char dinfop8[]= "0"; // RX ;"0", TX;"1"
char dinfop9[]= "1"; //TS820*** 1;LSB,2;USB,3;CW,4;FM,5;AM,6;FSK,7;CW-N
char dinfop10[]= "0"; // 0;VFO-A,1;VFO-B,2;MEMORY, 3;CALL for ONLY TS-711/811
char dinfop11[]= "0"; // SCAN on;1, off;0
char dinfop12[]= "0"; // SPLIT on;1, off;0
char dinfop13[]= " "; // 1 bulank (TONE on;1, off;0 for ONLY TS-811)
char dinfop14[]= " "; // 2 bulank (TONE Frequency for ONLY TS-811)
char dinfop15[]= " "; // 1 bulank (offset for ONLY TS-811)
char dinfop16[]= ";"; // delimitter
ss0 = dinfop0;
//ss1 = dinfop1;
ss2 = dinfop2;
ss3 = dinfop3;
ss4 = dinfop4;
ss5 = dinfop5;
ss6 = dinfop6;
ss7 = dinfop7;
ss8 = dinfop8;
ss9 = dinfop9;
ss10 = dinfop10;
ss11 = dinfop11;
ss12 = dinfop12;
ss13 = dinfop13;
ss14 = dinfop14;
ss15 = dinfop15;
ss16 = dinfop16;
sss = ss0+ss1+ss2+ss3+ss4+ss5+ss6+ss7+ss8+ss9+ss10+ss11+ss12+ss13+ss14+ss15+ss16;
Serial2.print(sss);
}
以上の変更追加にてハムログでの周波数データの取り込みが出来るようになります。
ただし厄介な事に、以前シリアルデータ用のICを使って上手くPC上でも認識できたAE-FT234Xが古いPCで認識エラーがでて使うことが出来ない状態です。前はXPのPCで動いていたのですが、HAMLOGのアプリでのシリアル設定で使えない状態でした。今回はADM3202のシリアル変換ICとARVELのUSBシリアルケーブルで急遽代用しました。AE-FT234XはWindows10でUSB3.0では動作します。2.0ではダメでした。XPで動かないのもドライバーのせいかと思い、ダウンロードしてインストールしましたが、動作しませんでした。XPの役目がなくなりつつあります。寂しい!
今日試験ボードで完成したばかりで回路図も修正しなければなりません。
テスト運用に向けて、既存の基板を修正追加したいと思います。
つづく?
TS820-DDS-VFOその13
(2022/3/1 4:49:55)
TS820-DDS-VFOの組込のTFT液晶表示部へのRIT周波数、及び送信、受信状態の表示の追加のスケッチ防備録です。
■RIT周波数のTFT表示に関して
RIT周波数の変化分はtawase
に入りますが、この変数に入った値をsprintfで表示させるのですが、0Hzのときの表示がtawase変数をsprintf(str,"%03d",tawase)の%03dの書式表示させると ”000”Hzと表示されてしまいます。やはり0Hzの時の表示は”0"Hzにしたいので、+側(0から+1000Hz)はあえてTFT表示は直接文字を書き込みするように変更しました。(1箇所の0Hz表示だけの対応で良かったのですが、TFTの桁位置設定が楽に出来るので直接ストリング表示の sprintf(str,"%s","
0");の%sの書式表示を使い+1000まで対応しました。ー側の整数値は問題ないので
tawase値の”%03d"書式表示を使っています。)なお、TFT表示はtawaseの値で振り分ける構造化のswitch
caseを使いスケッチしてあります。
sprintf(str,"%03d",tawase); →
sprintf(str,"%s"," 0");
ストリング書式での直接書き込みにすることで、RITを設定してない時は
”0”Hzの表示になります。0から+側のRIT周波数の各設定時のTFT表示は下記の"
"内の記載の様にしています。(単位は別途単独表示です。)
"0"Hz,"+100"Hz
,"+200"Hz,"+300"Hz,"+400"Hz,"+500"Hz,"+600"Hz,"+700"Hz,"+800"Hz,
"+900"Hz,"+1000"Hz
■定義部分の追加(RIT周波数)
int32_t RRIT_frq; //RX RIT-frequency ADD 2022/FEB/27
■void loop()ルーチン分への追加です。 黄色 部が 追加修正箇所
//-----------------------------------------------------------------------------------------------
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);
// 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, 110, 0xffd080);
sprintf(str, "MHz" );
disp_str12(str,120, 111, 0xffd080);
// Condition TX,RX display add FEB27 **************************************************
// Display RX RIT frquency ADD 2022/FEB/27
sprintf(str ,"%3d.%03d,%02d", RRIT_frq/1000000,(RRIT_frq/1000)%1000,(RRIT_frq/10)%100);
disp_str16(str,17, 70, 0xffd080);
switch (tawase){
case 0:
sprintf(str,"%s"," 0"); //Only 0 NOUSE tawase variable
disp_str16(str,84,90,0xffd080);
break;
case 100:
//sprintf(str,"%03d",tawase);
sprintf(str,"%s","+100");
disp_str16(str,84,90,0xffd080);
break;
case 200:
//sprintf(str,"%03d",tawase);
sprintf(str,"%s","+200");
disp_str16(str,84,90,0xffd080);
break;
case 300:
//sprintf(str,"%03d",tawase);
sprintf(str,"%s","+300");
disp_str16(str,84,90,0xffd080);
break;
case 400:
//sprintf(str,"%03d",tawase);
sprintf(str,"%s","+400");
disp_str16(str,84,90,0xffd080);
break;
case 500:
//sprintf(str,"%03d",tawase);
sprintf(str,"%s","+500");
disp_str16(str,84,90,0xffd080);
break;
case 600:
//sprintf(str,"%03d",tawase);
sprintf(str,"%s","+600");
disp_str16(str,84,90,0xffd080);
break;
case 700:
//sprintf(str,"%03d",tawase);
sprintf(str,"%s","+700");
disp_str16(str,84,90,0xffd080);
break;
case 800:
//sprintf(str,"%03d",tawase);
sprintf(str,"%s","+800");
disp_str16(str,84,90,0xffd080);
break;
case 900:
//sprintf(str,"%03d",tawase);
sprintf(str,"%s","+900");
disp_str16(str,84,90,0xffd080);
break;
case 1000:
//sprintf(str,"%03d",tawase);
sprintf(str,"%s","+1000");
disp_str16(str,74,90,0xffd080); // adjusting degit location x
break;
case -100:
sprintf(str,"%03d",tawase);
disp_str16(str,84,90,0xffd080);
break;
case -200:
sprintf(str,"%03d",tawase);
disp_str16(str,84,90,0xffd080);
break;
case -300:
sprintf(str,"%03d",tawase);
disp_str16(str,84,90,0xffd080);
break;
case -400:
sprintf(str,"%03d",tawase);
disp_str16(str,84,90,0xffd080);
break;
case -500:
sprintf(str,"%03d",tawase);
disp_str16(str,84,90,0xffd080);
break;
case -600:
sprintf(str,"%03d",tawase);
disp_str16(str,84,90,0xffd080);
break;
case -700:
sprintf(str,"%03d",tawase);
disp_str16(str,84,90,0xffd080);
break;
case -800:
sprintf(str,"%03d",tawase);
disp_str16(str,84,90,0xffd080);
break;
case -900:
sprintf(str,"%03d",tawase);
disp_str16(str,84,90,0xffd080);
break;
case -1000:
sprintf(str,"%03d",tawase);
disp_str16(str,74,90,0xffd080); // adjusting degit location x
break;
default:
break;
}
// RIT_frq Unit Setting
sprintf(str,"Hz");
disp_str12(str,132,92, 0xffd080);
if(digitalRead(TX_SW) == HIGH){
sprintf(str,"RX: RIT:");
disp_str12(str,0,92,0xffd080);
}
else {
if(digitalRead(TX_SW) == LOW){
sprintf(str,"TX:");
disp_str12(str,0,112,0xffd080);
}
//*************************************************************************************
}
if(f_redraw==0){
trans65k(); //Convert 24bit image to 16bit image
f_redraw=1; //uint8_t f_redraw;
}
}
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);
// 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, 110, 0xffd080);
sprintf(str, "MHz" );
disp_str12(str,120, 111, 0xffd080);
// Condition TX,RX display add FEB27 **************************************************
// Display RX RIT frquency ADD 2022/FEB/27
sprintf(str ,"%3d.%03d,%02d", RRIT_frq/1000000,(RRIT_frq/1000)%1000,(RRIT_frq/10)%100);
disp_str16(str,17, 70, 0xffd080);
switch (tawase){
case 0:
sprintf(str,"%s"," 0"); //Only 0 NOUSE tawase variable
disp_str16(str,84,90,0xffd080);
break;
case 100:
//sprintf(str,"%03d",tawase);
sprintf(str,"%s","+100");
disp_str16(str,84,90,0xffd080);
break;
case 200:
//sprintf(str,"%03d",tawase);
sprintf(str,"%s","+200");
disp_str16(str,84,90,0xffd080);
break;
case 300:
//sprintf(str,"%03d",tawase);
sprintf(str,"%s","+300");
disp_str16(str,84,90,0xffd080);
break;
case 400:
//sprintf(str,"%03d",tawase);
sprintf(str,"%s","+400");
disp_str16(str,84,90,0xffd080);
break;
case 500:
//sprintf(str,"%03d",tawase);
sprintf(str,"%s","+500");
disp_str16(str,84,90,0xffd080);
break;
case 600:
//sprintf(str,"%03d",tawase);
sprintf(str,"%s","+600");
disp_str16(str,84,90,0xffd080);
break;
case 700:
//sprintf(str,"%03d",tawase);
sprintf(str,"%s","+700");
disp_str16(str,84,90,0xffd080);
break;
case 800:
//sprintf(str,"%03d",tawase);
sprintf(str,"%s","+800");
disp_str16(str,84,90,0xffd080);
break;
case 900:
//sprintf(str,"%03d",tawase);
sprintf(str,"%s","+900");
disp_str16(str,84,90,0xffd080);
break;
case 1000:
//sprintf(str,"%03d",tawase);
sprintf(str,"%s","+1000");
disp_str16(str,74,90,0xffd080); // adjusting degit location x
break;
case -100:
sprintf(str,"%03d",tawase);
disp_str16(str,84,90,0xffd080);
break;
case -200:
sprintf(str,"%03d",tawase);
disp_str16(str,84,90,0xffd080);
break;
case -300:
sprintf(str,"%03d",tawase);
disp_str16(str,84,90,0xffd080);
break;
case -400:
sprintf(str,"%03d",tawase);
disp_str16(str,84,90,0xffd080);
break;
case -500:
sprintf(str,"%03d",tawase);
disp_str16(str,84,90,0xffd080);
break;
case -600:
sprintf(str,"%03d",tawase);
disp_str16(str,84,90,0xffd080);
break;
case -700:
sprintf(str,"%03d",tawase);
disp_str16(str,84,90,0xffd080);
break;
case -800:
sprintf(str,"%03d",tawase);
disp_str16(str,84,90,0xffd080);
break;
case -900:
sprintf(str,"%03d",tawase);
disp_str16(str,84,90,0xffd080);
break;
case -1000:
sprintf(str,"%03d",tawase);
disp_str16(str,74,90,0xffd080); // adjusting degit location x
break;
default:
break;
}
// RIT_frq Unit Setting
sprintf(str,"Hz");
disp_str12(str,132,92, 0xffd080);
if(digitalRead(TX_SW) == HIGH){
sprintf(str,"RX: RIT:");
disp_str12(str,0,92,0xffd080);
}
else {
if(digitalRead(TX_SW) == LOW){
sprintf(str,"TX:");
disp_str12(str,0,112,0xffd080);
}
//*************************************************************************************
}
if(f_redraw==0){
trans65k(); //Convert 24bit image to 16bit image
f_redraw=1; //uint8_t f_redraw;
}
}
〜省略
}
■RIT周波数を変数に入れる追加 (void task0(void* arg)への追加箇所)
/*-----------------------------------------------------------------------------------------------
Alternative Loop (core0)
------------------------------------------------------------------------------------------------*/
void task0(void* arg)
{
while (1)
{
pcnt_get_counter_value(PCNT_UNIT_0, &RE_Count);
int count=RE_Count;
pcnt_counter_clear(PCNT_UNIT_0);
if(f_rev==1) count=-count;
if(count!=0){
f_dchange=1;
f_fchange=1;
frq+= count * freq_step;
if(frq>fmax) frq=fmax;
if(frq<fmin) frq=fmin;
}
//-------------------------------------
if(f_fchange==1){
f_fchange=0;
// Output Lo freq
//set_freq( frq + offset_frq );
p_frq = HET_FREQ-frq + offset_frq + awase + tawase ; // add RITfreq
//RX RIT-frequency ADD 2022/FEB/27,28
RRIT_frq = HET_FREQ - p_frq + 150 + tawase ;
set_freq( HET_FREQ - frq + offset_frq + awase); //change to ts820vfo
o_frq = frq - HET_FREQ + 5500000; //エンコーダー変化分
set_car_freq((car_frq + awase ), f_carON, 0);
}
//-------------------------------------
if(f_cchange==1){
f_cchange=0;
// Output Car freq
//set_car_freq(car_frq, f_carON, 0);
set_car_freq((car_frq + awase ), f_carON, 0);
}
if(f_redraw==1){
Transfer_Image();
f_redraw=0;
}
delay(1);
}
}
Alternative Loop (core0)
------------------------------------------------------------------------------------------------*/
void task0(void* arg)
{
while (1)
{
pcnt_get_counter_value(PCNT_UNIT_0, &RE_Count);
int count=RE_Count;
pcnt_counter_clear(PCNT_UNIT_0);
if(f_rev==1) count=-count;
if(count!=0){
f_dchange=1;
f_fchange=1;
frq+= count * freq_step;
if(frq>fmax) frq=fmax;
if(frq<fmin) frq=fmin;
}
//-------------------------------------
if(f_fchange==1){
f_fchange=0;
// Output Lo freq
//set_freq( frq + offset_frq );
p_frq = HET_FREQ-frq + offset_frq + awase + tawase ; // add RITfreq
//RX RIT-frequency ADD 2022/FEB/27,28
RRIT_frq = HET_FREQ - p_frq + 150 + tawase ;
set_freq( HET_FREQ - frq + offset_frq + awase); //change to ts820vfo
o_frq = frq - HET_FREQ + 5500000; //エンコーダー変化分
set_car_freq((car_frq + awase ), f_carON, 0);
}
//-------------------------------------
if(f_cchange==1){
f_cchange=0;
// Output Car freq
//set_car_freq(car_frq, f_carON, 0);
set_car_freq((car_frq + awase ), f_carON, 0);
}
if(f_redraw==1){
Transfer_Image();
f_redraw=0;
}
delay(1);
}
}
RIT周波数の設定時の表示と送信、受信の状態表示が上手く出来ました。あとは実際にRITを設定した状態での送信入力とTS820の送信コントロール信号線出力とを繋ぎ実際の送信時に上手く動作するかの確認が残っています。上手く行ったら試験運用もしてみたいと思います。
つづく?
TS820-DDS-VFOその5
(2022/2/28 3:58:12)
続きを読む
ESP32DevKitCに設定した入力11ポートにワイヤー11本で繋ぎ、ブレッドボードに回路を組んで、早速BCD回路で組んでいたプログラムのif文ルーチンを直接コーディング開始しました。前のBCD回路の4ポートの状態確認をD0からD10の全11ポートの状態確認にするだけです。少しコーディングが長くはなりますが、TS820のPLL回路からの選択したバンドの+B電圧を確認する条件文です。この条件文で分岐動作させる内容はBCD入力の時のコードと全く同じです。IF文の条件で現在のTS820のバンドSWの位置の判断を行います。上記の書き換えの為には新たな入力の11ポートの入力ポート宣言と設定をする必要があります。
以下追加宣言部です。
//for TS-820 SELECT BAND +B VOLTAGE PORT D0 TO D10 ADD JAN23
#define TO_ESPD0 13 //1.8MHz 180m
#define TO_ESPD1 14 //3.5MHz 80m
#define TO_ESPD2 27 //7.0MHz 40m
#define TO_ESPD3 26 //14.0MHz 20m
#define TO_ESPD4 25 //15.0MHz 20m JJY
#define TO_ESPD5 33 //18.0MHz 17m
#define TO_ESPD6 32 //21.0MHz 15m
#define TO_ESPD7 35 //28.0MHz 10m
#define TO_ESPD8 34 //28.5MHz 10m
#define TO_ESPD9 39 //29.0MHz 10m
#define TO_ESPD10 36 //29.5MHz 10m
#define TO_ESPD0 13 //1.8MHz 180m
#define TO_ESPD1 14 //3.5MHz 80m
#define TO_ESPD2 27 //7.0MHz 40m
#define TO_ESPD3 26 //14.0MHz 20m
#define TO_ESPD4 25 //15.0MHz 20m JJY
#define TO_ESPD5 33 //18.0MHz 17m
#define TO_ESPD6 32 //21.0MHz 15m
#define TO_ESPD7 35 //28.0MHz 10m
#define TO_ESPD8 34 //28.5MHz 10m
#define TO_ESPD9 39 //29.0MHz 10m
#define TO_ESPD10 36 //29.5MHz 10m
下記のo_frqも追加宣言します。
p_frqは設定値の確認で使用したものです。
int32_t o_frq;
//encorder move frequency value +-
int32_t p_frq;
int32_t p_frq;
下記のパルス入ロポート及び初期時のトリガー出力用ポートも使用するので宣言します。
#define CHANG_BAND
16 //change BAND then low pulse CHANGE ON 2022/JAN/11
#define START_ON 0 //Output PORT 0 start timer torrigger for IC 555 2pin
#define START_ON 0 //Output PORT 0 start timer torrigger for IC 555 2pin
セットアップルーチンでは下記の入力ポート設定をします。
pinMode(TO_ESPD0,INPUT);
//DIGITAL INPUT 13 D0
pinMode(TO_ESPD1,INPUT); //DIGITAL INPUT 14 D1
pinMode(TO_ESPD2,INPUT); //DIGITAL INPUT 27 D2
pinMode(TO_ESPD3,INPUT); //DIGITAL INPUT 26 D3
pinMode(TO_ESPD4,INPUT); //DIGITAL INPUT 25 D4
pinMode(TO_ESPD5,INPUT); //DIGITAL INPUT 33 D5
pinMode(TO_ESPD6,INPUT); //DIGITAL INPUT 32 D6
pinMode(TO_ESPD7,INPUT); //DIGITAL INPUT 35 D7
pinMode(TO_ESPD8,INPUT); //DIGITAL INPUT 34 D8
pinMode(TO_ESPD9,INPUT); //DIGITAL INPUT 39 D9
pinMode(TO_ESPD10,INPUT); //DIGITAL INPUT 36 D10
pinMode(TO_ESPD1,INPUT); //DIGITAL INPUT 14 D1
pinMode(TO_ESPD2,INPUT); //DIGITAL INPUT 27 D2
pinMode(TO_ESPD3,INPUT); //DIGITAL INPUT 26 D3
pinMode(TO_ESPD4,INPUT); //DIGITAL INPUT 25 D4
pinMode(TO_ESPD5,INPUT); //DIGITAL INPUT 33 D5
pinMode(TO_ESPD6,INPUT); //DIGITAL INPUT 32 D6
pinMode(TO_ESPD7,INPUT); //DIGITAL INPUT 35 D7
pinMode(TO_ESPD8,INPUT); //DIGITAL INPUT 34 D8
pinMode(TO_ESPD9,INPUT); //DIGITAL INPUT 39 D9
pinMode(TO_ESPD10,INPUT); //DIGITAL INPUT 36 D10
おおまかな動作は、ESP32DevKitCのCHANG_BANDポート(GPIO16)には、パルス発生ゲートIC(74121)のLパルスが入力されるとバンドSWの確認が行われるフローで動作します。バンドSWを回して一瞬オープンになった時にトランジスターエミッタの出力が”L”レベルに下がり次のバンドにSWが繋がると”L”から”H”レベルになりこの立ち上がりでタイマーIC(555)がスタートします。実際に使うタイマー時間は極力短く設定するようにしていますが、動作を理解するためにコンデンサの容量を少し大きめにして目でみて分かる程度までタイマー時間を延ばしてあります。(0.47μFを10μFに変えてます。)タイマー出力は”L”から設定時間だけの間”H”となりタイマー時間終了後に”L”に下がります。このタイマー出力はパルス発生の74121の入力にダイオードで繋いでいます。カソードをタイマーIC(555)の出力側に、アノードを74121の入力側に繋いでいます。最初は直接つないでいたのですが、最終的にはこのダイオードの追加が必要でした。他のESP32DevKitCの電源が入った初期にバンドSWの確認を行う為パルスを出していますが、立ち上がり時間が多少かかるので、長めのタイマー時間設定でのタイマーIC(555)を使い同じ様に立ち下がりでパルス発生させて設定バンドを設定しています。74121の入力は2つの回路出力が繋がるのですが、両方ともパスル発生をさせる為にはダイオードの追加が必要でした。回路図は修正し、パターンもダイオード追加変更しています。やはり確認してゆくと、何らかの変更はあるものです。
下記は1.9MHzと3.5MHzの実際のコードです。PLL回路からのバンド選択時出力の+B電圧が何処のバンドポートに印加されてるかを見ているコードです。この様な11ポート分のIF文ルーチンが延々と続きます。
プログラムの動作説明ですが、電源がESP32DivKitCにかかり起動すると、最初はプリセットのヘテロダイン周波数に設定されますが、この初回時の状態は初期値p=0でのみ通す様にし、通過後は強制的にp=1に設定しています。このため起動後はp=1のルーチン側のみで動作する様になります。
ロータリーエンコーダーまわし動いた周波数分をo_frq; //encorder move frequency value +- としてfrq = HET_FREQ -
5500000 + o_frq;で周波数を設定します。このo_frqは、下記のコードの次に説明します。
if(digitalRead(CHANG_BAND)==LOW){ // IF pin16 L PULS IN (ordinary H level)
if(((((((((((digitalRead(TO_ESPD0)==HIGH) // PLL OUT portD0-D10 condition check
and(digitalRead(TO_ESPD1)==LOW)
and(digitalRead(TO_ESPD2)==LOW)
and(digitalRead(TO_ESPD3)==LOW)
and(digitalRead(TO_ESPD4)==LOW)
and(digitalRead(TO_ESPD5)==LOW)
and(digitalRead(TO_ESPD6)==LOW)
and(digitalRead(TO_ESPD7)==LOW)
and(digitalRead(TO_ESPD8)==LOW)
and(digitalRead(TO_ESPD9)==LOW)
and(digitalRead(TO_ESPD10)==LOW))))))))))){ //1.9MHz
HET_FREQ = HET_FREQ01;
if(p==0){
frq = freq01;
p=1;
}
else{
if(p==1){
frq = HET_FREQ - 5500000 + o_frq;
p=1;
}
}
f_dchange = 1;
f_fchange=1;//add 2020Dec12
//digitalWrite(LED_BUILTIN,HIGH); //D0 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN1,LOW); //D1 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN2,LOW); //D2 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN3,LOW); //D3 THERE'S NO OUTPUTPORT FOR USE
}
if(((((((((((digitalRead(TO_ESPD0)==HIGH) // PLL OUT portD0-D10 condition check
and(digitalRead(TO_ESPD1)==LOW)
and(digitalRead(TO_ESPD2)==LOW)
and(digitalRead(TO_ESPD3)==LOW)
and(digitalRead(TO_ESPD4)==LOW)
and(digitalRead(TO_ESPD5)==LOW)
and(digitalRead(TO_ESPD6)==LOW)
and(digitalRead(TO_ESPD7)==LOW)
and(digitalRead(TO_ESPD8)==LOW)
and(digitalRead(TO_ESPD9)==LOW)
and(digitalRead(TO_ESPD10)==LOW))))))))))){ //1.9MHz
HET_FREQ = HET_FREQ01;
if(p==0){
frq = freq01;
p=1;
}
else{
if(p==1){
frq = HET_FREQ - 5500000 + o_frq;
p=1;
}
}
f_dchange = 1;
f_fchange=1;//add 2020Dec12
//digitalWrite(LED_BUILTIN,HIGH); //D0 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN1,LOW); //D1 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN2,LOW); //D2 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN3,LOW); //D3 THERE'S NO OUTPUTPORT FOR USE
}
else{
if(((((((((((digitalRead(TO_ESPD0)==LOW) // PLL OUT portD0-D10 condition check
and(digitalRead(TO_ESPD1)==HIGH)
and(digitalRead(TO_ESPD2)==LOW)
and(digitalRead(TO_ESPD3)==LOW)
and(digitalRead(TO_ESPD4)==LOW)
and(digitalRead(TO_ESPD5)==LOW)
and(digitalRead(TO_ESPD6)==LOW)
and(digitalRead(TO_ESPD7)==LOW)
and(digitalRead(TO_ESPD8)==LOW)
and(digitalRead(TO_ESPD9)==LOW)
and(digitalRead(TO_ESPD10)==LOW))))))))))){ //3.5MHz
HET_FREQ = HET_FREQ02;
if(p==0){
frq = freq02;
p=1;
}
else{
if(p==1){
frq = HET_FREQ - 5500000 + o_frq;
p=1;
}
}
if(((((((((((digitalRead(TO_ESPD0)==LOW) // PLL OUT portD0-D10 condition check
and(digitalRead(TO_ESPD1)==HIGH)
and(digitalRead(TO_ESPD2)==LOW)
and(digitalRead(TO_ESPD3)==LOW)
and(digitalRead(TO_ESPD4)==LOW)
and(digitalRead(TO_ESPD5)==LOW)
and(digitalRead(TO_ESPD6)==LOW)
and(digitalRead(TO_ESPD7)==LOW)
and(digitalRead(TO_ESPD8)==LOW)
and(digitalRead(TO_ESPD9)==LOW)
and(digitalRead(TO_ESPD10)==LOW))))))))))){ //3.5MHz
HET_FREQ = HET_FREQ02;
if(p==0){
frq = freq02;
p=1;
}
else{
if(p==1){
frq = HET_FREQ - 5500000 + o_frq;
p=1;
}
}
f_dchange = 1;
f_fchange=1;//add 2020Dec12
//digitalWrite(LED_BUILTIN, LOW); //D0 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN1,HIGH); //D1 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN2, LOW); //D2 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN3, LOW); //D3 THERE'S NO OUTPUTPORT FOR USE
}
}
f_fchange=1;//add 2020Dec12
//digitalWrite(LED_BUILTIN, LOW); //D0 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN1,HIGH); //D1 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN2, LOW); //D2 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN3, LOW); //D3 THERE'S NO OUTPUTPORT FOR USE
}
}
〜省略
29.5MHzの入力ポートTO_ESPD10ポート が"HIGH"となる条件文のルーチンコードが続きます。
以前のバンド毎にBCDコードの出力を出していたルーチンは設定周波数検出時に出力を出そうかと思っていましたが、出力用ポートが4ポート必要ですが、2ポート不足しましたので使用しないことにしました。(周波数検出時のD0,D1,D2,D3のBCD出力)
o_frqの周波数動分は 下記のtask0
のループルーチンで周波数設定時に値を計算取得するようにしています。このルーチンで取得した周波数変化分のo_frqでTS820のバンドSWを切り替えても
frq = HET_FREQ - 5500000 +
o_frq;の計算式で設定した変動分を使用することで、VFO発振周波数は何処のバンドも同じ周波数で発振させることが出来るようにしています。
バンドSWを回してもp=1のルーチンしか通らないのでプリセット周波数へ設定されることありません。
エンコーダーをまわして1.815,00MHzに設定後TS820の本体のバンドSWを回した時の周波数表示です。
VFO発振周波数は5.485,00MHzでどのバンドも同じ発振周波数のままです。ヘテロダインの周波数を使った周波数表示も問題ありません。
実際の周波数表示は、こんな風になります。
1.815,00MHz⇔3.515,00MHz⇔7.015,00MHz⇔14.015,00MHz⇔15.015,00MHz⇔18.015,00MHz⇔21,015,00MHz
⇔28.015,00MHz⇔28.515,00MHz⇔29.015,00MHz⇔29.515,00MHz
下記のルーチンでo_frqを計算で取得しました。
/*-----------------------------------------------------------------------------------------------
Alternative Loop (core0)
------------------------------------------------------------------------------------------------*/
void task0(void* arg)
{
while (1)
{
pcnt_get_counter_value(PCNT_UNIT_0, &RE_Count);
int count=RE_Count;
pcnt_counter_clear(PCNT_UNIT_0);
if(f_rev==1) count=-count;
if(count!=0){
f_dchange=1;
f_fchange=1;
frq+= count * freq_step;
if(frq>fmax) frq=fmax;
if(frq<fmin) frq=fmin;
}
//-------------------------------------
if(f_fchange==1){
f_fchange=0;
// Output Lo freq
//set_freq( frq + offset_frq );
p_frq = HET_FREQ-frq + offset_frq + awase ;
set_freq( HET_FREQ - frq + offset_frq + awase); //change to ts820vfo
o_frq = frq - HET_FREQ + 5500000; //エンコーダー変化分
set_car_freq((car_frq + awase ), f_carON, 0);
}
//-------------------------------------
if(f_cchange==1){
f_cchange=0;
// Output Car freq
//set_car_freq(car_frq, f_carON, 0);
set_car_freq((car_frq + awase ), f_carON, 0);
}
if(f_redraw==1){
Transfer_Image();
f_redraw=0;
}
delay(1);
}
}
Alternative Loop (core0)
------------------------------------------------------------------------------------------------*/
void task0(void* arg)
{
while (1)
{
pcnt_get_counter_value(PCNT_UNIT_0, &RE_Count);
int count=RE_Count;
pcnt_counter_clear(PCNT_UNIT_0);
if(f_rev==1) count=-count;
if(count!=0){
f_dchange=1;
f_fchange=1;
frq+= count * freq_step;
if(frq>fmax) frq=fmax;
if(frq<fmin) frq=fmin;
}
//-------------------------------------
if(f_fchange==1){
f_fchange=0;
// Output Lo freq
//set_freq( frq + offset_frq );
p_frq = HET_FREQ-frq + offset_frq + awase ;
set_freq( HET_FREQ - frq + offset_frq + awase); //change to ts820vfo
o_frq = frq - HET_FREQ + 5500000; //エンコーダー変化分
set_car_freq((car_frq + awase ), f_carON, 0);
}
//-------------------------------------
if(f_cchange==1){
f_cchange=0;
// Output Car freq
//set_car_freq(car_frq, f_carON, 0);
set_car_freq((car_frq + awase ), f_carON, 0);
}
if(f_redraw==1){
Transfer_Image();
f_redraw=0;
}
delay(1);
}
}
今日秋月通販へ注文したブレッドボード用のワイヤーや、他パーツが届きました。この為配線待ち部分も配線できてコーディングへ移れました。
仕様変更となった11ポートの設定バンド検出のコーディングは終わりました。もう少し色々と動かして確認をしてみたいと思います。パルスとタイマーのタイミングも確認したいと思います。
つづく?
続きを読む
TS820-DDS-VFOその6
(2022/2/28 3:56:31)
今日はTS820の本体に付けるTFTカラー液晶の位置合わせをすることにしました。丁度いい具合に、フロントパネルを入れ替えた時の余分なフロントパネルがありますので、これで現物と同じようにTFTカラー液晶の貼り付け位置を確認する事が出来ます。
TS820Vの交換した元のフロントパネルをTFTカラー液晶の位置合わせで使います。
実験ボードからパラレルで液晶を表示させることが出来たので少し長い配線を使いパネルでの位置合わせです。前の外部VFO用時のTFTカラー液晶を取り外して使いました。
本体のフロントパネルは外部VFOのフロントパネルとは構造が異なる為、現物での確認が必要です。
特に取り付け位置での問題はなさそうです。外部DDS-VFOに組んだ時と同じように貼り付けできそうです。やはりTFTカラー液晶の下のデジタルサブダイヤル表示の周は目隠しが必要そうです。Hi
!
フロントパネルへのTFTカラー液晶の取り付けも特に問題がなさそうなので、TS820本体へのロータリーエンコーダの取り付け位置合わせも確認することにしました。
外部DDS-VFOをバラして使うことにしました。全く同じ物で使えるか、TS820本体のVFOをはずし、代わりにロータリーエンコーダを取り付けてダイヤル位置の確認です。取り付けのシャーシも全く外部VFOも本体も同じ物を使っていました。すんなりと取り付け出来ました。特に取り付けには問題はないようです。
本体の外部VFOをはずし、ロータリーエンコーダを取り付けしたところです。基板3枚を入れるスペースは、十分ありそうです。元のVFOのアルミのシールドケースを使わなければ、基板取り付けスペースは十分あり問題ない感じです。
ロータリーエンコーダ部の取り付け後の上からのスペース確認
前に組み込んだArduinoNanoでの現在のバンドSW検出でのバンドシリアルデータ送出基板があります。
今回はこの基板はESP32DevKitCを使った現在のバンドSW検出基板になります。
ロータリーエンコーダにダイヤルを取り付けた状態のフロント側からの写真
液晶の付いていない本体のフロントパネルから出たロータリーエンコーダシャフトにダイヤルをつけての位置確認
ダイヤルのところの窓にはデジタルのサブダイヤル(最初に位置合わせしたTFTカラー液晶のサブダイヤル部)が表示されます。もとのサブダイヤル表示部にはDDS-VFOのデジタル周波数が表示されます。上には元々のデジタル周波数表示です。周波数表示が2つになります。だたしDDSの周波数はバンドを切り替えてもどこのバンドも同じDDS-VFO周波数なので周波数も同じに表示されます。元々の周波数表示はクリスタルの発振がずれている分、バンド毎に表示は若干のズレが出ていました。これもDDSにした場合、元のLC発振のVFOとどれくらいのズレがあるか、または同じくらいのズレなのかは確認したいと思っています。ズレがバンド毎にわかれば、プログラムでバンド毎にawaseの変数での周波数補正も可能かと思います。
今日はTFTカラー液晶が問題なく取り付けができる事が確認出来ました。また本体へのロータリーエンコーダの取り付けも特に問題ない事も確認できました。順調な進み具合です。
また、基板をCNCで作製する前に実験中のブレッドボードをのせて、表示や動作の確認をしようかとも思っています。
つづく?
TS820-DDS-VFOその7
(2022/2/28 3:53:05)
TS820用本体組込用DDS-VFOのほぼ完了したESP32DevKitC回路とバンドSW検出ボードのブレッドボード実験回路の基板製作です。
回路図をeagle
CADにて作製し、ボードを設計したデータをLINUX(Ubuntu)に設定したCandle切削アプリでCNC切削開始です。
久々のCNC切削で、マシントラブルで切削用の刃を数本折ってしまいました。長い間使ってないとこんなもんです。予備の刃はこのような事を想定して十分に購入準備してあります。Hi!
切削途中の写真です。左下の基板の取り付け穴は、本来パターンで削るのですが設定で切削深さを基板の厚みT=1.7mm
のまま設定しだため、間違えてあけ切削途中で止めたものです。新たに銅板厚みより深くなる値に設定し直して切削し直ししています。(PCB-GCODE設定の虎の巻を見直ししました。)
PC上のCandleのアプリ上の切削データ表示です。削っていくにつれてパス線が消えてゆきます。
基板は6パスでパターンを切削です。切削時間は5時間くらいです。結構かかります。気長に他の事をして完了を待ちます。
切削完了時のボードです。
ボードの銅面のバリ等を磨いた後です。
結構、不要パターンがあるので、削り取ります。その後フラックス塗りです。
部品を基板に取り付けて半田処理後の写真です。ジャンパーワイヤーが多いです。
片面基板なのでしょうがありません。
横よりパチリの写真です。DDS-ICはソケットに挿してます。
ESP32DevKitCのボードの上に載せる、以前のDDSーVFOで使ったLPF基板は
TS820のバンドSW検出ボードもESP32DevKitCボードと同様にCNC切削しました。
なぜかトラブルで4パスで切削が止まってしまいました。修正出来ないかを確認した所、原点が合わせられないトラブルで4パスで終わりパターンは使えそうですが、人力で修正切削が必要そうです。人間を酷使される事態がありました。余分なパターンを全部削り取ったり、剥がしたりしなければなりませんでした。(残りの2パス分の処理+不要ランド削除)
結構、使えるパターンにまで何とか修正出来ました。
部品を取り付け半田付け後のTS820のバンド検出基板です。
赤色と緑色のLEDはタイマーIC出力表示用で後付です。余りパターンを使い取り付けしています。IC類はソケットに挿します。
バンド検出基板のボトムのランド半田付け部です。ワイヤーは後付のLED用です。
TS820のバンドSW検出回路の実験時のブレッドボードです。
この配線が上記の基板になります。基板になるとかなりシンプルです。ただしシンプルにするにはCADでのパターン配線のセンスは必要かと!
各ボードが製作完了し準備出来ましたので基板間をケーブルで繋ぎ動作を確認開始です。
ESP32DevkitCボードの上にローパス基板をのせ2階建にての取り付けです。
各ボードを繋いでの確認時の写真です。ケーブルは1本だけ長いですが、後から本体組込時の取り付けケーブルは別途作製します。
動作実験した所、バンドの29.5MHzだけが検出出来ていません。他バンドは全部検出出来ています。回路は分圧での電圧検出なので、テスターで確認していくと抵抗での分圧電圧が29.5MHzだけ0Vです。こうなると部品の場合は抵抗アレーのショートしか考えられません。バンド検出ボードのパターンを確認する事にしました。裏側の抵抗アレーの半田面の29.5MHz部のパターンを確認し追っていった所、パターンのミスなどでなく、単なる半田ブリッジでした。ランドどうしの間隔が狭い為、半田付け時にブリッジしたようです。修正後、29.5MHzのバンド検出も出来るようになり、解決しました。
ボード状態での動作確認をもう少し行い、その後、TS820本体への接続を行います。本体のバンドSWでの検出確認動作へと進めてゆきたい思います。TFT液晶のフロントパネルへの取り付けも行う予定です。
つづく?
execution time : 0.097 sec