無線ブログ集
メイン | 簡易ヘッドライン |
JR-310プチレストアその2 (2023/3/11 6:03:04)
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
//////////////////////////////////////////////////////////////////////
// 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
//////////////////////////////////////////////////////////////////////
// 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
#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”となり設定バンドの局発周波数が発振設定されます。
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で動いていた便利なアプリは、操作も使い込んでなれていますから、なんとか動かしたいと思います。!
つづく?
execution time : 0.030 sec