2019年2月26日火曜日

si5351a CB VFO

 si5351aの8ch CB VFOである。このVFOは、周辺デバイスとのI/Fは全てI2Cで行っている。合法CBは、1-8CHであるが、9-10CHに受信のみ出来るチャンネルを設けた。CBの場合、チャンネル有りき周波数なので、周波数表示は不要である。ただ、普段アマチュア無線を行っていると、周波数表示が欲しくなる。そこで今回、周波数表示はテキストデータをそのまま表示させる事にした。適当なテキストを表示させるのも面白いと思う。操作は、CHスイッチを押すとチャンネルが順送りし、メモリー保存する。超シンプルである。



回路図

回路図は、AFPSN VFO回路の不要な所を除いたのみである。













スケッチ

ライブラリは、バージョンが異なると正しく動作しない場合がある為、スケッチと同じフォルダにsrcフォルダを作って、si5351.hとLiquidCrystal_I2C.hが入れてある。必要なファイルはsi5351 VFOフォルダのcb_vfo.zip。

//////////////////////////////////////////////////////////////////////
//  si5351a CB VFO program ver.1.0
//    Copyright(C)2019.JA2GQP.All rights reserved.
//
//                                                2019/2/26
//                                                  JA2GQP
//////////////////////////////////////////////////////////////////////
#include "src/si5351.h"                      // Ver2,1,0
#include "src/LiquidCrystal_I2C.h"           //    1.1.2
#include <EEPROM.h>

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

LiquidCrystal_I2C lcd(0x27,16,2);       // address 0x27, display 16x2
Si5351 si5351;

//----------  Define Constant Value   ----------
                                               
#define   SW_CH     5                     // CH SW
#define   SW_TX     9                     // TX SW

////////////////////////////////
// Channel Frequency
////////////////////////////////
#define  CH1_FRQ    26968000L           // Channel 1 Frequency
#define  CH2_FRQ    26976000L           //         2
#define  CH3_FRQ    27040000L           //         3
#define  CH4_FRQ    27080000L           //         4
#define  CH5_FRQ    27088000L           //         5
#define  CH6_FRQ    27112000L           //         6
#define  CH7_FRQ    27120000L           //         7
#define  CH8_FRQ    27144000L           //         8
#define  CH9_FRQ    27005000L           //         9
#define  CH10_FRQ   27524000L           //        10

////////////////////////////////
// etc
////////////////////////////////
#define  CH1        1                   // Channel 1
#define  CH2        2                   // Channel 2
#define  CH3        3                   // Channel 3
#define  CH4        4                   // Channel 4
#define  CH5        5                   // Channel 5
#define  CH6        6                   // Channel 6
#define  CH7        7                   // Channel 7
#define  CH8        8                   // Channel 8
#define  CH9        9                   // Channel 9
#define  CH10       10                  // Channel 10

#define  Max_Chn    10                  // Max Channel(10ch)
#define  Int_End    73                  // Initial end code
#define  CALL      "JA2GQP"             // Display Call sign
#define  IF_FRQ     455000L             // IF Frequency 455kHz

//----------  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

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

void setup(){
  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
 
  lcd.begin();
  lcd.backlight();
  lcd.clear();

  pinMode(SW_TX,INPUT_PULLUP);
  pinMode(SW_CH,INPUT_PULLUP);

  if(EEPROM.read(Eep_Int) != Int_End){    // Eep initialaz
    delay(10);
    Fnc_Eep_Int();
  }

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

  Channel_Set();
  LCD_Line1();
}

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

void loop() {

  if(digitalRead(SW_TX) == HIGH){          // TX off?
    if((digitalRead(SW_CH) == LOW)){       // CH SW On?
      Fnc_Chsw();
      Channel_Set();                                 
    }
    Flg_Tx = 0;
    If_Dat = IF_FRQ;
    si5351.output_enable(SI5351_CLK0,1);  // PLL Out enable 
  }
  else{                                   // TX on
    if(Byt_Chn <= CH8){                   // CH1-CH8?
      Flg_Tx = 1;                         // Yes,TX Flag set
      If_Dat = 0;                         //     If_Dat 0 set
      si5351.output_enable(SI5351_CLK0,1);// PLL Out enable 
    }
    else{                                 // CH9-CH10
      Flg_Tx = 0;                         // TX Flag reset                         
      If_Dat = IF_FRQ;                    // If_Dat set
      si5351.output_enable(SI5351_CLK0,0);// PLL Out disable 
    }
  }

  Vfo_Dat = Frq_Dat + If_Dat;
 
  if(Vfo_Dat != Vfo_Datb){                  // Frequency update?
    si5351.set_freq(Vfo_Dat * SI5351_FREQ_MULT,SI5351_CLK0);
    Vfo_Datb = Vfo_Dat;
  }
  LCD_Line1();



//----------  Channel Data Set & LCD Line0 Display  ---------

void Channel_Set(){
  lcd.setCursor(0,0);
  lcd.print("CH");

  switch(Byt_Chn){
    case CH1:
      Frq_Dat = CH1_FRQ;
      lcd.print("01  26.968");     
      break;
    case CH2:
      Frq_Dat = CH2_FRQ;
      lcd.print("02  26.976");     
      break;
    case CH3:
      Frq_Dat = CH3_FRQ;
      lcd.print("03  27.040");     
      break;
    case CH4:
      Frq_Dat = CH4_FRQ;
      lcd.print("04  27.080");     
      break;
    case CH5:
      Frq_Dat = CH5_FRQ;
      lcd.print("05  27.088");     
      break;
    case CH6:
      Frq_Dat = CH6_FRQ;
      lcd.print("06  27.112");     
      break;
    case CH7:
      Frq_Dat = CH7_FRQ;
      lcd.print("07  27.120");     
      break;
    case CH8:
      Frq_Dat = CH8_FRQ;
      lcd.print("08  27.144");     
      break;
    case CH9:
      Frq_Dat = CH9_FRQ;
      lcd.print("09  27.005");     
      break;
    case CH10:
      Frq_Dat = CH10_FRQ;
      lcd.print("10  27.524");     
      break;
    default:
      break;
  }
  EEPROM.write(Eep_Chn,Byt_Chn);
  lcd.setCursor(13,0);
  lcd.print("MHz");
}

//----------  LCD Line1 Display  ---------

void LCD_Line1(){
  lcd.setCursor(0,1);

  if(Flg_Tx == 1)
    lcd.print("TX");
  else
    lcd.print("RX");

  lcd.setCursor(10,1);
  lcd.print(CALL);
}

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

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

//---------- Function Eeprom Initialization -----------------

void Fnc_Eep_Int(){
  EEPROM.write(Eep_Int,Int_End);                  // Init end set(73) 
  EEPROM.write(Eep_Chn,CH1);                      // Init end set(73) 
}