2016年6月1日水曜日

si5351 VFO

Adafruit si5351モジュールを使ったVFOで、LCDにnokia5110 を組合わせた。DUAL VFO方式を採用し、BFOを自動選択方式にしてスイッチを減らした。チャンネルは、0-9(max10ch)でバンドに割り付ける事も可能だが、同一周波数帯としても使える。RITは、±10kHZ。Sメータ機能付き。周波数帯域外は、over表示して送信不可。また、送信時はスイッチ操作が出来ない様、誤操作保護を行っている。SPLIT機能は、メモリ不足の為、優先順位から除外した。   
 

部品実装基板である。0Ωは、ジャンパーとして使用している。部品の大半がジャンパーなので、PCBとして出来が悪いかも知れない。 



回路図である。nokia5110のバックライトは、現時点で電源印可の違いで、2種ある事が判っているいる。
タイプ1 BL端子 VCC接続
タイプ2 BL端子 GND接続
バックライトのタイプの違いに対応する為、ジャンパチップで設定する事にした。

基板寸法 93 x 47










Program

使っているライブラリは、ソースに書いて有るので参照願いたい。
BANDプランでモード変更(CW、LSB、USB)を行っているので、必要に応じ修正しなければならない。
//////////////////////////////////////////////////////////////////////
//  si5351 VFO program ver.1.0
//    Copyright(C)2016.JA2GQP.All rights reserved.
//
//                                Arduino IDE 1.6.9 Compiled                                  
//
//                                                2016/5/30
//                                                  JA2GQP
//--------------------------------------------------------------------
//  Function
//    1.STEP(1M,100k,10k,1k,100,10)
//    2.Memory Channel ch0 - ch9(10ch)
//    3.Protection Operation At The Time Of Transmission
//--------------------------------------------------------------------
// Library
//  Rotary encoeder  http://www.buxtronix.net/2011/10/rotary-encoders-done-properly.html
//  si5351Arduino    https://github.com/etherkit/Si5351Arduino
//  LCD5110_Basic    http://www.rinkydinkelectronics.com/library.php?id=44
//////////////////////////////////////////////////////////////////////

#include <rotary.h>
#include <si5351.h>
#include <Wire.h>
#include <LCD5110_Basic.h>
#include <EEPROM.h>

//----------  Define Constant Value   -----------------------

////////////////////////////////
// I/O assign
////////////////////////////////

const byte  ENC_A = 2;                     // Encorder A
const byte  ENC_B = 3;                     // Encoeder B
const byte  SW_STEP = 4;                   // STEP SW
const byte  SW_RIT = 5;                    // RIT SW
const byte  SW_CH = 6;                     // CH SW
const byte  SW_TX = 15;                    // TX SW

const byte  AD_IN = A0;                    // analog input for left channel

////////////////////////////////
// default value
////////////////////////////////

const long  DEF_FRQ = 7050000L;            // Default Vfo(7.05MHz)
const long  DEF_STP = 1000L;               // Init STEP(1kHz)

////////////////////////////////
// Limited range
////////////////////////////////

const long  LW_FRQ = 0L;                   // Frequency Lower Limit
const long  HI_FRQ = 60000000L;            //           Upper Limit

const long  LW_RIT = -10000L;              // RIT Lower Limit
const long  HI_RIT = 10000L;               // RIT Upper Limit

const long  LW_VFO80 = 3500000L;           // 3.5MHz Lower
const long  MI_VFO80 = 3535000L;           //        Middle
const long  HI_VFO80 = 3575000L;           //        Upper
const long  LW_VFO40 = 7000000L;           // 7MHz   Lower
const long  MI_VFO40 = 7045000L;           //        Middle
const long  HI_VFO40 = 7200000L;           //        Upper
const long  LW_VFO20 = 14000000L;          // 14MHz  Lower
const long  MI_VFO20 = 14100000L;          //        Middle
const long  HI_VFO20 = 14350000L;          //        Upper
const long  LW_VFO15 = 21000000L;          // 21MHz  Lower
const long  MI_VFO15 = 21150000L;          //        Middle
const long  HI_VFO15 = 21450000L;          //        Upper
const long  LW_VFO10 = 28000000L;          // 28MHz  Lower
const long  MI_VFO10 = 28200000L;          //        Middle
const long  HI_VFO10 = 29000000L;          //        Upper

////////////////////////////////
// etc
////////////////////////////////

const byte  Max_Chn = 10;                  // Max Channel(1-10ch)
const byte  Int_End = 73;                  // Initial end code

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

