jl7gmnのblog

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

2021年01月

Candle for LINUXその62

TS820用の外部DDS−VFO(VFOsys改)の本体のCore0のスケッチでの周波数設定ロータリーエンコーダーの回転にかわわらずにCore1でハムログへの周波数データを連続送出している現状ですが、やはり周波数シリアルデータが連続送出しているというのは、いくら周波数の変化が問題なくなったとはいえ、前の垂れ流しでのPC側に対してのマウスなどへの影響を及ぼしていたので、今後、何が起きるかかわかりません。ということで、Dual Core動作のCore1も、ロータリーエンコーダーが回転している状態のときにのみ周波数シリアルデータを送出することを検討し始めました。Core0でのロータリーエンコーダーのステップから周波数を決めるtask0(void* arg)ルーチン内の処理の一部を利用して試してみたいと思います。
利用するのは、仕様にあった f_dchange=1, f_fchange=1 を条件として使います。
また、ローカル変数であるcount をCore1でも認識できるグローバル変数に変更します。
task0では青色文字が変更箇所になります。
スケッチの先頭部の変数宣言と同様に count を変数宣言しグローバルで使用出来るようにします。
int count;



void task0(void* arg)
{
    while (1)
     {  
         pcnt_get_counter_value(PCNT_UNIT_0, &RE_Count);     
      // int count=RE_Count;
         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; //variable;count,freq_step=0.8,then frq=frq+(count*0.8)
         
            if(frq>fmax) frq=fmax;
            if(frq<fmin) frq=fmin;
          }

          if(f_fchange==1){
             f_fchange=0;
             set_freq(( HET_FREQ - frq + awase ) + offset_frq );   //change to ts820vfo
          }

         if(f_cchange==1){
            f_cchange=0;  //if Car frequency and/or "f_carON" changed, set this flag to 1
            set_car_freq((car_frq + awase ), f_carON, 0);                                     
         }

         if(f_redraw==1){
            Transfer_Image();
            f_redraw=0;
         }
         delay(1);
     }
}
  
Core0のtask0ルーチンは1箇所count変数部のスケッチのみ変更です。
次は、Core1側です。
ロータリーエンコーダーが回転した時が最初の条件になります。
Core1のtask1ルーチンではロータリーエンコーダーの回転時の条件でcountを使います。コントロールフラグ類(f_dchange,f_fchangeが1の時)を使いSerial2.print(sss);で周波数を送出するようにスケッチを追加しました。
これで、ロータリーエンコーダーが動いている状態のときのみ周波数シリアルデータが送出される様になります。
------------------------------------------------------------------------------------------------------------------------------
void task1 (void* arg) {
  while (1) {
  //************************ 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;
 // String sss;//Send Serial ASCII data to HAMLOG
  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(1);
           if(frq>fmax) frq=fmax;
           if(frq<fmin) frq=fmin;
       }

   }
}
------------------------------------------------------------------------------------------------------------------------------
上記の変更で以前のCore0でロータリーエンコーダーを回転させた時のみ周波数シリアルデータを送出していたのと、全く同じ様にCore1もロータリーエンコーダー回転時のみ周波数シリアルデータを送出するようになります。Core0の時との動作上の大きな違いは、途切れのないなめらかな周波数の変化であるということです。キャリアを聞いている時、いくら速くロータリーエンコーダーを回転させても、音階のような飛び飛びの音になりません。Dual Coreでのスケッチで既に周波数は、なめらかに変化している上に、ロータリーエンコーダーが回転している時のみの周波数シリアルデータ送出です。速い回転でも不自然さは全くありません。これが目的としてい結果でとても満足しています。Hi!

コンパイルして、ESP32DevKitCボードに書き込み、前のESP32DevKitCと交換して、Windows10で試し運用もしてみました。周波数の変化がとてもスムーズでアナログVFOと同じ感じで動作してくれました。一番の目的のハムログでの動作も、ロータリーエンコーダを回転させたときのみの周波数シリアルデータ送出でも問題なくFrq欄に取り込んでくれています。
実践テストをかねて3局程QSOをしてみましたが、動作は全く問題ありませんでした。
今のDDS−VFO(VFOsys改)は現状での仕様で小さな問題点もありません。一番安定している状態になりました。
当面実際のQSOでTS820のDDS−VFO(VFOsys改)で楽しみたいと思います。
まだまだ、機能追加については、たくさん頭の中にあります。これから、また追加できるかを実験しながら検討してゆきたいと思っています。

つづく?
続きを読む

Candle for LINUXその61

