jl7gmnのblog

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

2021年01月

Candle for LINUXその52

TS820用のDDS-VFO(VFOsys改)の周波数データをハムログへ送出する新たなシリアル通信も上手く動作していますが、ESP32DevKitCのシリアルRX,TX端子にはRS−232Cからのレベル変換IC(ADM-3202)が新たに追加になっています。これはこのまま組み込むとすると新たに追加基板が必要になります。DIPタイプで外付けのコンデンサも4個あります。基板を作る必要があります。基板を作らずに(または、蛇の目基板で作らず)もう少し簡単に出来る方法があります。以前に秋月電子で、シリアル通信のスケッチを使う時使うだろうと思い、FTDI社製FT234X を使用した超小型USBシリアル変換モジュールを購入してあったのを思い出しました。これを使うと基板が小さいので何処にでも固定(組み込み)出来ると思います。

範囲を選択_188


取扱説明を見ると案外と小型なのですが、十分に過電流保護とか、ノイズ対策もされています。嬉しいことに、対応するデバイスドライバーが各種用意されていて、Windowに限らず、Mac(OSX)やLinuxでも使えるとあります。私もテストで使用するのはメインがLinuxなので本当に助かります。端子も一番使用する4つの端子のTX,RX,GND,+5V(USBバスパワー供給、最大100mA)が用意されていますので、この中のTX,RX.GNDの3本を使う接続で使用出来ます。

これを使う方法だと、直接必要なESP32DevKitCのシリアルポート端子のRX、TXとGNDとの接続は簡単です。マイクロBタイプのUSBコネクタを使いこのモジュールでPCと簡単にシリアル接続ができてしまいます。しかも3.3Vの出力端子のESPとの接続も仕様となっていて問題なく使えます。(5V入力も対応可能とあります。)レベル変換は考えずとも良いところが重宝します。このUSBシリアル変換モジュールを使うと場所もとりません。何処にでもマイクロBタイプのUSBケーブルのモジュール接続側を固定すればPC上のアプリケーションのハムログとの通信が可能になります。まだ、実際に繋いでないのですが、これからテスト予定です。

ESP32DevKitCのボードは本当にPCが一つあるくらいのレベルで使用出来ています。動作スピードがArduinoNANOよりかなり速いので、ありとあらゆるカテゴリーでの使用も対応出来ると思います。実際のDDS−VFO(VFOsys改)のシリアル通信ではSPEED:4800bpsの遅い設定ですが、ESP32のスケッチループルーチン中で繰り返しデータをハムログへ送出しているので、リアルタイムに周波数も変わってくれています。ループルーチンの回転が速いということです。ループ回転を遅くなるようにディレーを入れる方法で、通常の4800bpsと同じ様には出来ますが、今回のDDS−VFO(VFOsys改)のサブダイアル動作とシリーズにスケッチが組まれているので、サブダイアルの動作がぎこちなくなってしまいます。前の実験してた割り込みを使えていれば回避出来る内容ですが、割り込みでのシリアル通信は負荷が重く、リセットがかかる状態なので使えない事がとても残念です。
通常の4800bpsのシリアルデータ送出のインジケータLEDも通常は点滅がはっきりと分かるのですが、今回のスケッチではシリアルデータが送出のインジケータLEDが常時点灯しているように見えています。送出での動作はきちんとしてくれているのですが、この状態でのデータのやり取りについては、問題が起きるかもしれません?しかし、今の所、ハムログからの制御(コントロール)は使いませんので、このままでOKとしてあります。

今回のDDS-VFO(VFOsys改)のようにDDS−VFO からの周波数をハムログへ取り込むシリアル通信が広まってくれると古いトランシーバーなどは運用面で生き返るのでとても良い事だと思っています。古いリグもハムログの周波数取り込みができるようになります。実際の発振はVFOからは一定(5.0〜5.5MHz)ハムログ用で例)7MHzでは(7.5MHz〜7.0MHz)の周波数表示データをシリアルでハムログへKENWOODのシリアルコマンドに追加して送出しています。(その51:前回のシリアル追加スケッチ部参考)今回はKENWOODのシリアルコマンド体系を使っています。
ダイレクトコンバージョンで使うDDS-VFOはもっと簡単でダイレクトに周波数データがありますから、DDS-VFO(VFOsys改)の様に実際の発振出力と周波数は同じです。変換も不要で、ハムログでの周波数取り込みができるということです。

つづく?

