JR−310の第一局発のDDS ICでの代用の各バンド毎での周波数の合わせ込み用のスケッチを追加しました。awase値で調整します。数ヘルツ程度のズレ補正追い込みが各バンド毎にできるようになります。使うDDS IC毎に発振周波数は若干異なるのでそれぞれでの合わせ込みは必要です。Hi!
現時点での全スケッチになります。もとの仕様上送受信の切り替えSWポートA2がありますが、局発としては受信のみのモードでSW ”L”での送信時ルーチンは使いません。がスケッチはそのままです。特に問題はありません。前の仕様のCH切り替えのA0のSWのルーチンもしかり、スケッチはそのまま残してありますが、使っていません。Sメータの入力A7もそのまま残してあります。A0,A2,A7はSWとしては使いません。発振周波数設定時、メモリ記録し、電源オン時にレジューム機能するEEPROM機能はとても便利なので、そのまま使わさせてもらっています。
オリジナルのスケッチはJA2GQP OMの6m_ch_VFOになります。
私がJR−310用の局発用として修正または追加したスケッチのルーチンは緑色部になります。
シリアルモニタでの周波数設定値確認用のSerial.print文は残してあります。

■テスト中のブレッドボードArduinoNANOとDDS IC Si5351A
JR-310-1st-OSC

//////////////////////////////////////////////////////////////////////
//  si5351a 6m AM VFO program ver.1.0
//    Copyright(C)2019.JA2GQP.All rights reserved.
//
//                                                2019/3/19
//                                                  JA2GQP
//////////////////////////////////////////////////////////////////////
//  2023/march/09 for JR-310 1'ST OSC USE SI5315A DDS IC
//  MODIFIED BY JL7GMN
//////////////////////////////////////////////////////////////////////

#include "src/si5351.h"              // https://github.com/etherkit/Si5351Arduino, v2.1.0
#include "src/SSD1306AsciiAvrI2c.h"  // https://github.com/greiman/SSD1306Ascii
#include <EEPROM.h>

//---------- Set I/O Device ---------------------

Si5351 si5351(0x60);                 // Si5351 I2C address
SSD1306AsciiAvrI2c oled;

//----------  Define Constant Value   ----------
                                                
#define   SW_CH     A0                // CH SW
#define   SW_TX     A2                // TX SW
#define   PIN_SM    A7                // S-meter voltage input

#define SW_160   12 //D12  EXT:1.8MHz
#define SW_80    11 //D11  3.5MHz
#define SW_40    10 //D10  7.0MHz  //#define SW_30     9 //10.0MHz
#define SW_20     9 //D9  14.0MHz  //#define SW_17     7 //18.0MHz
#define SW_15     8 //D8  21.0MHz  //#define SW_12     5 //24.5MHz
#define SW_101    7 //D7  28.0MHz
#define SW_102    6 //D6  28.5MHz
#define SW_103    5 //D5  29.1MHz
#define SW_61     4 //D4  50.0MHz  28.0MHz
#define SW_62     3 //D3  50.5MHz  28.5MHz
#define SW_WWV    2 //D2  15.0MHz WWV JJY

////////////////////////////////
// Channel Frequency
////////////////////////////////
#define  CH1_FRQ     7765000L         // EXT:1.8MHz
#define  CH2_FRQ     9455000L         // 3.5MHz  
#define  CH3_FRQ    12955000L         // 7.0MHz  
#define  CH4_FRQ    19955000L         // 14.0MHz
#define  CH5_FRQ    26955000L         // 21.0MHz
#define  CH6_FRQ    33955000L         // 28.0MHz
#define  CH7_FRQ    34455000L         // 28.5MHz
#define  CH8_FRQ    35055000L         // 29.1MHz
#define  CH9_FRQ    33955000L         // 50.0MHz 28.0MHz
#define  CH10_FRQ   34455000L         // 50.5MHz 28.5MHz
#define  CH11_FRQ   20955000L         // 15.0MHz WWV JJY