const byte  Frq_Eep = 0x00;                // Frequency(4byte*10)
const byte  Stp_Eep = 0x30;                // STEP(4byte*10)
const byte  Chn_Eep = 0x60;                // Channel(1byte*1)
const byte  Eep_Int = 0x6e;                // Eep Init(1byte*1)

//----------  LCD NOKIA 5110 definition --------------------

LCD5110 myGLCD(8,9,10,11,12);             // SCK,MOSI,DC,RST,CS
extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
extern uint8_t BigNumbers[];

//----------  si5351 definition -----------------------------

Si5351 si5351;

//----------  Encorder Pin definition  ----------------------

Rotary r = Rotary(ENC_A, ENC_B);

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

volatile long LSB = 10701500L;              // 10.7015MHz
volatile long USB = 10698500L;              // 10.6985MHz
volatile long CW  = 10700600L;              // 10.7006MHz
volatile long bfo = 10701500L;              // start in LSB
volatile long IF  = 10700000L;              // 10.7000MHz

volatile long Vfo_Dat = DEF_FRQ;            // Default Frequency
volatile long Vfo_Datb;                     // Vfo data(old)
volatile long Lng_Wk1;                      // Long Work1
volatile long Lng_Wk2;                      // Long Work2
volatile long Dds_Dat;
String tbfo = "";

volatile long Rit_Dat = 0;                 // RIT Data
volatile long Rit_Datb = 0;
volatile long Enc_Stp = 1000;              // STEP

byte Flg_Tx = 0;                          // TX Flag
byte Flg_Rit = 0;                         // RIT Flag
byte Flg_Spl;                             // SPLIT Flag
byte Flg_Over;                            // Over Flag
byte Byt_Chn = 0;                         // Channel SW
byte Byt_Chnb = 0;                        // Channel SW Old

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

void setup(){
  myGLCD.InitLCD();                              // nokia5110 Init  
  Wire.begin();

  si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0);       //initialize the Si5351
  si5351.set_pll(SI5351_PLL_FIXED, SI5351_PLLA); // Set PLL
                                                 // Set CLK0 Frequency(VFO)
  pinMode(SW_STEP,INPUT_PULLUP);
  pinMode(SW_RIT,INPUT_PULLUP);
  pinMode(SW_CH,INPUT_PULLUP);
  pinMode(SW_TX,INPUT_PULLUP);
 
  PCICR |= (1 << PCIE2);                        // Enable pin change interrupt for the encoder
  PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
  sei();                                        // INT Enable
  Rit_Dat = 0;
  Flg_Rit = 0;
 
  if(EEPROM.read(Eep_Int) != Int_End){         // Eep initialaz
    delay(10);
    Fnc_Eep_Int();
  }

  Byt_Chn = EEPROM.read(Chn_Eep);              // Eep Channel Read
  Byt_Chnb = Byt_Chn;
  Fnc_Eep_Rd();
  Fnc_Lcd();                                   // Display LCD
  Fnc_Step_Disp();
}

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