Candle for LINUXその51

ここ数日、TS820の外部DDS-VFO(VFOsys改)の周波数データをもう一つシリアル通信を追加してのハムログでの周波数取り込みを検討していました。シリアル通信UART2を追加しました。また、使うコマンドスケッチはYAESUのタイマー式にするか、自動送出のKenwood方式にするかをいろいろと、情報を探ってみたのですが、やはり、TRIOのトランシーバーがYAESUのコマンドでは、少し混乱することもありハムログの設定でもKenwood1,Kenwood2とありしかもFTdx1200~FTdx9000やFT-991ではコマンド体系がKENWOODとほぼ同じなので、KENWOODにチェックを入れますと記載があり、YAESUでもケンウッド化してきています。こういう状況もありTS820はTRIO(Kenwood)ですので、Kenwood方式で行ってみることに決定しました。私のDDS-VFO確認テスト用に用意したTS140S(100W)はシリアル通信のオプションがあり、ある方が作製したTS680用シリアル通信ボードを以前ネットで購入し追加、動作確認済みです。ハムログでの周波数読み取りも問題なく出来ます。都合が良いので、この追加したボードで使われているシリアル通信のコマンド情報を調査することにしました。調べるとインターフェースキットのIF-10Cが該当するようです。また実際に取り込みするハムログの周波数取り込みの設定も一応確認しました。
ハムログの周波数取り込み説明がマニュアル上に下記のように書かれています。
***********************************************
(抜粋)
2 Turbo HAMLOG/Winの設定(その1) 環境設定 => 設定5
(ここの画像は省略しました。)
  • 該当するメーカーのリグのリグと接続にチェックを入れてください。
    FTdx1200~FTdx9000やFT-991ではコマンド体系がKENWOODとほぼ同じなので、KENWOODにチェックを入れます。
  • COMは、使用するシリアルポート(RS-232C)番号です。他で使用していないCOMポート番号を選んでください。
    パソコンのCOMポート番号は、マイコンピュータのデバイスマネージャで確認することができます。
  • ボーレートは、リグ/PC間の通信速度です。
    ケンウッドでは TS-2000, TS-870, TS-570では9600bpsストップビット1、それ以外は4800bpsストップビット2が初期値になっているようです。
    ヤエスでは FT-9000, FT-2000, FT-920, FT-1000(1021), FT-1000MPや FT-857など、4800bpsストップビット2が初期値のようです。
    JST-245, JST-145では4800bpsストップビット1です。詳しくは、リグのマニュアルを参照してください。
以上、設定が完了したら、Turbo HAMLOG/Winを再起動してください。

(他省略)

5 ケンウッド機での注意事項
Turbo HAMLOG/Winの起動時、及び入力ウインドウバッファクリア時に、 AI1;コマンドを送信して連続してリグから情報が送られるように設定しています。
このとき、VFO-A,Bどちらを使用しているかの情報も取得してますので、リグがVFOではなくメモリーチャンネルを使用している場合は、周波数の設定はできません。
リグ接続設定拡張機能にチェックを入れておくと、 AI2;コマンドを送信します。これは、TS-2000等、最近のリグで有効です。
VFOの切り替えはTX; RX;コマンドを使っていますので、比較的新しいリグでなければVFO切替は機能しません。
***********************************************
Kenowood機では状態が変化した時に自動でデータが送出されるようになっている様です。

上記より、TS140S(TS680S)でのシリアル通信のボーレートは4800bps、ストップビットは2が初期値
(変えても良い)になるようです。今回のTS820では、DDS-VFO(VFOsys)から得られる情報としては周波数のみです。実際に周波数帯でLSB,USBがありますが、ハムログではSSBの表示なので、通常のTS820の交信はSSBのみです。TS820もSSBで使用を前提としていますので、問題はありません。CWとする場合は、シリアル情報を本体から送るハードの追加をし、シリアルデータもDDS-VFOに送らないといけません。

次は、実際のコマンドの仕様確認です。
TS140(TS680)のシリアル通信用のコマンドでの動作を、LINUXのアプリのSerialPortTerminalで確認してみました。ロジックアナライザーの設定都合で、ストップビットは1にしています。
上手く通信出来ない時は、?が返ってきています。
範囲を選択_184
”FA;” はVFO-Aの周波数をリクエストすると、FA00005380280 と応答コマンドが返って来ました。VFO-Bの場合は”FB;” のコマンドのようです。最初のは7MHz時(7.120MHz)の周波数応答データです。