TS820の外部DDS-VFO(VFOsys改)は色々と仕様を変えながらも上手く動作しているかのようだが、実は、がある。ロータリーエンコーダーを回した時にのみ周波数のシリアルデータを送出する仕様になったのですが、追加した周波数をシリアル送出するルーチンが少し重いので、ロータリーエンコーダーを大きく回した時は周波数は飛び飛びで送出されるため、キャリアを聞いていると音階のように途切れて聞こえてしまう現象があるのです。ロータリーエンコーダーをゆっくり回す時は問題なくなめらかに周波数も変化しています。キャリアを聞いた場合はスムースに綺麗に切れ間なしで聞こえます。ノイマン的な追加処理となったためでもあります。雄一、ロータリーエンコーダーを回した時にシリアルデータが送出されるということが他のトラブルを回避出来ていたのは、良かったのですが、通常のロータリーエンコーダーの回転でも音階のように聞こえ少し周波数の滑らかさがなくなった感じです。これをもう一度原点に帰り、対策出来ないものかと思っていました。色々と調べている内にFreeRTOSの使い方の中で、特にESP32DevKitCのDual Core搭載という仕様が備わっていることに気が付きました。ノイマン的な動作でなく、並列処理出来るというこのDual Coreについてサンプル練習してみました。前の割り込み処理のようにLEDの点灯など、負荷の軽いものでは動作OKで、シリアル通信処理のような負荷の重いものはリブートされてしまい上手く行かない様な事が無いことを祈ります。サンプルは下記です。とてもシンプルでDualCoreの使い方のサンプルとしては、非常にわかりやすいと思いました。
要は、設定の仕方がわかれば良いということです。
肝心なところは、下記のタスクの設定です。
  xTaskCreatePinnedToCore(task0, "Task0", 4096, NULL, 1, NULL, 0); //Core0優先度1
  xTaskCreatePinnedToCore(task1, "Task1", 4096, NULL, 1, NULL, 1); //Core1優先度1


サンプルスケッチ
-----------------------------------------------------------------------------------------------------
#include "esp32-hal-log.h"
#include "freertos/task.h"

void task0 (void* arg) {
  while (1) {
    log_i("This is Core 0");
    Serial.println("THIS IS IT!");
    delay(1000);
  }
}

void task1 (void* arg) {
  while (1) {
    log_i("This is Core 1");
    delay(1500);
  } 
}

void setup () {
  Serial.begin(115200);
  log_i("Hello, this is ESP32:)");
  xTaskCreatePinnedToCore(task0, "Task0", 4096, NULL, 1, NULL, 0);
  xTaskCreatePinnedToCore(task1, "Task1", 4096, NULL, 1, NULL, 1);
}

void loop () {
  delay(1500);
}
-----------------------------------------------------------------------------------------------------

上記のサンプル構成をもとにTS820の外部DDS−VFO(VFOsys改)でのDual Core化にトライです。
現状は、Core0でロータリーエンコーダーの処理とSi5315Aへの周波数設定を行っています。これはそのまま使います。Core1で今までサブルーチン化していた部分を処理してもらう処理担当です。実際はサンプルの構造をそのまま使うことで、上手くゆきました。ただ、今までCore0で行っていたロータリーエンコーダを回転させた時にシリアルデータ送出する部分はなくなります。(Core0での周波数のシリアル送出は負荷が重いので、外す必要がありますから!)新しくCore1がやる事は、常にロータリーエンコーダー回転時の周波数設定用の変数から読み込みして、周波数シリアルデータをひたすら送出するということです。また、例のカーソルの異常な動きがあるのではと思うのですが、これはありません。ハムログが立ち上がらないとシリアルデータは送出され無いため、前の垂れ流しのシリアルデータ送出の時とは異なります。
ヘッダーは下記を追加しました。
#include <freertos/FreeRTOS.h>

実際のCore0,Core1の設定部です。2段めが追加のCore1です。
  xTaskCreatePinnedToCore(task0, "Task0", 4096, NULL, 1, NULL, 0);
    xTaskCreatePinnedToCore(task1, "Task1", 4096, NULL, 1, NULL, 1);

task0は追加してたFrqToHamlog();を外します。他の周波数帯設定箇所のFrqToHamlog();も外します。勿論サブルーチンのFrqToHamlog()も使わないので /*    */ で外します。