////////////////////////////////
// etc
////////////////////////////////
#define  CH1        1                 // Channel 1: EXT 1.8MHz
#define  CH2        2                 // Channel 2: 3.5MHz
#define  CH3        3                 // Channel 3: 7.0MHz
#define  CH4        4                 // Channel 4:14.0MHz
#define  CH5        5                 // Channel 5:21.0MHz
#define  CH6        6                 // Channel 6:28.0MHz
#define  CH7        7                 // Channel 7:28.5MHz
#define  CH8        8                 // Channel 8:29.1MHz
#define  CH9        9                 // Channel 9:50.0MHz(28.0MHz)
#define  CH10       10                // Channel 10:50.5MHz(28.5MHz)
#define  CH11       11                // Channel 11:15.0MHz

#define  MAX_CHN    11                 // Max Channel 4
#define  INT_END    73                // Initial end code
//#define  IF_FRQ     10700000L         // IF Frequency 10.7MHz
//#define  IF_FRQ         455000L         // IF Frequency  0.455MHz
#define  IF_FRQ     0L         // IF Frequency 0MHz
#define  OLED_ADR   0x3C              // OLED Address

//----------  EEPROM Memory Address   -----------------------

#define  EEP_INT    0x00              // Eep Init(1byte*1)
#define  EEP_CHN    0x01              // Channel(1byte*1)

//----------  Memory Assign  -------------------

unsigned long Vfo_Dat = 0;            // VFO Data
unsigned long Vfo_Datb = 0;           //          old
unsigned long If_Dat;                 
unsigned long Frq_Dat;                // Frequency Data                 

byte Byt_Chn = CH1;                   // Channel SW
byte Flg_Tx = 0;                      // TX Flag
byte Flg_Txb = 1;                     //         old

unsigned int Val_SM = 0;              // S-Meter Data
unsigned int Val_SMb = 0;             //              old
unsigned long awase = 0;    //frequency [Hz]周波数補正 add 2023/march/10

//----------  Initialization  Program  ---------------

void setup(){
  Serial.begin(9600);
  si5351.init(SI5351_CRYSTAL_LOAD_8PF,0,0);//crystal 25.000 MHz, correction 0
  si5351.drive_strength(SI5351_CLK0,SI5351_DRIVE_4MA);//Drive lebel 4mA set
 
  oled.begin(&Adafruit128x32, OLED_ADR);

  pinMode(SW_TX,INPUT_PULLUP);  //A2
  pinMode(SW_CH,INPUT_PULLUP);  //A0

  pinMode(SW_160,INPUT_PULLUP);  //D12
  pinMode(SW_80, INPUT_PULLUP);  //D11
  pinMode(SW_40, INPUT_PULLUP);  //D10
  pinMode(SW_20, INPUT_PULLUP);  //D9
  pinMode(SW_15, INPUT_PULLUP);  //D8
  pinMode(SW_101,INPUT_PULLUP);  //D7
  pinMode(SW_102,INPUT_PULLUP);  //D6
  pinMode(SW_103,INPUT_PULLUP);  //D5
  pinMode(SW_61, INPUT_PULLUP);  //D4
  pinMode(SW_62, INPUT_PULLUP);  //D3
  pinMode(SW_WWV,INPUT_PULLUP);  //D2

 
  if(EEPROM.read(EEP_INT) != INT_END){    // Eep initialaz
    delay(10);
    Eep_Init();
  }

  Byt_Chn = EEPROM.read(EEP_CHN);         //     Channel

  CH_Set();
  Disp_Comm1();
}

//----------  Main program  ---------------

