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#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;
今回は関係ありませんが、最後の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
}
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シリアル化検討で、やったことをきちんと記録をとってなかったりとか、(メモ程度はある)まとめてなかったりとか、やり残しがたくさんあります。実機での確認はもう少し先になるかなといったところです。
つづく?