追加のtask1のルーチンは下記になります。//コメントは確認用サンプル例で削除してokです。
ほとんどサブルーチそのものです。違うのはWhile(1)処理が追加なりました。これは必要です。
----------------------------------------------------------------------------------------------------------------------------------------
void task1 (void* arg) {
 while (1) {
   //************************ Send Freq & Mode to HAMLOG *****************************
   // 2021JAN28   Dual Core :Core1 
   //*********************************************************************************    
   //String ss;// blunk       12345      12       1234
   //char cc[]= "IF00007120000     +00001  0001000    ;";//7.120MHz SSB(LSB)
   //char cc[]= "IF00007120000     +00001  0002000    ;";//7.120MHz SSB(USB)
   //char cc[]= "IF00007120000     +00001  0003000    ;";//7.120MHz CW
   //char cc[]= "IF00007120000     +00001  0004000    ;";//7.120MHz FM
   //char cc[]= "IF00007120000     +00001  0005000    ;";//7.120MHz AM
   //char cc[]= "IF00007120000     +00001  0006000    ;";//7.120MHz FSK not biltin
   //char cc[]= "IF00007120000     +00001  0007000    ;";//7.120MHz CW-N
 
   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);
   //char dinfop1[]= "00014120000";//TS820*** frequency sprintf(cc,"%011d",frq);    
   sprintf(cc,"%011d",frq);
   ss1 = cc;  
   //Serial.println(ss1);

   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;
  // String sss;//Send Serial ASCII data to HAMLOG
   sss = ss0+ss1+ss2+ss3+ss4+ss5+ss6+ss7+ss8+ss9+ss10+ss11+ss12+ss13+ss14+ss15+ss16;
      
  // String ab;
  // ab = "IF00007120000     +00001  0001000    ;";//for test7MHz
  // ab = "IF00014120000     +00001  0002000    ;";//for test14Mhz
  // ab = "FA00014120000;";//enable but only frequency VFO-A

   Serial2.print(sss);
 
  }
}

----------------------------------------------------------------------------------------------------------------------------------------
このtask1を入れる箇所より前で、String変数のsss は宣言する必要があります。

String sss;//Send Serial ASCII data to HAMLOG

このDualCore化のコンパイルではリブートも全く起こりません。上手くゆきました。今までキャリアを聞いた時のロータリーエンコーダの回転時の音階のような音はなくなり、とてもななめらかな周波数化になりました。さすがDualCoreの威力は抜群です。ノイマン型から並列処理のDualCoreへの変更でした。ハードウェアは変わらないので、スケッチだけの変更です。やはりソフトウェアは仕様変更などでも大きなウェイトをしめています。
WindowsXP上のHAMLOGでの確認なので、ESP32DevKitCの書き込み変更分をWindows10でも試してみたいと思います。今回のスケッチも新たにファイル名を変更して前のスケッチは残しておきます。前のスケッチも使用上は問題ありませんので!

つづく?



Candle for LINUXその60

Window10でのハムログでのTS820外部DDS−VFO(VFOsys改)からのシリアル送出周波数データの取り込みの様子を動画記録してみました。ロータリーエンコーダーを回転させてる時にシリアルデータが送出される仕様にしてあります。リアルタイムにハムログで周波数取り込みがうまくいっています。


TS820外部DDS−VFO(VFOsys改)の電源を超小型USBシリアル変換モジュール(FT234X)から供給することで上手く動作するようになった福音で、前にスプリット運用は出来ないという判断をしていましたが、これが上手く出来るような方法が見つかりました。PCからのUSBシリアル変換モジュールは常に電源電圧がかかっている状態である為に、TS820外部DDS-VFOにも常に電源が入っている状態です。このためESP32DevKitCを立ち上げる必要がなく、VFOの切り替えも周波数が変わるだけです。電源オン時のイニシャルステップが無いため上手くゆくということです。TS820DDS−VFO(VFOsys改)のバッファー電圧が本体VFO受信時はかからない為出力が出ません。(電源がかからないようにレギュレータを抜き取りました。)送信時はTS820DDS−VFO(VFOsys改)のバッファー電圧が正常にかかり本体のVFOは止まるため上手く動作するという具合です。

つづく?

Candle for LINUXその59

TS820用外部DDS−VFO(VFOsys改)とハムログでの4800Bpsの周波数シリアルデータの読み込みが出来ているので、ついでに、ハムログからのトランシーバーのコントロールコマンドをロジアナで確認してみることにしました。シリアルコマンドはKenwood体系と分っていますので機能追加する時の為に参考に見てみることにしました。今後のコントロール(シリアル受信デコード部)追加する場合には必要です。

ハムログの入力フォームLOG-[A]の周波数Freqを右クリックすると幾つか制御機能があります。
(ハムログのバージョンは5.27にて確認)
①リグの周波数を設定
②リグの周波数再読込
③VFOの切り替え
④PTTのon/off
制御コマンドとしては①、③、④が該当します。

①リグの周波数を設定のシリアルTXデータ
2つのコマンドで対応しています。
範囲を選択_202
                                                  "MD1"                     "FA00007000000;"

最初のコマンドは "MD1;"
次のコマンドとのスペース185msec
次のコマンドは7.0000MHz時 "FA00007000000;"

②リグの周波数再読込のシリアルTXデータ
2つのコマンドで対応しています。
範囲を選択_212
                                          "AI1;"                          "IF;"