void loop() {
 
  if(digitalRead(SW_TX) == HIGH){          // RX ?
    if((digitalRead(SW_160) == LOW)){       // CH SW On?
        Byt_Chn= CH1;  
     CH_Set();                               
    }
    if((digitalRead(SW_80) == LOW)){
        Byt_Chn= CH2;  
        CH_Set();                 
    }
    if((digitalRead(SW_40) == LOW)){
        Byt_Chn= CH3;  
        CH_Set();                 
    }
    if((digitalRead(SW_20) == LOW)){
        Byt_Chn= CH4;  
        CH_Set();                 
    }
    if((digitalRead(SW_15) == LOW)){
        Byt_Chn= CH5;  
        CH_Set();                 
    }
    if((digitalRead(SW_101) == LOW)){
        Byt_Chn= CH6;  
        CH_Set();                 
    }
    if((digitalRead(SW_102) == LOW)){
        Byt_Chn= CH7;  
        CH_Set();                 
    }
    if((digitalRead(SW_103) == LOW)){
        Byt_Chn= CH8;  
        CH_Set();                 
    }
    if((digitalRead(SW_61) == LOW)){
        Byt_Chn= CH9;  
        CH_Set();                 
    }
    if((digitalRead(SW_62) == LOW)){
        Byt_Chn= CH10;  
        CH_Set();                 
    }
    if((digitalRead(SW_WWV) == LOW)){
        Byt_Chn= CH11;  
        CH_Set();                 
    }

    Flg_Tx = 0;
    If_Dat = IF_FRQ;
  }
  else{                                   // TX
    Flg_Tx = 1;                           // Yes,TX Flag set
    If_Dat = 0;                           //     If_Dat 0 set
  }

  //Vfo_Dat = Frq_Dat + If_Dat;
  Vfo_Dat = Frq_Dat + If_Dat + awase;
 

  Serial.print("Frq_Dat = ");
  Serial.println( Frq_Dat);
  Serial.print("Vfo_Dat = ");
  Serial.println( Vfo_Dat);
 
  if(Vfo_Dat != Vfo_Datb){                  // Frequency update?
    si5351.set_freq(Vfo_Dat * SI5351_FREQ_MULT,SI5351_CLK0);
    Vfo_Datb = Vfo_Dat;
  }

  if(Flg_Tx != Flg_Txb){
    Disp_Comm1();
    Flg_Txb = Flg_Tx;
  }

  Val_SM = analogRead(PIN_SM);
  if ((abs(Val_SM - Val_SMb)) > 3) {  // if needed draw S-meter
    Disp_SM();
    Val_SMb = Val_SM;
  }

}  


//----------  Channel Data Set & Display Frequency  ---------

void CH_Set(){
  oled.setFont(lcdnums14x24);
  oled.setCursor(1, 0);
     
  Serial.print("Byt_Chn = ");
  Serial.println(Byt_Chn);
 
  switch(Byt_Chn){
    case CH11:
      Frq_Dat = CH11_FRQ;
      awase = 272;
      oled.print("11:15.000");     
      break;
    case CH10:
      Frq_Dat = CH10_FRQ;
      awase = 450;
      oled.print("10:50.500");    
      break;
    case CH9:
      Frq_Dat = CH9_FRQ;
      awase = 445;
      oled.print("09:50.000");      
      break;
    case CH8:
      Frq_Dat = CH8_FRQ;
      awase = 460;
      oled.print("08:29.100");       
      break;
    case CH7:
      Frq_Dat = CH7_FRQ;
      awase = 450;
      oled.print("07:28.500");       
      break;
    case CH6:
      Frq_Dat = CH6_FRQ;
      awase = 445;
      oled.print("06:28.000");      
      break;
    case CH5:
      Frq_Dat = CH5_FRQ;
      awase = 354;
      oled.print("05:21.000");      
      break;
    case CH4:
      Frq_Dat = CH4_FRQ;
      awase = 262;
      oled.print("04:14.000");      
      break;
    case CH3:
      Frq_Dat = CH3_FRQ;
      awase = 169;
      oled.print("03:7.000");
      break;
    case CH2:
      Frq_Dat = CH2_FRQ;
      awase = 123;
      oled.print("02:3.500");      
      break;
    case CH1:
      Frq_Dat = CH1_FRQ;
      awase = 100;
      oled.print("01:1.800");      
      break;
 
    default:
      break;
  }

 
  EEPROM.write(EEP_CHN,Byt_Chn);
}

