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) 
}




     


8 件のコメント:

おおさかJR3 さんのコメント...
このコメントは投稿者によって削除されました。
おおさかJR3 さんのコメント...

お世話に成っております。
松永です
si5351a CB VFOでチャンネル切り替えをロータリーエンコーダーで
アップダウンさせたいと思っています、
#define SW_CH_R 6 // CH SW リバース
この場合プログラムとしてチャンネルリバース用の一式のプログラムを
書いて行うのか、何かヒントいただけないでしょうか。
お忙しいとこすみません。

JA2GQP さんのコメント...

松永さん
先日、7segを使った物を作りました。
Blogにはupしてないのですが、Twitterで公開しました。
JA2GQP' Download siteのsi5351 VFOフォルダにcb_7seg_vfo.zipが有ります。
これをダウンロードしてください。
https://sites.google.com/site/ja2gqp/

おおさかJR3 さんのコメント...

JA2GQP局

おおさかJR3です。

情報有難う御座います、
プログラムの勉強と実利用させて頂きます。

プログラム公開感謝しております。



匿名 さんのコメント...

親愛なるJA2GQPさん、
良い一日

私があなたの経験を共有することに非常に感謝する前に、私に尋ねさせてください。

私はプログラムを正常に実行しました、そしてそれは私にとって異常です。

私はプロジェクトを作成しようとしていますが、少し異なりますが、TXのときに周波数がCLK1またはCLK2で出力されているときにCLK0のプログラムをオフにし、CLK0のRXのときは周波数が存在しているのにCLK1またはCLK2でオフになっています。
結果がエラーにならないように変更する必要があるプログラムリストの部分をガイドしてください

あなたが私の質問に喜んで答えてくれるなら、私はとても感謝しています

ありがとうございました :-)

JA2GQP さんのコメント...

匿名さん
貴方の仕様の通り動作させるのは簡単です。
私のBlogに訪れる人は、少なくともプログラムが独自で出来るスキルが有ると判断してます。助言を求めなくて作れる程度の内容です。

匿名 さんのコメント...

Hi, I am daniel, nice work with these projects, I have old CB radio, which need 40ch 7seg. And 3 band will make it totally 40x3 band . Can you help me please ?... Email me danieldwi69@gmail.com
Thank you

JA2GQP さんのコメント...

I wrote it on my blog, but it doesn't support customization. very sorry.