最初のコマンドは"AI1;"
次のコマンドとのスペース133msec
次のコマンドは"IF;"

③VFOの切り替えのシリアルTXデータ
範囲を選択_208
         "FT1;FR1;"

スペースなしの連続コマンドで対応
最初のコマンドは"FT1;"
次のコマンドは"FR1;"

④PTTのon/offのシリアルTXデータ
範囲を選択_209
           "RX;"

1コマンド "RX;" で対応

現状のTS820外部DDS−VFO(VFOsys改)でのデコードの対応を想定してみようと思います。
上記のコマンドをESP32DevKitCの4800bpsのRXポートで受けてデコード処理することが第一ステップとなります。ただし、現状の外部DDS-VFO(VFOsys改)では本体からは、送信コントロール線は引いていませんから④はESP32DevKitCの出力ポートをON/OFFする機能だけ付けて、TS820本体から送信制御線を引いて繋げば制御出来ます。動作が実用実現出来るのは、①周波数の設定と④ぐらいです。②のリグの周波数再読込は、現状の外部DDS-VFOの仕様上必要ありません。ロータリーエンコーダ−を回すとハムログが読み込む仕様だからです。③のVFOの切り替えもA,Bのように2つありませんので、対象外です。

①を実現するとなると、周波数を設定する場合に制限がかかります。同じバンド内での周波数のみ、同じモードしか対応出来ない仕様となります。TS−820のバンドSWは手動切り替えですから他のバンドへ周波数を設定してもDDSは設定なりますが本体の切り替えが対応出来ないので同じバンド内という制限がかかります。モードも(LSB、USB、CW、TUEN)同様手動なので対応出来ません。現状のバンドSWやモードSWをデジタル化すれば、各モードでの受信は可能となりますが、バリコンでの受信調整方式なので当然再調整が要ります。また送信部も同様再調整が必須です。無調整の半導体の受信部、RFパワーアンプにすれば調整無しも可能ですが、かなり大掛かりでTS820の良いところ(真空管のドライバ、ファイナル、受信最大感度調整、最大出力調整)がなくなってしまいます。現状の機能を活かしたデジタル化はやはり、改造上限界が見えてきます。(機構方式のバンドSWとモードSWが制限の元です。)

デコード部のスケッチ改良追加(シリアル通信デコード部の練習)はしてみたいです。対応するのは、同じバンド内の周波数設定と送信制御PTTのon/offのコマンドのデコード処理です。バンド内の周波数は問題なくDDS−VFO(VFOsys改)に追加は可能だと思います。PTTコントロールは出力ポートをデコード時にon/offですからこれも追加可能だと思います。ただ実際の追加時を想定してみると、この機能を追加することによって実用性があまり感じられないので試す試さないは、気分次第です。デコード部の練習としてはいいかもしれません。Hi!

つづく?


Candle for LINUXその58

TS820用の外部DDS-VFO(VFOsys改)のハムログでの周波数の取り込みが上手くゆくようになったので、現状のシリアル通信UART1(115200bps)のTXD1,RXD1とハムログ用のシリアル通信UART2(4800bps)のTXD2,RXD2のロジックアナライザーでのチェックをしてみました。

UART1(115200bps)のESP32DivKitCのリセット後のシリアル通信
範囲を選択_201

最初のESP32からのTXデータ
範囲を選択_195
途中省略 最終ESP32のTXデータ
範囲を選択_196
次のTXデータはパルス1個なので、特に解析不要

パルスが終わった後にESP32DevKitC側から本体へバンドSW情報をリクエストするコマンド”99;”
範囲を選択_198
少し拡大するとビットが全部見れます。
範囲を選択_199

上記バンド設定情報リクエストコマンド”99;”を受けてArduinoNANOから送られるバンドSW選択周波数情報
”03 7.1MHz;"
範囲を選択_200

----------------------------------------------------------------------------------------------------------------------
PCのアプリケーションへ送られるバンド情報データ(アプリケーションはハムログ)

UART2(4800bps)のバンドSWを回した時の選択バンドのESP32DevKitCから送出される周波数インフォメーションコマンド(KENWOOD) バンドSWを変えたときも周波数情報を送るように対策済。
1回だけ周波数インフォメーション情報が送られているのが分かります。
IF00007120000     +00001  0001000    ;
範囲を選択_192

ロータリーエンコーダーを回している時に送出される周波数インフォメーションコマンド
00007120000 → 00007120001   周波数データ部が変化しているのが分かります。
範囲を選択_203

ロジックアナライザーチェックでの解析データで、特におかしな所は無い様です。

ロジックアナライザーでのUART1,UART2のシリアルデータの確認でした。

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

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