他、応答のあるコマンドは ”IF;" 、”ID"、”AI*;" があるようです。ハムログ設定では最後の”AI1;"を設定してるとあります。

何をするコマンドかの概要です。

”IF;”コマンド: セットの状態を読み出す機能とあります。パラメータがたくさんあり、とても使えるコマンドです。 パラメータはP1からP15まであります。周波数はP1となっています。

”ID;”コマンド:パソコンがどのトランシーバーに接続されているかを認識するためのMODELナンバーを読み取るとあります。TS140(TS680)は MODELナンバーで”006”が読み取りデータとなるようです。

”AI1";IFコマンドのいずれかが変わった場合、自動的にIFコマンドをセットから送り出す機能をON/OFF する 1でON のようです。
”FA;”と”FB;”は既に説明済みの通りです。

上記のコマンド”AI1;”がハムログで設定されるので、使うのは自ずと、”IF;”コマンドになります。
実際にスケッチで組むのですが、その前にESP32DivKitCがわの追加シリアル通信端子は直接RS-232Cケーブルにはつなげませんので、レベル変換用のICを使いレベルを合わせる必要があります。
いつものADM3202です。

範囲を選択_185

このレベル変換がないと、文字化けします。

スケッチは単純にロータリーエンコーダーの変化後の周波数をパラメータに取り込み、追加したUART2の端子からハムログに上記のRS232Cインターフェースを通し繋いでハムログに想定した応答コマンドを送る事で周波数の取り込みが行われます。

以下の青字部がハムログ用に周波数データを送出する追加スケッチ部です。
先の実験でのSerial2の設定をそのまま使います。

追加シリアルのRX、TXポート割当です。(ロータリーエンコーダーと入れ替えています)

#define RXD2 16 //UART2 RX PIN No.
#define TXD2 17 //UART2 TX PIN No.