//----------  Display Common1(TX/RX)  ---------

void Disp_Comm1(){
  oled.setCursor(2, 3);
  oled.setFont(labels);

  if(Flg_Tx == 1)
    oled.print("2");                // "2" is "TX" in labels.h
  else
    oled.print("1");                // "1" is "RX" in labels.h
}

//----------  CH SW Check  ----------------------

void CH_Switch(){
  Byt_Chn++;
   
  while(digitalRead(SW_CH) == LOW)
   ;
 
  if(Byt_Chn > MAX_CHN)
    Byt_Chn = CH1;
    
}

//----------  Display S-Meter  -------------------

void Disp_SM() {
  uint8_t a = 0;
  uint8_t m = 0;

  a = (Val_SM + 3) / 113;            // 1024 / 9 characters for S = 1,3,5,7,8,9,+10,+20,+30
  oled.setFont(pixels);
  oled.setCursor(25, 3);
  for (m = 0; m < a; m++)
    if (m < 6)
      oled.print('7');               // '5' - hollow rectangle, 6px
    else
      oled.print('8');               // '6' - filled rectangle, 6px
  for (m = a; m < 9; m++)
    oled.print('.');                 // '.' 1px
}

//---------- EEProm Initialization -----------------

void Eep_Init(){
  EEPROM.write(EEP_INT,INT_END);                  // Init end set(73)  
  EEPROM.write(EEP_CHN,CH1);                      // Init end set(73)  
}

上記で全バンドの局発信号に対応できました。

【JR-310でのバンドSWへの接続方法】
バンド入力ポートのD2からD12はJR−310のクリスタルがついていたロータリーSWに接続します。局発の真空管6BL8のグリッドからロータリーSWコモン端子接続は切り離します。そしてロータリーSWコモンはGNDにつなぎます。D2からD12はプルアップの入力ポートですので、ロータリーSWを回し設定したときにArduinoNANOのバンドの入力ポート(バンド周波数に対応したD2からD12のどれか)が”H”から”L”となり設定バンドの局発周波数が発振設定されます。

JR-310-BAND-SW2023-03-11 06-00-23

DDSの出力波形を見てると完全な正弦波でないので、バッファー兼LPFも必要と思っています。が、一旦、直接現状このままで、JR−310でつないでみてどうかも確認したいと思います。

先週、Ubuntu 18.04LTSが起動しなくなってしまいました。サポート期限が2023年4月までです。なので起動しなくなったついで、このDeskTopPCで対応できるUbuntu20.04LTSを急遽インストールしています。20.04LTSはサポート期限が2025年4月まであるので、2年間は大丈夫です。22.04LTSはサポート期限は2027年4月までですが、PCが対応すれば入れたいところですが、Vistaですので無理があります。Hi! 20.04LTSは問題なく動いてくれます。
20.04LTSをインストールしましたが、18.04LTSで使用していたアプリの再度設定が必要な状態となっています。Arduino IDEは第一優先で設定し動作させました。WindosXP時代対応のプリンターは現在確認したところメーカーでもLinux用のドライバを用意してくれてあったため、問題なくインストールできました。順次20.04LTSにて18.04LTSで動いていたアプリを動作するように設定をし直さなければなりません。20.04LTSではそのままで18.04LTSのアプリはうごきませんでした。各アプリの階層設定を含め少し手間が掛かりそうです。トラブルでどんどんやることが増えてばかりで、目的のことがやれないでいます。18.04LTSで動いていた便利なアプリは、操作も使い込んでなれていますから、なんとか動かしたいと思います。!

つづく?