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