void setup(){
〜省略
Serial2.begin(4800,SERIAL_8N1,RXD2,TXD2);
〜省略

void loop(){
〜省略
//************************ Send Freq & Mode to HAMLOG *****************************
// 2021.jan.5
//*********************************************************************************
//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);


       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);  
〜省略

最初はダイレクトにアスキーデータを送出して確認していました。最初の部分です。ハムログの周波数欄に上手く表示された時は、とても感激しました。
変換はString変数を使うことで、かなり楽に対応出来ました。周波数のけた合わせさえ間違えなければ問題ありません。

これで、TS820Sはシリアル通信でのハムログ周波数読み取り対応にすることが出来ました。DDS-VFOであれば、ハムログ周波数読み取りは簡単に対応出来ます。しかしながら、今回の対応は、ほんの一部です。ハムログからの制御のコントロールコマンドには対応していません。ハムログから送られる、リグの周波数設定、VFOの切り替え、PTTのオンオフ、などに関してのデコード部は全くまだ、ビルトインしていません。とにかく今までなかったシリアル通信追加でのハムログでの周波数の読み取りが出来たのは、先ずは一歩、大きな前進です。私の無線の運用形態用では、QSO時の手打ちでの周波数入力がないだけでも十分すぎる位便利です。コールサインの手入力はしょうがありませんが!

デコード部についての検討は当面ないとおもいますが、3エリアのOMさんJH3BTK局がKN-Q7Aでのシリアル通信の良いサンプルを公開してくれていますので、大変参考になっています。気が向けばトライするかもしれません。
その前に、ポート変更やら、新たにRS-232cレベル変換回路追加、並びにハムログ用のシリアル出力ポート端子も追加必要です。現状の出来上がったDDS-VFOの基板に対応させる改造をする必要があります。実験ボードだけで終わりなら良かったのですが!!

つづく?

Candle for LINUXその50

ふと、現状のTS820の外部DDS-VFO(VFOsys改)のシリアル通信を複数使い、現状の周波数情報とは別の割り込みを追加し別のシリアル通信を行って見ることにしました。現状も割り込み処理はオリジナルのVFOsysでも周波数の設定で使用していますが、別途新たに割り込み処理を追加することをから確認してみました。

オリジナルの周波数設定の割り込みです。

/*--------------------------------------------------------------------------
        Timer ISR
---------------------------------------------------------------------------*/
hw_timer_t * timer = NULL;
void IRAM_ATTR onTimer(){}

//-----------------------------------------------------------------------
void setup(){
〜省略
//--------- create tasks on core0 --------------------------------
    xTaskCreatePinnedToCore(task0, "Task0", 4096, NULL, 1, NULL, 0);
 //--------- 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
〜省略


/*-----------------------------------------------------------------------------------------------
        Alternative Loop (core0)
------------------------------------------------------------------------------------------------*/
void task0(void* arg)
{
〜task0スケッチ(省略)

上記以外でのあらたな割り込み追加です。割り込みでは2秒間隔でLEDをブリンクさせます。

//for warikomi led blink
timer = timerBegin(0,80,true);
timerAttachInterrupt(timer,&LED_Blink,true);
timerAlarmWrite(timer,2000000,true);
timerAlarmEnable(timer);

//------------------------------------------------------------------------
void IRAM_ATTR LED_Blink(){
   digitalWrite(ICHI_POSI1,!digitalRead(ICHI_POSI1));
//------------------------------------------------------------------------

LED_Blinkルーチンの割り込み実行時の動画です。
ロータリーエンコーダーは回していませんが周波数の変更は通常通り出来ます。


LEDの点滅のルーチンが出来たので、やりたい事の一つのシリアル通信スケッチを追加
してみました。
//------------------------------------------------------------------------
void IRAM_ATTR LED_Blink(){
   digitalWrite(ICHI_POSI1,!digitalRead(ICHI_POSI1));
 Serial2.write(frq);
//------------------------------------------------------------------------

コンパイルも問題なく通ります。TFT液晶にもサブダイヤル、周波数と問題なく表示されロータリーエンコーダーも問題ありません。ところが、ある時間(1分くらい)経過すると次のようにリブートされて、再起動してしまう状態がシリアルモニターで確認出来ました。

範囲を選択_177

なぜ Guru Meditation Error:Core 1 panic'ed(Cache disabled but cached memory region accessed)
が起きるのかをひとまずWebで確認です。

範囲を選択_184
範囲を選択_181
範囲を選択_182
範囲を選択_185
関係してそうな原因その1、その2などの対策やってみましたが、リブートは相変わらず起きてしまいます。
どうも、割り込みルーチンでのシリアル通信など負荷が大きいスケッチではリブートしてしまうことのようです。LED点滅は負荷が軽いので、問題ないということです。なお、UART2のシリアル通信は本体のルーチン内での使用が、常道のようでした。本当であれば割り込みで使いたかったのですが、負荷が大きい為、リブートしてしまうので、先の話ですが、常道の本体側で使用します。このUART2を使いハムログの周波数読み取り用のシリアルポートで使用したいという事です。TS820からハムログへの周波数データー送出のシリアル通信処理を付けたいという思いです。目標でもあります。Hi
ちなみにUART2のシリアルポートは、ロータリーエンコーダーを他の4,19ピンに変更し16,17をUART2様にしました。RXが16ピンで、TXが17ピンです。作製済みのパターンは変更が必要です。
ハムログ用のデータでの送出対応はまだしてませんが、適当に周波数を送るコードをいれて、リブートしないことを確認はしてあります。

#define PULSE_INPUT_PIN 4 // Rotaty Encoder A
#define PULSE_CTRL_PIN 19  // Rotaty Encoder B


//#define PULSE_INPUT_PIN 16 // Rotaty Encoder A
//#define PULSE_CTRL_PIN 17  // Rotaty Encoder B

#define RXD2 16
#define TXD2 17

void setup(){
     Serial.begin(115200); //add 2020.oct.18
    
     Serial2.begin(115200,SERIAL_8N1,RXD2,TXD2);
〜省略


void loop(){
〜省略
  Serial2.println(frq);
  //Display Dial
        Dial(frq);            //long frq=init_freq ;#define init_freq 7******
  //-------- 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); 
〜省略

本当は、レジュームの機能をさせる為のEEPROMのまとめをするつもりでしたが、ふと割り込みの確認をしてしまいました。実際のEEPROMのスケッチは、かなり変更が入りましたので、まとめがまだ出来ていません。(周波数情報用のコード変更、つまり仕様変更が出てしまいました。)
今回のUART2を追加した分のESP32DevKitCのスケッチファイル名はサフィックスに-aを付けて変更しました。(いつでも、前のスケッチが使用出来るようにしておく為です。)
今回のスケッチファイル名:    (VFOsys-SERIAL-a.ino)
それ以前のスケッチファイル名:(VFOsys-SERIAL.ino) 

つづく?

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

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