void loop(){
  if(Flg_Tx == 0){
    Fnc_Smeter();
   
    if(digitalRead(SW_STEP) == LOW)               // STEP Sw On?
      Fnc_Stp();                          
    if((digitalRead(SW_RIT) == LOW))              // RIT SW On?
      Fnc_Rit();
    if((digitalRead(SW_CH) == LOW))               // CH SW On?
      Fnc_Chsw();

    if(Byt_Chnb != Byt_Chn){                      // CH SW OLD != NEW?
      Fnc_Eep_Wt(Byt_Chnb);
      Byt_Chnb = Byt_Chn;
      Fnc_Eep_Rd();
    }
  }

  if(digitalRead(SW_TX) == LOW)                  // Tx On?
    Flg_Tx = 1;
  else
    Flg_Tx = 0;

  Fnc_Step_Disp();
  Fnc_Lcd();

  if((Flg_Tx == 0) && (Flg_Rit == 1))
      si5351.set_freq(((Vfo_Dat+IF+Rit_Dat) * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK0);
  if((Flg_Tx == 1) || (Flg_Rit == 0))
     si5351.set_freq(((Vfo_Dat+IF) * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK0);

  Fnc_Band(Vfo_Dat);
   
  if(Flg_Over == 1)                             // Over?
    myGLCD.print("over",CENTER,16);             // Display(over)
  else  
    myGLCD.clrRow(2);                           // Clear(over)

  if((Flg_Over == 1) && (Flg_Tx == 1))
    si5351.output_enable(SI5351_CLK0, 0);       // VFO disable
  else
     si5351.output_enable(SI5351_CLK0, 1);      // VFO enable

  si5351.set_freq(( bfo* SI5351_FREQ_MULT), 0, SI5351_CLK2);
}

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

void Fnc_Smeter(){
  int ad1 = 0;
  int ad2 = 0;
 
  for(int i=0;i<6;i++){
    ad1 = map(sqrt( analogRead( AD_IN  )*20 ),0,143,0,140);
    ad2 = ad1 + ad2;
  }
  ad2 = ad2 / 5;
  int s_dat = map(ad2,0,140,0,14);

  for (int i=0; i<s_dat; i++)        
    myGLCD.print("\\",(i*6), 40);
  myGLCD.clrRow(5,(s_dat*6));

  if(s_dat < 1)
    myGLCD.print("S0   ",RIGHT,32);
  else if((s_dat <=1) &&(s_dat < 2))
    myGLCD.print("S1   ",RIGHT,32);
  else if((s_dat <= 2) && (s_dat < 4))
    myGLCD.print("S3   ",RIGHT,32);
  else if((s_dat <= 4) && (s_dat < 5))
    myGLCD.print("S5   ",RIGHT,32);            
  else if((s_dat <= 5) && (s_dat < 7))
    myGLCD.print("S7   ",RIGHT,32);
  else if((s_dat <= 7) && (s_dat < 9))
    myGLCD.print("S9   ",RIGHT,32);
  else if((s_dat <= 9) && (s_dat < 12))
    myGLCD.print("S9+10",RIGHT,32);
  else if((s_dat <= 12) && (s_dat < 13))
    myGLCD.print("S9+20",RIGHT,32);
  else if(s_dat >= 13)
    myGLCD.print("S9+40",RIGHT,32);
}

//----------  Encorder procedure(INT)  ---------------

ISR(PCINT2_vect) {
  unsigned char result = r.process();

  if(Flg_Tx == 0){
    if(result) {  
      if(result == DIR_CW){
        Lng_Wk1 = Vfo_Dat + Enc_Stp;
        Lng_Wk2 = Rit_Dat + Enc_Stp;
      }
      else{
          Lng_Wk1 = Vfo_Dat - Enc_Stp;
          Lng_Wk2 = Rit_Dat - Enc_Stp;
      }    

      if(Flg_Rit == 1)
        Rit_Dat = Lng_Wk2;
      else{
        Vfo_Dat = Lng_Wk1;
        Rit_Dat = 0;
      }

      Vfo_Dat = constrain(Vfo_Dat,LW_FRQ,HI_FRQ);  // VFO range check
      Rit_Dat = constrain(Rit_Dat,LW_RIT,HI_RIT);  // RIT range check
    }
  }
}

//----------  Function Encorder STEP  -----------------------

void Fnc_Stp(){
  if(Enc_Stp == 10)                       // Step = 10Hz ?
    Enc_Stp = 1000000;                    //   Yes,1Mhz set
    else
      Enc_Stp = Enc_Stp / 10;             // Step down 1 digit

  Fnc_Step_Disp();
  while(digitalRead(SW_STEP) == LOW)
    ;
}

//----------  Function STEP Display  ------------------------

void Fnc_Step_Disp(){
  switch(Enc_Stp){
    case 10:
      myGLCD.print("  10", RIGHT,24);
      break;
    case 100:
      myGLCD.print(" 100", RIGHT,24);
      break;
    case 1000:
      myGLCD.print("  1k", RIGHT,24);
      break;
    case 10000:
      myGLCD.print(" 10k", RIGHT,24);
      break;
    case 100000:
      myGLCD.print("100k", RIGHT,24);
      break;
    case 1000000:
      myGLCD.print("  1M", RIGHT,24);
      break;
    default:
      myGLCD.print("  1k", RIGHT,24);
      Enc_Stp = 1000;
      break;
  }
}

//----------  Function Save EEPROM 4byte  ---------

void Fnc_Eep_Sav4(long value,int address){
  address += 3;
  for(int i = 0;i < 4;i++){
    byte toSave = value & 0xFF;
    if(EEPROM.read(address) != toSave){
      EEPROM.write(address,toSave);
      }
    value = value >> 8;
    address--;
  }
}

//----------  Function Load EEPROM 4byte  ---------

long Fnc_Eep_Lod4(int address){
  long value = 0;

  for(int i = 0;i < 4;i++){
    value = value | EEPROM.read(address);
    if( i < 3){
      value = value << 8;
      address++;
    }
  }
  return value;
}


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

void Fnc_Lcd(){
  char s[6] ={'\0'};
 
  Fnc_Fdsp(Vfo_Dat);
  myGLCD.setFont(SmallFont);
  if(Flg_Tx == 0)
    myGLCD.printNumI(Byt_Chn,RIGHT, 0);
  else
    myGLCD.print("T",RIGHT,0);
  myGLCD.print(tbfo,LEFT,24);           // Mode
  if(Flg_Rit == 1){
    myGLCD.print("R",0,32);
    if(Rit_Dat != Rit_Datb){
      myGLCD.print("      ",6, 32);
      Rit_Datb = Rit_Dat;
    }
    sprintf(s,"%+d",Rit_Dat);
    myGLCD.print(s,6, 32);
  }
}

//----------  Function Frequency Display  ---------

void Fnc_Fdsp(long f_disp){
  long f1 = f_disp / 1000L;
  long f2 = f_disp % 1000L;
  char s1[6] ={'\0'};
  char s2[4] ={'\0'};

  if(f_disp != Vfo_Datb){
    myGLCD.clrRow(0);
    myGLCD.clrRow(1);
    Vfo_Datb = Vfo_Dat;
  }
  myGLCD.setFont(MediumNumbers);
  myGLCD.printNumI(f1,LEFT, 0);
  myGLCD.setFont(SmallFont);
  sprintf(s2,"%03d",f2);
  myGLCD.print(s2,RIGHT,8);
}

//----------  Function Rit  ---------

void Fnc_Rit(){
  char s[6] ={'\0'};
 
  if(Flg_Rit == 0){
    Rit_Dat = 0;
    Fnc_Eep_Wt(Byt_Chn);
    myGLCD.print("R",0,32);
    sprintf(s,"%+d",Rit_Dat);
    myGLCD.print(s,6, 32);
    Flg_Rit = 1;
  }
  else{
    Flg_Rit = 0;
    myGLCD.print("        ",0, 32);
  }

  while(digitalRead(SW_RIT) == LOW)
    ;
}

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

void Fnc_Chsw(){
  byte cnt = 0;
 
  Byt_Chn++;
 
  while(digitalRead(SW_CH) == LOW){
    delay(500);
    cnt++;
    if(6 <= cnt){                               // Eep Initial start(3sec)?
      Fnc_Eep_Int();                            // Initialization
      Byt_Chn = EEPROM.read(Chn_Eep);           // Channel Read
      Byt_Chnb = Byt_Chn;
      Fnc_Eep_Rd();                             // EEPROM Read
      Fnc_Fdsp(Vfo_Dat);
      myGLCD.print("default",CENTER,16);
    }
  }
}

//----------  Function Band  -------------------------------

void Fnc_Band(long vfo){
  if((vfo >= LW_VFO80) && (vfo < MI_VFO80)){          // 3.5MHz
    Flg_Over = 0;
    tbfo = "CW ";
    bfo = CW;
  }
  else if((vfo >= MI_VFO80) && (vfo <= HI_VFO80)){
    Flg_Over = 0;
    tbfo = "LSB";
    bfo = LSB;
  }

  else if((vfo >= LW_VFO40) && (vfo < MI_VFO40)){     // 7MHz
    Flg_Over = 0;
    tbfo = "CW ";
    bfo = CW;
  }
  else if((vfo >= MI_VFO40) && (vfo <= HI_VFO40)){
    Flg_Over = 0;
    tbfo = "LSB";
    bfo = LSB;
  }

  else if((vfo >= LW_VFO20) && (vfo < MI_VFO20)){     // 14MHz
    Flg_Over = 0;
    tbfo = "CW ";
    bfo = CW;
  }
  else if((vfo >= MI_VFO20) && (vfo <= HI_VFO20)){
    Flg_Over = 0;
    tbfo = "USB";
    bfo = USB;
  }

  else if((vfo >= LW_VFO15) && (vfo < MI_VFO15)){     // 21MHz
    Flg_Over = 0;
    tbfo = "CW ";
    bfo = CW;
  }
  else if((vfo >= MI_VFO15) && (vfo <= HI_VFO15)){
    Flg_Over = 0;
    tbfo = "USB";
    bfo = USB;
  }

  else if((vfo >= LW_VFO10) && (vfo < MI_VFO10)){     // 28MHz
    Flg_Over = 0;
    tbfo = "CW ";
    bfo = CW;
  }
  else if((vfo >= MI_VFO10) && (vfo <= HI_VFO10)){
    Flg_Over = 0;
    tbfo = "USB";
    bfo = USB;
  }

  else if (Vfo_Dat < 10000000L){
    bfo = LSB;
    tbfo = "LSB";
    Flg_Over = 1;
  }
  else{
    bfo = USB;
    tbfo = "USB";
    Flg_Over = 1;
  }
}

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

void Fnc_Eep_Int(){
  int i;

  for (i=0;i<112;i++)                            // 0 clear(112byte)
    EEPROM.write(i, 0);

  for(i=0;i<Max_Chn;i++){
    Fnc_Eep_Sav4(DEF_FRQ,Frq_Eep+i*4);            // Frequency(7.05MHz)
    Fnc_Eep_Sav4(DEF_STP,Stp_Eep+i*4);            // Step(1kHz)
  }

  EEPROM.write(Eep_Int,Int_End);                  // Init end set(73)
}

//----------  Function EEPROM Read  ---------

void Fnc_Eep_Rd(){
  if((0 <= Byt_Chn) && (Byt_Chn < Max_Chn))
    Vfo_Dat = Fnc_Eep_Lod4(Frq_Eep+Byt_Chn*4);
  else{
    Vfo_Dat = Fnc_Eep_Lod4(Frq_Eep+0*4);
    Byt_Chn = 0;
  }

  if((0 <= Byt_Chn) && (Byt_Chn < Max_Chn))
    Enc_Stp = Fnc_Eep_Lod4(Stp_Eep+Byt_Chn*4);
  else
    Enc_Stp = Fnc_Eep_Lod4(Stp_Eep+0*4);
}

//----------  Function EEPROM Write  ---------

void Fnc_Eep_Wt(byte chn){
  if((0 <= chn) && (chn < Max_Chn)){
    Fnc_Eep_Sav4(Vfo_Dat,Frq_Eep+chn*4);
    Fnc_Eep_Sav4(Enc_Stp,Stp_Eep+chn*4);
  }

  EEPROM.write(Chn_Eep,chn);
}

    







54 件のコメント:

JA2NKD さんのコメント...

始めまして、すばらしいVFOですね。
是非作ってみたいと始めたのですがコンパイラでエラーが出て進みません。
aruduinoIDEは1.6.5です。エラーは、
Si5351 si5351;
の部分で、内容は以下のようです。
GQPVFO:100: error: 'Si5351' does not name a type
GQPVFO.ino: In function 'void setup()':
GQPVFO:139: error: expected unqualified-id before '.' token
GQPVFO:140: error: expected unqualified-id before '.' token
GQPVFO.ino: In function 'void loop()':
GQPVFO:194: error: expected unqualified-id before '.' token
GQPVFO:196: error: expected unqualified-id before '.' token
GQPVFO:206: error: expected unqualified-id before '.' token
GQPVFO:208: error: expected unqualified-id before '.' token
GQPVFO:210: error: expected unqualified-id before '.' token
'Si5351' does not name a type

IDEのバージョン等問題があるのでしょうか?
何かお気づきの点があればサジェッション願えないでしょうか。


JA2GQP さんのコメント...

IDE1.6.9を使ってますが、1.6.5でも問題なくコンパイル出来ました。
ただ、気になる所は、Si5351 si5351の行98なので、それ以前の行を変更修正してませんか?単純なミスだと思います。

JA2NKD さんのコメント...

早々有難うございます。
特に変更はしていません。
どうもライブラリーがうまく合致していないようで、再度貴記載のものを入れなおしてみます。
Rotaryライブラリーは、Rotaly.LIB.zipですね。これはrenameの必要がありますでしょうか?

JA2NKD さんのコメント...

Rotaly.LIBの中のRotalyでOKでした。
必要なライブラリーを提示されているものに入れ替えたらコンパイルできました。
お騒がせしました。どうも似て非なるライブラリーが存在するようです。
有難うございました。

JA2GQP さんのコメント...

ライブラリは、曲者です。同じ名前で大文字/小文字と異なる物が存在してますから・・・

Alex, US5EVD さんのコメント...

Very interesting design!
Your article helped me a lot in the creation of their WEF with si5153.

Alex, US5EVD さんのコメント...

correction VFO with si5351

Unknown さんのコメント...

Good day, dear Akio Mizuno. I need to modify the sketch on si5351, enter your adjusting of intermediate frequency and 27 MHz reference frequency. Send me an email at my rw9hsf@yandex.ru, I'll post a sketch for refinement. Thank you.

JA2GQP さんのコメント...

What is the IF frequency?

Unknown さんのコメント...

Уважаемый rw9hsf частота кварца 27 мгц меняется в сроке.
si5351.init(SI5351_CRYSTAL_LOAD_10PF, 27038010); //Если у вас 27Mhz кристал, если 25 то должен стоять 0 вместо 27038010// 0 is the default crystal frequency of 25Mhz.

JA2GQP さんのコメント...

27MHzオシレータを使の時、一般的に次の様に書きます。
si5351.init(SI5351_CRYSTAL_LOAD_8PF, 27000000);
発振周波数のキャリブレーション方法は、スケッチの例のEtherkitSi5351にあるsi5351calibrationを使えば、補正周波数を得られます。補正値をスケッチに組込む方法も書いて有るので、よく読んでください。
周波数安定性は、水晶発振子の負荷容量との関連も有ります。

Unknown さんのコメント...

Hi Akio!
It's sketh for Arduino Mega ?
Volume sketh 38 212 bite ?

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

Hi.
This sketch works with the nano.
Using the Arduino IDE 61.6.12 is 19,784 byte.
Mega sketch is needed?

Unknown さんのコメント...

Hi Akio!
In this time I have Ardouno IDE 1.6.12
All sketh from examples Si5351Arduino compilate in my computer. No problem.
I have problem ih your sketh. Mistake



C:\Users\Алексей\Documents\Arduino\si5351_VFO\si5351_VFO.ino: In function 'void Fnc_Rit()':

si5351_VFO:398: error: 'Fnc_Eep_Wt' was not declared in this scope

C:\Users\Алексей\Documents\Arduino\si5351_VFO\si5351_VFO.ino: In function 'void Fnc_Chsw()':

si5351_VFO:424: error: 'Fnc_Eep_Int' was not declared in this scope

si5351_VFO:427: error: 'Fnc_Eep_Rd' was not declared in this scope

Используем библиотеку Rotary в папке: C:\Program Files\Arduino\libraries\Rotary (legacy)
Используем библиотеку Si5351Arduino-master версии 2.0.1 из папки: C:\Program Files\Arduino\libraries\Si5351Arduino-master
Используем библиотеку Wire версии 1.0 из папки: C:\Program Files\Arduino\hardware\arduino\avr\libraries\Wire
Используем библиотеку LCD5110_Basic в папке: C:\Users\Алексей\Documents\Arduino\libraries\LCD5110_Basic (legacy)
Используем библиотеку EEPROM версии 2.0 из папки: C:\Program Files\Arduino\hardware\arduino\avr\libraries\EEPROM
exit status 1
no matching function for call to 'Si5351::init(int, int)'

Unknown さんのコメント...

Your
void setup(){
si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0); //initialize the Si5351
No worked si5351_VFO:136: error: no matching function for call to 'Si5351::init(int, int)'

This works
si5351.init(SI5351_CRYSTAL_LOAD_8PF,0,0); //initialize the Si5351

and second problem

// si5351.set_freq(((Vfo_Dat+IF+Rit_Dat) * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK0);

// si5351.set_freq(((Vfo_Dat+IF) * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK0);

// si5351.set_freq(( bfo* SI5351_FREQ_MULT), 0, SI5351_CLK2);

no matching function for call to 'Si5351::set_freq(long long unsigned int, int, si5351_clock)'

JA2GQP さんのコメント...

Rotary encoder library is rotary.h.
http://www.buxtronix.NET/2011/10/rotary-encoders-done-properly.html

Not in the Rotary.h. Do not use the Rotary.h?

yo2ldk さんのコメント...

Hi Akio,

Very useful project !
can I use your ino file, but I need to see on display the frequency divide by 4, from the clock output; where or how can I adjust that?
Thank you in advance !

JA2GQP さんのコメント...

Hi.
It is a method to make the frequency display 1/4.
Fix have the Fnc_Lcd() and Fnc_Chsw().
Fnc_Dsp(Vfo_Dat) from Fnc_Dsp(Vfo_Dat/4).

yo2ldk さんのコメント...

Thank you !

yo2ldk さんのコメント...

if you use it google translate, change the capital letters with little one
Unsigned = unsigned

JA2GQP さんのコメント...

Hi.
Using, Web site sketch.
https://sites.google.com/site/ja2gqp/

Unknown さんのコメント...

Hi, Akio. Can remake your sketch for ad9835 instead of si5351? And please put here. Memory ranges do better consistently entry through 5 seconds. Yours faithfully Alexander.

Unknown さんのコメント...

Hi, Akio. Can remake your sketch for ad9834 instead of si5351? And please put here. Memory ranges do better consistently entry through 5 seconds. Yours faithfully Alexander.

Unknown さんのコメント...

Crystal oscillator 75 megahertz for ad9834, ad9835-typo! And make adjustments to the intermediate frequency into memory.

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

OM様

はじめまして。

OM様
いつも楽しくブログを拝見させていただいております。
早速、VFOを組み立てようとしたところ、rotary.hのライブラリの不都合により、コンパイルできません。
スケッチ内に指示してあるURLをクリックして、HPにいきましたが、ダウンロードできず、困っています。
お手数おかけいたしますが、ライブラリをダウンロードできる、URLを教えていただけないでしょうか。
どうぞ宜しくお願いします。

JA2GQP さんのコメント...

rotary.hは、https://sites.google.com/site/ja2gqp/からダウンロードすることが出来ます。
Arduino AD9850 DDSフォルダのRotaryLib.zipをダウンロードしてください。

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

OM様

早々のご返信ありがとうございました。
ご指定のライブラリの使用及び、スケッチの修正にて無事に動作いたしました。ありがとうございました。これからもすばらしい作品を製作されてください。楽しみにしています。

Unknown さんのコメント...

Dear Akio,

I use this sketch for my 3-band CW QRP RIG.
It works fine. Thank you, Akio.

Only problem is with RIT.
When RIT is ON and I'm keying Tx low, the frequency is not set fast enough to Tx frequency.
There is about 100 milisecond delay and this sound like a chirp.
Did you test this with morse keyer?

Have you any idea to solve this problem?

GL es 73 from Alex - S53OM

JA2GQP さんのコメント...

Hi Alex.
Because it is made of 2 channels with si5351a, the problem pointed out occurs when the transmission frequency and reception frequency are different. However, it should not be a problem if sending / receiving switching cycle like ssb is long. To solve the problem, I think that it is necessary to output 3 channels and output the transmission and reception to other terminals. Just I do not plan to fix sketches.

emercito さんのコメント...

Hi Akio Mizuno. I am looking for a vfo like on this vídeo:

https://www.youtube.com/watch?v=XlEouO-2E3s&t=57s

This guy is here in Brazil and his fvo in not his Project. He has gotten this vfo program from someone which he refuses to tell-me. Anyway could you help me where can I find this vfo with these features as seen on this vídeo? thanks

JA2GQP さんのコメント...

Hi emercito.
I think VFO of video is done well. My VFO emphasizes basic functions. I am hoping that many people will make their own VFOs because they are exposing sketches.

wolohow4 さんのコメント...

how to receive a reverse strip of USB on 14 MHz? It is necessary at the exit the frequency of 5132 kHz instead of 22868 with an intermediate frequency of 8868 kHz?

wolohow4 さんのコメント...

how to receive a reverse strip of USB on 14 MHz? It is necessary at the exit the frequency of 5132 kHz instead of 22868 kHz with an intermediate frequency of 8868 kHz?

wolohow4 さんのコメント...

as an example, insert into the sketch and edit. Thanks

#ifdef IF_Offset
si5351.set_freq((vfo * SI5351_FREQ_MULT) + bfo, SI5351_CLK0);
// Вы также можете вычесть BFO, чтобы удовлетворить ваши потребности
//si5351.set_freq((vfo * SI5351_FREQ_MULT) - bfo , SI5351_PLL_FIXED, SI5351_CLK0);


if (vfo >= 10000000ULL & tbfo != "USB")
{
bfo = USB;
tbfo = "USB";
si5351.set_freq( bfo, SI5351_CLK2);
Serial.println("We'v e switched from LSB to USB");
}
else if (vfo < 10000000ULL & tbfo != "LSB")
{
bfo = LSB;
tbfo = "LSB";
si5351.set_freq( bfo, SI5351_CLK2);
Serial.println("We'v e switched from USB to LSB");
}


#endif

JA2GQP さんのコメント...

In the case of SSB, you just set the carrier point for USB or LSB. I do not know how you want to remodel, but the frequency relationship just sets the appropriate value for my circuit. Although it is thing with lower heterodyne, since it is generally disadvantageous to spurious, it is better to use upper heterodyne. My VFO is designed with upper heterodyne.

Guy - F4GMS さんのコメント...

Thank you for your work. Do you think that it is possible to adapt your sketch, with an Oled SPI, that would be interesting.
Thank you
Sorry for the mistake.

JA2GQP さんのコメント...

Hi Guy.
Sketch remodeling is easy. I do not customize. I'm sorry.

Guy - F4GMS さんのコメント...

no problems thank's
All the best

JA2GQP さんのコメント...

OK. I commented because there are many people who want to customize.

Guy - F4GMS さんのコメント...

yes! Amazing.
73,s

MaciejL さんのコメント...

Hello Buddy Akio Mizuno!
I've been trying to compile this sketch for a week now. I am using Arduino IDE 1.8.19. I downloaded the required libraries line - 20, 21, 22. In your sketch. Unfortunately, despite repeated attempts and hours, it failed to compile.
The bugs list is too long for me to post here. Many of your projects have a "src" folder with all the required libraries in it… it's a pity they aren't in this project. Dear friend, could I ask you for a working sketch + required libraries. The bugs that the IDE showed ... there is probably a problem with the sketch as well. I made a PCB according to the attached drawing, I am waiting for the Nokia5110 display I ordered, but I cannot cope with the compilation.
Kind regards
Maciek sp9wfh

JA2GQP さんのコメント...

sp9wfh OM
The LCD5110_Basic library is designed to support various CPUs. Therefore, it is not suitable for saving to the src folder. Please register in the library and use it.

Moved rotaly.h and si5351.h to the src folder. si5351VFO.zip has been updated. Please use this.

JA2GQP さんのコメント...

sp9wfh OM
I modified it to work in the src folder.

MaciejL さんのコメント...

Hello again Akio Mizuno!
You are Great!
Thank you very much for helping me get this project started.
Now it compiles on my Arduino IDE. We were also able to upload to Nano V3.
To check everything thoroughly, I need to connect the Nokia5110 display.
So I am waiting for a shipment from the store for this ordered display.
Kind regards
Maciek sp9wfh

Bob さんのコメント...

Please be so kind as to advise where to change the VFO-IF for 20 metres in your 10 band VFO, with Nokia5110 display.
In spite of wolohow4's explanation of his sketch, which I cannot get to work.
For the radio I am using, I need VFO-IF frequency.
I understand your explanation as well.

I look forward to your modified sketch, please.

ZS6RZ

JA2GQP さんのコメント...

Rewrite lines 107 through 111.

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

volatile long LSB = 10701500L; // 10.7015MHz
volatile long USB = 10698500L; // 10.6985MHz
volatile long CW = 10700600L; // 10.7006MHz
volatile long bfo = 10701500L; // start in LSB
volatile long IF = 10700000L; // 10.7000MHz

The sample has an IF frequency of 10.7MHz.
The LSB frequency is IF+1500, so it is 10701500L.
The USB frequency is IF-1500, so it is 10698500L.
The CW frequency is IF+600, so it is 10700600L. Just adjust it according to your tone frequency preference, but generally IF +700 is preferred.
Therefore, the CW frequency is IF+700, which is 10700700L.
The bfo frequency sets the LSB frequency as the initial value. bfo 10701500L.
IF frequency specifies the center frequency of the filter. The sample is 10.7MHz, so the IF is 10700000L.

Bob さんのコメント...

Many thanks for your kind help!

Bob さんのコメント...

Maybe I did not explain correctly.

VFO output for 14.00mHz LSB = 3.3015mHz
VFO output for 7.00mHz LSB = 17.7015mHz
VFO output for 3.50mHz LSB = 14.2015mHz

Thamk you I look forward to your response.

JA2GQP さんのコメント...

Your question is completely different from the original.
You're trying to get me to sketch and modify your custom specs.
I answered in an easy-to-understand manner, but I will not answer any further questions.

Bob さんのコメント...

Sorry to have bothered you, with another question, my apologies.

Bob さんのコメント...

Good day to U, Have made your VFO LCD5110 - only 3 bands, works very well, have set the DEF_FRQ = 7100000L, but it always defaults to 3556000 ............Cannot find problem, HELP PLEASE! ZS6RZ

JA2GQP さんのコメント...

si5351VFO.zip The sketch dated 7/26/2023 reflects DEF when EEPROM is initialized. EEPROM initialization modifies the following lines:
const byte Int_End = 73; // Initial end code
Any other value for 73 initializes the EEPROM.

Also, EEPROM writing is manual writing by RIT SW operation.