だいぶ間があきましたが、その間に結構なボリュウムトライをしておりました。
まず、TS820用の外部DDS-VFO(VFOsys改)の状況ですが、結構NEWトライで回り道していました。
その内容は、現状のESP32DevKitCの空きポートのチェックと使用可不可の確認です。回路図を見てもさほどいっぱいポートを使っているわけではありません。がです。意外と落とし穴がありました。落とし穴はかなりおおげさですが、ポートとしてGPIO **と記載ありますが、実際に使用可能なデジタル入出力ポートは使えないポートがあり、これを外すと案外使用出来るポートは少なくなります。
まず、システム上で使用されるGPIO は全く使用出来ません。使えないポートを下記します。
★内部SPIフラッシュメモリに接続されているので使用できないポート
GPIO11
GPIO10
GPIO9
GPIO8
GPIO7
GPIO6
なぜ、使えるデジタル入出力ポートを確認し始めたかと言うと、今は外部DDS-VFO(VFOsys改)側ですが、TS820 本体側につける外部インターフェース用の出力ポートを割り当てる為でもあります。少しでもアナログ機をデジタルに近づけたい思いの一端からです。
現在外部DDS-VFO(VFOsys改)ESP32DevKitCで使われているのは、TFT液晶、SI5315A、ロータリーエンコーダー、それと電源、GND、アナログ入力ポートを除くと、下記デジタル入出力ポートとして10箇所使用出来るようです。
仮に次のように割当をしてあります。
GPIO32:INPUT0 2^0のBCD入力(TS820本体用DDSのバンド入力)(外部DDS-VFO用INPUT/OUTPUT)
GPIO33:INPUT1 2^1のBCD入力(TS820本体用DDSのバンド入力)(外部DDS-VFO用INPUT/OUTPUT)
GPIO25:INPUT2 2^2のBCD入力(TS820本体用DDSのバンド入力)(外部DDS-VFO用INPUT/OUTPUT)
GPIO26:INPUT3 2^3のBCD入力(TS820本体用DDSのバンド入力)(外部DDS-VFO用INPUT/OUTPUT)
GPIO27:OUTPUT 2^3のBCD出力(今の外部DDS-VFO用の外部インターフェース用)
GPIO14:OUTPUT 2^3のBCD出力(今の外部DDS-VFO用の外部インターフェース用)
GPIO12:OUTPUT 2^3のBCD出力(今の外部DDS-VFO用の外部インターフェース用)
GPIO13:OUTPUT 2^3のBCD出力(今の外部DDS-VFO用の外部インターフェース用)
GPIO0:INPUT/OUTPUT (未) 仮に出力ポート設定 (使えるかの確認)GPIO4:INPUT/OUTPUT (未) 仮に出力ポート設定(使えるかの確認)
GPIO32,33,25,26はTS820に組み込む場合用での予定です。外部DDS-VFO(VFOsys改)用では、何かに使っても良いポートにはなります。(今は予定なし)今は、GPIO27,14,12,13の4つの出力ポートとして設定します。しかし、この設定は何を意味するかと言うと、TS820用の外部VFOに組み込みするESP32DevKitC基板ですから外部のコントロールインターフェースはこの外部DDS-VFO(VFOsys改)から接続される事になります。少し小さな外部VFOから新たな4端子出力で外部回路を制御をします。TS-820本体に組み込む場合で使えるのでやっておいて損はないです。VFO側で外部回路を制御するのは気が引けますが機能として追加しておきます。
実際にバンドSWを切り替えた時に合わせてシリアルデータを受信しそれをトリガーにしてスケッチを行いました。
下記はJA2GQP OM の公開のDDS スケッチのsi5351_oled128x64.zip 上からの変数名を参考に取り入れさせていただきました。私の場合は 11バンドまでになります!
byte Byt_Band = 3;//original 3band 7 18 21
void loop()の中での周波数設定long 変数の frq からBCD出力ポートへ振り分けする為の、Byt_Bandを割り当てるスケッチです。バンドSWに合わせた周波数以外はありませんから、周波数範囲で割り当てます。また、ここに出ているHET_FREQの設定がありますが、これは現在検討中なのですが、EEPROMを使って、外部VFO側の電源を切ってから、再度電源を入れた時に前のバンド情報、同じ周波数で起動させる為のルーチンのスケッチ追加です。
出力させるためのトリガーとなるByt_Bandは、1.9MHzから29.5MHzまでなので、1から11の値を取ります。
void loop() { // (core1)
〜(省略)
下記は現在検討中の箇所
setup(){ルーチンでEEPROMに書き込んだデータを読み込みするスケッチの追加
frq = atol(buf.mfreq);//Add 2020dec26 frquency setting with use EEPROM data
f_dchange=1; //Add 2020dec26
f_fchange=1; //Add 2020dec26
f_dchange=1; //Add 2020dec26
f_fchange=1; //Add 2020dec26
〜(省略)
下記がバンドSWに合わせたByt_Bandの割当です。
if((frq >= 1500000) and (frq <=1999999)){
HET_FREQ = HET_FREQ01;
Byt_Band = 1;
}
if((frq >= 3500000) and (frq <=3999999)){
HET_FREQ = HET_FREQ02;
Byt_Band = 2;
}
if((frq >= 7000000) and (frq <=7499999)){
HET_FREQ = HET_FREQ03;
Byt_Band = 3;
}
if((frq >= 14000000) and (frq <=14499999)){
HET_FREQ = HET_FREQ04;
Byt_Band = 4;
}
if((frq >= 15000000) and (frq <=15499999)){
HET_FREQ = HET_FREQ05;
Byt_Band = 5;
}
if((frq >= 18000000) and (frq <=18499999)){
HET_FREQ = HET_FREQ06;
Byt_Band = 6;
}
if((frq >= 21000000) and (frq <=21499999)){
HET_FREQ = HET_FREQ07;
Byt_Band = 7;
}
if((frq >= 28000000) and (frq <=28499999)){
HET_FREQ = HET_FREQ08;
Byt_Band = 8;
}
if((frq >= 28500000) and (frq <=28999999)){
HET_FREQ = HET_FREQ09;
Byt_Band = 9;
}
if((frq >= 29000000) and (frq <=29499999)){
HET_FREQ = HET_FREQ10;
Byt_Band = 10;
}
if((frq >= 29500000) and (frq <=29999999)){
HET_FREQ = HET_FREQ11;
Byt_Band = 11;
}
HET_FREQ = HET_FREQ01;
Byt_Band = 1;
}
if((frq >= 3500000) and (frq <=3999999)){
HET_FREQ = HET_FREQ02;
Byt_Band = 2;
}
if((frq >= 7000000) and (frq <=7499999)){
HET_FREQ = HET_FREQ03;
Byt_Band = 3;
}
if((frq >= 14000000) and (frq <=14499999)){
HET_FREQ = HET_FREQ04;
Byt_Band = 4;
}
if((frq >= 15000000) and (frq <=15499999)){
HET_FREQ = HET_FREQ05;
Byt_Band = 5;
}
if((frq >= 18000000) and (frq <=18499999)){
HET_FREQ = HET_FREQ06;
Byt_Band = 6;
}
if((frq >= 21000000) and (frq <=21499999)){
HET_FREQ = HET_FREQ07;
Byt_Band = 7;
}
if((frq >= 28000000) and (frq <=28499999)){
HET_FREQ = HET_FREQ08;
Byt_Band = 8;
}
if((frq >= 28500000) and (frq <=28999999)){
HET_FREQ = HET_FREQ09;
Byt_Band = 9;
}
if((frq >= 29000000) and (frq <=29499999)){
HET_FREQ = HET_FREQ10;
Byt_Band = 10;
}
if((frq >= 29500000) and (frq <=29999999)){
HET_FREQ = HET_FREQ11;
Byt_Band = 11;
}
このスケッチで設定のByt_Bandで設定したポート27、14、12、13にてBCD出力されます。
loopルーチンの一番最後の処理としてスケッチ追加です。
if(Byt_Band == 1){
digitalWrite(13,HIGH);
digitalWrite(12,LOW);
digitalWrite(14,LOW);
digitalWrite(27,LOW);
}
else if(Byt_Band == 2){
digitalWrite(13,LOW);
digitalWrite(12,HIGH);
digitalWrite(14,LOW);
digitalWrite(27,LOW);
}
else if(Byt_Band == 3){
digitalWrite(13,HIGH);
digitalWrite(12,HIGH);
digitalWrite(14,LOW);
digitalWrite(27,LOW);
}
else if(Byt_Band == 4){
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(14,HIGH);
digitalWrite(27,LOW);
}
else if(Byt_Band == 5){
digitalWrite(13,HIGH);
digitalWrite(12,LOW);
digitalWrite(14,HIGH);
digitalWrite(27,LOW);
}
else if(Byt_Band == 6){
digitalWrite(13,LOW);
digitalWrite(12,HIGH);
digitalWrite(14,HIGH);
digitalWrite(27,LOW);
}
else if(Byt_Band == 7){
digitalWrite(13,HIGH);
digitalWrite(12,HIGH);
digitalWrite(14,HIGH);
digitalWrite(27,LOW);
}
else if(Byt_Band == 8){
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(14,LOW);
digitalWrite(27,HIGH);
}
else if(Byt_Band == 9){
digitalWrite(13,HIGH);
digitalWrite(12,LOW);
digitalWrite(14,LOW);
digitalWrite(27,HIGH);
}
else if(Byt_Band == 10){
digitalWrite(13,LOW);
digitalWrite(12,HIGH);
digitalWrite(14,LOW);
digitalWrite(27,HIGH);
}
else if(Byt_Band == 11){
digitalWrite(13,HIGH);
digitalWrite(12,HIGH);
digitalWrite(14,LOW);
digitalWrite(27,HIGH);
}
else if(Byt_Band == 99){
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(14,LOW);
digitalWrite(27,LOW);
}
digitalWrite(13,HIGH);
digitalWrite(12,LOW);
digitalWrite(14,LOW);
digitalWrite(27,LOW);
}
else if(Byt_Band == 2){
digitalWrite(13,LOW);
digitalWrite(12,HIGH);
digitalWrite(14,LOW);
digitalWrite(27,LOW);
}
else if(Byt_Band == 3){
digitalWrite(13,HIGH);
digitalWrite(12,HIGH);
digitalWrite(14,LOW);
digitalWrite(27,LOW);
}
else if(Byt_Band == 4){
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(14,HIGH);
digitalWrite(27,LOW);
}
else if(Byt_Band == 5){
digitalWrite(13,HIGH);
digitalWrite(12,LOW);
digitalWrite(14,HIGH);
digitalWrite(27,LOW);
}
else if(Byt_Band == 6){
digitalWrite(13,LOW);
digitalWrite(12,HIGH);
digitalWrite(14,HIGH);
digitalWrite(27,LOW);
}
else if(Byt_Band == 7){
digitalWrite(13,HIGH);
digitalWrite(12,HIGH);
digitalWrite(14,HIGH);
digitalWrite(27,LOW);
}
else if(Byt_Band == 8){
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(14,LOW);
digitalWrite(27,HIGH);
}
else if(Byt_Band == 9){
digitalWrite(13,HIGH);
digitalWrite(12,LOW);
digitalWrite(14,LOW);
digitalWrite(27,HIGH);
}
else if(Byt_Band == 10){
digitalWrite(13,LOW);
digitalWrite(12,HIGH);
digitalWrite(14,LOW);
digitalWrite(27,HIGH);
}
else if(Byt_Band == 11){
digitalWrite(13,HIGH);
digitalWrite(12,HIGH);
digitalWrite(14,LOW);
digitalWrite(27,HIGH);
}
else if(Byt_Band == 99){
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(14,LOW);
digitalWrite(27,LOW);
}
本体側を想定し作製したバンドのロータリースィッチを回しての実際の動作です。
右側のグリーンLED4つ(2^0, 2^1, 2^2, 2^3)がBCD出力ポート表示用です。1.9MHzから29.5MHzまでなのでBCDに対応するのは10進数では、1,2,3,4,5,6,7,8,9,10,11になります。0,12,13,14,15は独断で勝手に決めたバンドSW仕様以外なので割当ありません(ないので使いません。)
今ひとつ画像でTFT液晶が見えないので、TFT液晶だけ取り直しました。バンドSWの順は最後は適当です。各バンドでのVFOの発振周波数はすべて5.380MHz になるようにしています。EEPROMの検討のためです。同じ周波数発振になるようにしたのは、各バンドともEEPROM読み出しでちゃんと発振しているかを確認する為です。特に書き込み周波数を少しずらして書き込みすると別のビート音になるので囲み周波数の確認が出来ます。それ以前にもSSBでビートを聞いてDDSが目的の周波数で発振しているかの確認になります。ゼロビート(ドンピシャ)ではSメータを見ないとわかりません!
実験ボードの状態です。BCD出力ポートの確認LED側です。
ロータリーエンコーダー、及びTFT液晶側です。
これらの実験ではシリアルポートのRX,TXを使っていますので、コンパイル後の本体書き込み時はこのRX,TXポートを接続から外さないと書き込みエラーになります。そのため、コンパイル時にTX,RXポートをSWで切り離す部分を作りました。単純にプッシュSWで切り替えするようにしました。コンパイル時、少し楽になります。シリアル通信を使ったスケッチでは必要です。Hi!
SW ONで接続、SW OFFでオープンです。
今検討しているのはEEPROMでの周波数のレジューム機能です。ArduinoNANOとESP32DivKitCでのEEPROMの設定は少し違いがありました。やはり基本の通りにスケッチすると上手くゆきました。なんだかんだありましたが、最終的な段階まで来たのではないかと思っています。本当?
これ以上は仕様上スケッチでできるのはここまでかな?というところです。詳しくは次回以降に!
つづく?
EEPROMに関する型変換の手法です。EEPROMのスケッチコーディングで使用しています。
周波数設定の frq はlong変数です。EEPROMに書き込みする際の周波数はchar変数で書き込みしています。このため変数の変換が必要です。
構造体での実際の設定
struct CONFIG{ //70bytechar minit[3];//"73"
char mband[3];//"03"
char mfreq[32];//"7120000"
char mstep[32];//"0.8"
};
CONFIG buf;
EEPROMの書き込みデータを読み込んで使用する場合char型からlong 変数への変換が必要です。これには atol を使います。
frq = atol(buf.mfreq);//Add 2020dec26
逆に frqをEEPROMに書き込みする型にするには、longからcharへの変換を行います。
これには sprintfを使います。
char cc[32];
sprintf(cc,"%8d",frq);
sprintf(cc,"%8d",frq);
忘備録です。