Tuesday, January 8, 2019

STM32F103C VFO Synthesizer with si5351

coba review rangkaian VFO Synthesizer Si5351 berbasiskan MCU STM32F103C, hasil-nya lumayan memuaskan, flexible dan eye catching, special thanks unt. JA2GQP dan link download-nya di :
https://sites.google.com/site/ja2gqp/
semoga selalu bisa menginspirasi insan Amatir Radio Dunia.


berikut untuk Video Review-nya :


terima kasih, selamat bereksperimen.





Tuesday, January 1, 2019

DIY 40m QRP SDR Transceiver by YD3RDW



berawal ingin tahu konsep dasar dari SDR yang saya dapatkan dari ARRL Radio Handbook 2017 yang berbasiskan Tayloe Detector atau yang dikenal dengan istilah Quadrature Sampling Detector.




gambar diatas untuk memudahkan illustrasi terhadap cara kerja, installasi dan proses debug apabila ada problem terhadap proses perakitan nanti-nya.

bagaimana cara penggunaan-nya?, persiapan apa saja yang dibutuhkan? hal ini dikarenakan SDR Transceiver tidak bisa stand alone turn ON seperti BITX atau Radio Transceiver yang konvensional, dibutuhkan perangkat pembantu baik itu hardware maupun software supaya SDR Transceiver dapat berfungsi sesuai yang kita kehendaki, dibawah adalah illustrasi untuk pemasangan dan perangkat penunjang yang dibutuhkan.



Hardware yang dibutuhkan :
1. Main Unit SDR Transceiver.
2. Microphone beserta preamp mic-nya
3. Headphone atau Stereo Amplifier mini
4. PC atau Laptop dengan Sound Card HD Quality
5. Serial Port unt. control PTT, bisa langsung menggunakan COM Port(pada PC) atau USB to Serial TTL untuk laptop yang tidak memiliki onboard serial port.
6. Antenna sesuai dengan frekwensi kerja yang kita inginkan(40m band, 80m band, atau multiband Antenna)

Software yang dibutuhkan :
1. Genesis SDR/Power SDR/HDSDR yang kita rasa cocok dengan kita.
2. software tambahan : microsoft .net, ASIO4ALL v2

detail PCB dan Skema saya dapatkan dari YB3LVX, Yoke Kurnia dari Malang.


Step by Step prosel soldering bisa per modul atau bahkan di solder semuanya secara bersamaan.



Bagaimana bentuk-nya sesudah jadi ?


Port Interface-nya lumayan banyak, apa saja interkoneksi-nya :
1. to Line Out atau speaker out port dari PC atau Laptop
2. to Mic Port dari PC atau Laptop
3. to Preamp Microphone yang tentunya terhubung dengan microphone.
4. to Headphone atau Speaker Active External
5. PTT Switch
6. Antenna Port


Dalam merakit SDR Transceiver ada hal yang musti kita perhatikan diantaranya :
1. SDR Transceiver membutuhkan presisi yang tinggi dalam pengolahan signal audio secara hifi, jadi teringat waktu masa muda membuat rangkaian amplifier dan subwofer dengan high quality.
2. semua komponen khusus-nya pada modul pengolahan signal digital-nya wajib menggunakan resistor metal film dengan toleransi 1%, dan kapasitor minimal sejenis plastik film MKM.
3. hampir semua komponen bisa kita dapatkan dengan mudah baik secara online maupun belanja langsung di toko elektronika(pasar genteng surabaya tentunya bagi saya).

Setelah semua komponen terpasang, saat-nya untuk melakukan testing, kita persiapkan PC atau Laptop yang dedicated untuk melakukan testing ini, seperti yang diawal saya sebutkan sebelumnya, dibutuhkan PC dengan kualitas sound card HD Quality. 

Hal yang perlu diperhatikan adalah atur tegangan bias pada Gate IRFZ24 pada tegangan awal 1.2v, bila perlu pasang FUSE pada VCC supply, hal ini dibutuhkan karena apabila Mosfet IRF tersebut rusak akan short pada semua pin-nya, mengakibatkan short juga pada PSU kita.

Dalam hal ini saya menggunakan PC Ultra Slim Lenovo M58P yang menggunakan onboard sound card modul dari Chipset Q45-nya dengan driver audio Soundmax Analog Device HD Quality, sound card yang mumpuni dengan sampling rate yang tinggi(minimal 48k, ideal di 96k) akan meningkatkan span frekwensi response dari RX dan TX dari SDR Transceiver kita.


dengan menggunakan Spec :
Processor Core 2 Quad Q9550 
RAM 4GB(dual channel 2x 2GB)
HDD 160GB 7200RPM
Onboard VGA dan Sound Card.

untuk soundcard apabila setelah dicoba kurang memuaskan, bisa menggunakan soundcard external yang USB, bisa dari product Asus Xonar maupun Creative Sound Blaster.

jack audio yang berwarna jambon - terhubung to line in pada SDR, jack audio yang berwarna lembayung - terhubung to line out pada SDR, JANGAN sampai TERBALIK.

Dengan kualitas SC yang bagus, kita bisa menggunakan sampling rate 96k sehingga kita bisa memperoleh span frekwensi response RX dan TX mulai dari 7010 sampai dengan 7100 pada 40m band, hanya dengan menggunakan 1 Xtal Lokal Oscillator saja .... keren bukan SDR Transceiver-nya?

untuk persiapan software yang akan diinstal dapat di download pada link dibawah ini :
http://www.genesisradio.com.au/GSDR/new/

cukup diambil yang GSDR_install.zip dan latest update, dengan langkah-langkah sebagai berikut :
1. Siapkan folder yang terpisah C:\GSDR
2. mekarkan zip files pada folder tersebut, sehingga didapat C:\GSDR\GSDR_install\
3. unzip files update dan masukkan ke dalam folder point 2, copy replace saja jika ada yg sama.
4. buat shortcut GSDR ke desktop ... JANGAN dijalankan dulu.
5. install ASIO4ALL sebagai sound emulator untuk mengatasi delay atau latency pada soundcard exisiting, dengan ASIO4ALL akan lebih meningkatkan span frekwensi response dari sound card kita, bisa di download di http://www.asio4all.org/
6. setelah dilakukan installasi jalankan GSDR pada shortcut desktop kita, tunggu beberapa detik sampai proses inisialisasi port sukses.
7. ikuti step by step WIZARD installasi, untuk hardware bisa dipilih G40 dan soundcard UNSUPPORT CARD.
8. sambungkan serial port pada SDR dengan serial port pada PC, jika menggunakan laptop yang kebanyakan tidak ada serial port-nya bisa menggunakan Aten USB to Serial Port ataupun merk BAFO dll.


Dikarenakan pada PC saya sudah ada com port, maka hanya memasang kabel DB9 extender saja, yang saya buat sendiri dengan soldering pin STRAIGHT CABLE(match pin to pin), pin yang dibutuhkan unt. disolder adalah pin 2,3,4,5,6,7,8 bisa digunakan untuk serial komunikasi yang lainnya.

setelah execute GSDR ada beberapa setting yang musti kita lakukan antara lain :
1. setting Local Oscillator pada Frekwensi 7,560450MHz pada 40m band dengan Xtal terpasang 28.224MHz.
2. Pada tab AUDIO - SOUND CARD bisa menggunakan ASIO4ALL seperti capture dibawah


3. Pada tab GENERAL - GENESIS CONFIG aktifkan COM Port sesuai COM yang aktif pada System Device kita.


Setting Port ini kita butuhkan sebagai trigger PTT switch dari external sehingga dapat sinkron dengan software yang kita jalankan, setiap PTT kita tekan maka tombol MOX akan pada software akan aktif.

untuk mengetahui COM aktif pada device USB to SERIAL bisa dilihat pada Windows CONTROL PANEL - DEVICE MANAGER dan PORT(COM&LPT).


4. Setelah setting SOUND CARD dan COM Port kita lakukan, saat-nya kita TURN ON software GENESIS kita dengan menekan tombol STANDBY pada kiri atas, sehingga menjadi ON.

dari sini kita sudah bisa mendengarkan suara NGOWOS pertanda RX pada SDR transceiver sudah aktif, tinggal dilakukan tuning pada BPF dan VR-nya dan juga tegangan bias pada gate IRFZ24 untuk meningkatkan power output dari SDR.

Untuk memperoleh tampilan yang cantik, bisa dilakukan tuning pada tab GENERAL - HARDWARE CONFIG seperti dibawah :



untuk tuning mandatory dibutuhkan perangkat pendamping ex: hf rig ataupun BITX untuk mengamati kualitas audio outputnya dan juga SWR untuk monitoring watt output maupun reflected-nya.



gambar dibawah adalah perangkat SDR Transceiver yang sudah terpasang, ada beberapa modul yang saya pasang terpisah dari board utama untuk memudahkan monitoring signal dengan test probe.


saya tambahkan pre amp mic 1TR sebagai penguat mic sebelum masuk ke mic port pada board SDR Transceiver, juga fuse box sebagai pengaman apabila terjadi keruskan pada TR Final Mosfet IRFZ24. 




B E R S A M B U N G




Friday, November 2, 2018

Testing VFO si5351 karya Adiba Onaga by YD3RDW


Terima Kasih kepada Adiba Onaga yang memberikan kesempatan untuk mengulas product-nya secara detail, pertama unpacking langsung coba rakit sesuai dengan petunjuk hasil konsultasi vai Chat WA.

Isi Paket VFO si5351 Adiba

  1. Board VFO si5351 sudah termasuk : LCD Display, Atmega 328 dan si5351 tersolder dalam PCB berwarna hijau double side yang lumayan tebal.
  2. Rotary encoder lengkap dengan kabel dan connector(knop dalam gambar tidak termasuk).
  3. Beberapa pigtail(kabel include connector) untuk : Supply VCC, Signal input, LO+BFO Output, dan Band Selector.


Diatas adalah penampakan perangkat setelah dirakit sudah termasuk dengan text yang ingin kita tampilkan sebagai identitas perangkat kita, contoh adalah YD3RDW yang merupakan callsign dari penulis.

Wiring Diagram VFO si5351 Adiba 


Ada beberapa hal yang harus dipersiapkan sebelum turn on perangkat diatas :
  1. DC Power Supply 8V dari regulator 7808 merupakan pilihan yang tepat sebagai supply.
  2. VCC.  Switch external SW2 dan SW3 sesuai kebutuhan(optional)
  3.  External Relay trigger untuk band selector para perangkat radio amatir kita. 

    Mounting test VFO si5351 


Fitur si5351


YD3RDW adalah text yang dapat dipesan oleh pengguna manakala order VFO si5361

Multiband Selector, 40m adalah band info yang menginformasikan panjang gelombang dari Frekwensi yang tampil pada display.

SSB, AM dan RF Signal Generator adalah mode yang digunakan pada VFO si5351, bisa kita select dengan menekan Switch Rotary Dial agak lama, akan muncul optional USB, LSB, AM dan Gen(untuk signal generator)

DUAL VFO pada VFO si5351 diatas bisa menggunakan VFO A dan VFO B untuk memudahkan kita pindah-pindah band

If Offset untuk merubah frekwensi output dari LO adalah penjumlahan atau pengurangan terhadap VFO, kita gunakan + biar lebih mudahnya.

Bentuk Gelombang dari Si5351 

Sinyal VFO atau LO pada board jika dibaca dengan Oscilloscope, ini adalah karakteristik signal output dari si5351.


dan jika diperbesar 


Variable adjust yang lainnya 

Setting Frekwensi dari Kristal Filter 

Cara setting Frekwensi Kristal Filter atau IF Filter pada tampilan VFO ini adalah dengan turn off modul, tekan tombol Switch pada rotary encoder bersamaan dengan turn on modul si5351, maka akan muncul tampilan dibawah ini, cara setting Freq IF dengan menggerakkan arah cursor tekan tombol rotary encoder sesuai digit yang akan kita pindah dan putar rotary encoder.
Angka 1 bisa diganti ke angka 0 dengan menekan SW3, 1 adalah untuk Freq BFO ON dan 0 untuk Freq BFO OFF


Setting selisih SSB dari Frekwensi Kristal Filter untuk USB dan LSB

Selisih Frekwensi Kristal Filter dalam modul VFO ini istilahnya adalah bandwidth, dapat diaktifkan dengan menekan SW2 bersamaan diikuti dengan tombol rotary, tampilannya seperti dibawah ini :


 Standard adalah 150 menandakan 1500Hz untuk selisih SSB dari Frekwensi Center Kristal Filter.

Band Selector

Band Selector berguna sebagai signalling secara otomatis terhadap BPF dan LPF, VFO si5351 Adiba didesign sudah support HF Allband mulai dari 80m sampai dengan 11m, fitur ini dilengkapi sampai dengan 5 band yang dapat kita setting mengukuti kemampuan dari LPF RF Power Amplifier yang akan digunakan.


Memory

Fitur memory adalah untuk record Frekwensi yang kita inginkan : 
  1. pada Frekwensi tune-in
  2. kita tekan tombol rotary+SW2 secara bersamaan sampai muncul tanda panah
  3. lepas kedua tombol yang kita tekan bersamaan tadi, kita geser rotary untuk saving frekwensi tune-in pada nomor memory-nya,
  4. tekan tombol rotary 1x untuk saving pada nomor memory yang sudah kita pilih,
  5. ulangi langkah 1 jika kita ingin menyimpan Frekwensi pada nomor memory yang lainnya.

Untuk memasuki mode momory tekan SW2 agak lama, putar rotary dial untuk memilih nomor memory yang diinginkan.

KESIMPULAN

setelah mencoba dengan beberapa alat instrumentasi yang saya punyai untuk VFO si5351 karya Adiba Onaga menurut saya pribadi bisa dipakai teman-teman untuk menggantikan VFO konventional atau sebagai VFO Perangkat Homebrew yang sudah kita buat jadi statusnya VFO si5351 karya Adiba Onaga adalah TESTED OK. 

untuk memperoleh barang tersebut dapat kontak langsung di https://www.facebook.com/adiba.onaga



Friday, October 12, 2018

Automatic Band Selector Yaesu FT-180A

Automatic Band selector memudahkan kita apabila bergeser Frekwensi dari VFO si5351 maka Coil BPF dan LPF akan mengikuti sesuai dengan Frekwensi kerja-nya, sehingga dapat menghindari kerusakan pada bagian RF power amplifier perangkat.


skema rangkaian seperti diatas, peletakan komponen pada PCB Lubang IC, ukuran PCB menggantikan PCB CONNECTOR UNIT pada Yaesu FT-180A


PCB Connector Unit yang sudah dilepas bersamaan dengan Selector Switch digantikan dengan PCB yang baru.


nampak komponen yang digusur : PCB Connector Unit dan Rotary Switch



 Penampakan Automatic Band Selector setelah terpasang pada main unit.

Live demo pada youtube


Monday, October 1, 2018

Digimode(Digital Mode) pada BITX

Akhir-nya punya kesempatan untuk mencoba Digimode pada BITX setelah browsing-broswing mencari literatur untuk membuat interface digital mode pada perangkat jadul, skema yang saya buat sebagai-berikut :

sumber gambar berasal dari www.cqrlog.com

saya rangkai berdasarkan kebutuhan saja(tidak semuanya kita rakit), saat ini masih RX modul saja. Tetapi untuk TX mode semuanya sudah saya persiapkan tinggal menunggu IAR(Ijin Amateur Radio) muncul saja.



Modul Optocoupler untuk trigger PTT bisa mempergunakan yang sudah jadi di markt online, relay module 1 channel.



komponen yang digunakan hanya Trafo Impedansi 600 Ohm, bisa menggunakan bekas trafo IT191 atau trafo audio 1:1, beserta R 1K2 dan Potensio(trimpot) 10KOhm, untuk Software pada PC yang digunakan adalah WSJT-X v1.9.1 atau download yang terbaru dan jangan lupa Software nettime untuk sinkronisasi waktu dengan server NTP yang sudah disediakan.


attach adalah gambar interkoneksi BITX, Digimode Interface dan Interkoneksi dengan Port Mic pada PC.

Hal yang harus diperhatikan pada saat pertama kali install dan tuning Digimode pada BITX adalah :
1. install aplikasi WSJT-X
2. install nettime dan lakukan synchronize waktu antara PC kita dengan server
3. setting Freq pada BITX di 7.074MHz dan mode USB, karena default Si5351 adalah pada LSB untuk 40m saya lakukan sedikit tuning pada Freq BFO agar bisa masuk ke USB.
4. interkoneksi speaker out masuk ke rangkaian Digimode(trafo impedance 1:1) dan pada sisi sebelah dari trafo kita connect ke mic in pada PC(untuk mode RX yang saya buat, yang lain menyusul)
5. running WSJT-X .... text decode akan muncul semua-nya


berikut adalah penampilan dari komunikasi Digital Mode pada radio HF dengan mode FT8, tidak hanya komunikasi ORARI lokal saja yang dapat kita monitor dari sesama amateur radio internasional pun bisa kita monitor.


6. SELAMAT MENCOBA, semoga BERHASIL.

Saturday, September 22, 2018

Homebrew HF Antenna Tuner

HF Antenna tuner dibutuhkan oleh Amateur Radio supaya bisa berkomunikasi pada rentang frekwensi yang luas, jika tanpa Antenna Tuner tentunya rentang SWR aman untuk Radio Pemancar kita akan sempit, acuan untuk HF Antenna Tuner seperti dibawah ini, tetapi prakteknya tidak sama secara keseluruhan, hanya dibutuhkan sesuai dengan band frekwensi kerja yang kita inginkan saja.

bentuk fisik antenna tanpa L Tap Selector


nampak lilitan yang didalam-nya, dari kawat email 1.2 - 1.5mm dengan diameter 1 dim(2.5cm).


bisa kita gunakan pipa PVC diameter 1 dim untuk guidance membuat lilitan-nya.


nampak nilai induktansi dari lilitan, untuk mengurangi dan menambahkan nilai induktansi bisa dengan cara : memperlebar jaraj antar lilitan(mengurangi nilai induktansi) atau menambah lilitan(menambahkan nilai induktansi)


capacitor variable(Varco) 500pf


Spesifikasi : 
Freq kerja 6.990 MHz - 7150 MHz 
nilai SWR < 1: 1.5

Edisi revisi saya tambahakan Coil Selector untuk mendapatkan SWR mendekati ideal 1 : 1.1







Notes :
harap menggunakan SWR dengan jarum deleksi silang yang terkalibrasi dengan benar, untuk memudahkan tuning Varco menuju nilai SWR yang ideal.



SELAMAT MENCOBA .... SUKSES SELALU.

Friday, September 14, 2018

Modifikasi Yaesu FT 180A dengan DDS VFO Si5351

Setelah iseng2 cari sana-sini selama kurang lebih 3-6 bulan, menemukan bakalan Yaesu FT 180A yang masih orisinil, berisi hanya 1 channel saja. Ngoprek dimulai dengan melepas Kristal Osilator bawaan pabrikan.


setelah prototype diatas dapat bekerja dengan sempurna saat-nya unt. memasukkan prototype ke dalam box FT 180 sehingga dapat fitting sempurna dengan tanpa merusak secara masif existing komponen maupun casing yang sudah ada(kesan vintage-nya masih ada).

berikut adalah modul si5351 yang dimasukkan ke dalam kotak oscillator, gunanya untuk meminimalkan interferensi terhadap output DDS si5351 dan sekaligus menjaga kestabilan output-nya.


bagian dari OLED Display, Rotary Encoder termounting pada PCB Lubang IC - Single Layer dan sekaligus Arduino Mini Pro beserta regulator DC 5v dan 3.3V tersolder permanen pada modul tersebut.


nampak warna merah-orange adalah LED indikator dari DC Regulator Modul dan Arduino Mini Pro Modul, terpadang pada panel sisi kiri dari FT 180A.


diatas adalah penampakan OLED Display yang terpasang mengisi space dari papan angka FT 180A yang sebelum-nya, lampu DC 12V existing dilepas beserta soft light cover-nya. Band Selector LPF dilepas dari mounting-nya (selector otomatis akan di desain selanjut-nya).

Bagaimana dengan Rangkaian DDS VFO menggunakan modul Si5351?, dibawah ini adalah rangkaian simple-nya, semua dapat dibeli modul-modul-nya secara terpisah di toko online tanpa melakukan solder mensolder secara njelimet. Kita bisa menggunakan Arduino Nano dengan kelebihan sudah ada serial TTL dan tersedia DC 3.3V beserta 5V, sedangkan kekurangan-nya adalah bentuknya yang cukup besar sehingga untuk masuk kedalam box FT180 akan mengalami kendala extra.


dibawah adalah rangkaian prototype yang saya buat menggunakan Arduino Pro Mini sehingga ukuran-nya yang kecil membuat lebih mudah untuk melakukan casing-isasi terhadap rangkaian yang sudah kita buat sebelum-nya.



nampak ukuran board yang kecil, kekurangan-nya adalah kita musti menyediakan regulator tambahan DC5V(tetapi hal ini tidak kita butuhkan apabila kita pesan Arduino Pro Mini 3.3V) dan DC 3.3V untuk mensuplay DC pada Rotary Encoder dan modul si5351 dan juga kita membutuhkan serial TTL untuk melakukan upload sketch ke dalam arduino pro mini tersebut.

alat pemrograman tersebut dapat digunakan universal terhada semua perangkat digital untuk keperluan update firmware, upload sketch pada arduino, serial debugging, dll.

setelah lengkap hardware yang kita pasang saat-nya untuk upload sketch pada arduino tersebut, berikut adalah sketch dalam format arduino-nya :

#include
#include  
#include
#include
#include
#include
#include

/**************************************************************************
*  Definitions
**************************************************************************/
#define ENCODER_A     2       // Encoder pin A INT0/PCINT18 D2
#define ENCODER_B     3       // Encoder pin B INT1/PCINT19 D3
#define ENCODER_BTN   4       // Encoder pushbutton D4
#define OLED_RESET    13       // OLED reset
#define Calibrbtn     5       // Calibrate
#define RIT_Switch    6       // RIT Switch
#define TX_Switch     7       // Select TRx or BFO

#define F_MIN        1000000UL        // Lower frequency limit
#define F_MAX        300000000UL      // Upper frequency limit

/**************************************************************************
*  EEPROM data locations 
**************************************************************************/
#define EE_SAVED_RADIX  0   // Stepsize pointer
#define EE_SAVED_AFREQ  4   // Actual Tx Frequency (CLK0)
#define EE_SAVED_BFREQ  8   // BFO (IF) Frequency  (CLK2)
#define EE_SAVED_XFREQ  12  // X-tal frequency  (25 or 27 MHz)
#define EE_SAVED_OFSET  16  // store correction
#define EE_SAVED_CALBR  20  // calibrated indicator

Adafruit_SSD1306 display(OLED_RESET);
Si5351 si5351;
Rotary r = Rotary(ENCODER_A, ENCODER_B);
const int sampleWindow = 50;                              // Sample window width in mS (50 mS = 20Hz)
unsigned int sample;

/**************************************************************************
*  Declarations
**************************************************************************/
volatile uint32_t bfo_f = 900000000ULL / SI5351_FREQ_MULT;    // CLK0 start IF
volatile uint32_t vfo_t = 1420000000ULL / SI5351_FREQ_MULT;   // CLK2 start Tx freq
volatile uint32_t vfo_r = vfo_t - bfo_f;                      // CLK1 start Rx freq
volatile uint32_t vfo_s = vfo_t;                              // Saved for RIT
uint32_t vco_c = 0;                                           // X-tal correction factor
uint32_t xt_freq;
long radix = 100L, old_radix = 100L;                          //start step size
boolean changed_f = 0, stepflag = 0, calflag = 0, modeflag = 0, ritset = 0;
boolean calibrate = 0;
byte  act_clk = 0, disp_txt = 0;

/**************************************/
/* Band Swicth  */
/**************************************/
int Band_80m = 12; // 3.5MHz sd 4.5MHz
int Band_40m = 11; // 6.5MHz sd 7.5MHz
int Band_30m = 10; // 11MHz sd 12MHz
int Band_20m = 9; //  14MHz sd 15MHz 
int Band_10m = 8; //  27MHz sd 28MHz 


/**************************************/
/* Interrupt service routine for      */
/* encoder frequency change           */
/**************************************/
ISR(PCINT2_vect) {
  char result = r.process();
  if (result == DIR_CW)
    set_frequency(1);
  else if (result == DIR_CCW)
    set_frequency(-1);
}


/**************************************/
/* Change the frequency               */
/* dir = 1    Increment               */
/* dir = -1   Decrement               */
/**************************************/
void set_frequency(short dir)
{
  switch (act_clk)
  {
    case 0:                 // Tx frequency
      if (dir == 1)
        vfo_t += radix;
      if (dir == -1)
        vfo_t -= radix;
      break;
    case 1:                 // Tx frequency (only if RIT is on)
      if (dir == 1)
        vfo_t += radix;
      if (dir == -1)
        vfo_t -= radix;
      break;
    case 2:                 // BFO frequency
      if (dir == 1)
        bfo_f += radix;
      if (dir == -1)
        bfo_f -= radix;
      break;
  }

  if(vfo_t > F_MAX)
    vfo_t = F_MAX;
  if(vfo_t < F_MIN)
    vfo_t = F_MIN;

  changed_f = 1;
}


/**************************************/
/* Read the buttons with debouncing   */
/**************************************/
boolean get_button()
{
  if (!digitalRead(ENCODER_BTN))            // Stepsize
  {
    delay(20);
    if (!digitalRead(ENCODER_BTN))
    {
      while (!digitalRead(ENCODER_BTN));
      stepflag = 1;      
    }
  }
  else if (!digitalRead(Calibrbtn))         // Calibrate
  {
    delay(20);
    if (!digitalRead(Calibrbtn))
    {
      while (!digitalRead(Calibrbtn));
      calflag = 1;
    }
  }
  else if (!digitalRead(TX_Switch))         // Selection
  {
    delay(20);
    if (!digitalRead(TX_Switch))
    {
      while (!digitalRead(TX_Switch));
      modeflag = 1;
    }
  }  
  if (stepflag | calflag | modeflag) return 1;
  else return 0;
}


/********************************************************************************
 * RIT switch handling
 * Switch to small stepsize (100 Hz)
 *******************************************************************************/
void RIT_switch()                               // Read RIT_switch
{
  if (!digitalRead(RIT_Switch) && ritset == 0){     // RIT on
    act_clk = 1;
    ritset = 1;
    vfo_s = vfo_t;                              // Save Tx freq
    old_radix = radix;                          // Save actual stepsize
    radix = 100;                                // Set stepsize to 100 Hz
  }
  else if (digitalRead(RIT_Switch) && ritset == 1){ // RIT 0ff
    act_clk = 0;                                // RTx mode
    ritset = 0;
    vfo_t = vfo_s;                              // Restore to original vco_t
    radix = old_radix;                          // Back to old stepsize
    disp_txt = 0;                               // Clear line
    
// Update Rx frequency based on the restored Tx frequency    
    if (vfo_t <= bfo_f) vfo_r = vfo_t + bfo_f;  // Upper / lower mixing  
    else vfo_r = vfo_t - bfo_f;   
    si5351.set_freq((vfo_r * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK1);
  }
}

/**************************************/
/* Displays the frequency and stepsize*/
/**************************************/
void display_frequency()
{
  display.setTextSize(2);  
  char LCDstr[12];
  char Mhz[5], Herz[12];
  int p,q;
  unsigned long freq;
  display.clearDisplay();

  switch(act_clk)
  {
    case 0:                               // Tx frequency
      freq = vfo_t;
      break;
    case 1:                               // Tx frequency (Used in RIT Mode)
      freq = vfo_t;
      break;
    case 2:                               // MF frequency
      freq = bfo_f;
      break;
  }
    
  Herz[1]='\0';                           // empty arry

  sprintf(LCDstr, "%ld", freq);           // convert freq to string
  p=strlen(LCDstr);                       // determine length

  strncpy(Mhz,LCDstr,(p-6));              // get MHz digits (1-3)
  q=p-6;
  Mhz[q]='\0';                            // end with null character
  strcpy(Herz,LCDstr);                    // get Herz digits (6)
  strcpy(LCDstr+q,Herz+(q-1));            // copy into LCDstr
  LCDstr[q]='.';                          // decimal point

  display.setCursor(15,20);
  display.println(LCDstr);
  display_settings();
  
}


/**************************************/
/* Displays step, mode and version    */
/**************************************/
void display_settings()

// DISPLAY S-METER
{
   unsigned long startMillis= millis();                   // Start of sample window
   float peakToPeak =    0;                                  // peak-to-peak level
   unsigned int signalMax = 0;                            //minimum value
   unsigned int signalMin = 1023;                         //maximum value

                                                          // collect data for 3000 mS
   while (millis() - startMillis < sampleWindow)
   {
      sample = analogRead(A0);                             //get reading from microphone
      if (sample < 1023)                                  // toss out spurious readings
      {
         if (sample > signalMax)
         {
            signalMax = sample;                           // save just the max levels
         }
         else if (sample < signalMin)
         {
            signalMin = sample;                           // save just the min levels
         }
      }
   }
   peakToPeak = signalMax - signalMin;                    // max - min = peak-peak amplitude
   float db = map(peakToPeak,80 ,1030,50,  550 );             //calibrate for deciBels
  
    for(int x =5;x<114 draw="" nbsp="" p="" scale="" x="x+10){ ">
   display.drawLine(x, 55, x, 52, WHITE);
    }
   display.drawRoundRect(0, 55, 125, 9, 2, WHITE);       //draw outline of bar graph
   int r = map(db,0,125,1,125);                           //set bar graph for width of screen
   display.fillRoundRect(1, 56, r, 10, 2, WHITE);         //draw bar graph with a width of r
   

// Stepsize  
  display.setCursor(1, 4 );  
  display.setTextSize(1);  
  //display.print(F("Step:"));
  switch (radix)
  {
    case 1:
      display.println(F("   1Hz"));
      break;
    case 10:
      display.println(F("  10Hz"));
      break;
    case 100:
      display.println(F(" 100Hz"));
      break;
    case 1000:
      display.println(F("  1kHz"));
      break;
    case 10000:
      display.println(F(" 10kHz"));
      break;
    case 100000:
      display.println(F("100kHz"));
      break;
    case 1000000:
      display.println(F("  1MHz"));
      break;
    
  }

// Mode
  display.setCursor(45, 4);
  display.setTextSize(1);  
  switch (act_clk)
  {
    case 0:
      display.println(F("V3.0"));
      break;
    case 1:
      display.println(F("RIT"));
      break;
    case 2:
      display.println(F("BFO"));
      break;
  }

// LSB and USB Mode  
    if (vfo_t >= 10000000UL) 
      {
        display.setCursor(75, 4 ); 
        display.print(F("USB"));
      }

  else if (vfo_t <= 10000000UL)
      {
        display.setCursor(75, 4); 
        display.print(F("LSB"));
      }

// Band Text
    if (vfo_t >= 3500000UL && vfo_t <= 4500000)
      {
        display.setCursor(100, 4);
        display.print (F("80M"));
      }
   else if (vfo_t >= 6500000UL && vfo_t <= 7500000)
      {
        display.setCursor(100, 4);
        display.print (F("40M"));
      }

   else if (vfo_t >= 11000000UL && vfo_t <= 12000000)
      {
        display.setCursor(100, 4);
        display.print (F("30M"));
      }
      
  else if (vfo_t >= 14000000UL && vfo_t <= 15000000)
      {
        display.setCursor(100, 4);
        display.print (F("20M"));
      }
      
  else if (vfo_t >= 27000000UL && vfo_t <= 28000000UL)
      {
        display.setCursor(100, 4);
        display.print (F("10M"));
      }

  //display.clearDisplay();
 display.setCursor(1,42);
 display.setTextSize(1);
 display.println("S1 3 5 9  20  40  +60");

// Kotak Frekwensi
display.drawRect(1, 16, 125, 22, WHITE);
// Kotak Kuning
display.drawRect(1, 0, 125, 15, WHITE);     
// Messages
  display.setCursor(100,4);
  switch (disp_txt)
  {
    case 1:
      display.print(F("SW RIT Off"));
      break;
    case 2:
      display.print(F("Set to TRx"));
      break;
    case 3:
      display.print(F("CAL"));
      break;      
    case 4:
      display.print(F("  "));
      break;  
    case 5:
      display.print(F("LSB"));
      break;
    case 6:
      display.print(F("USB"));
      break;                
  }
  display.display();

}

/**************************************/
/*            S E T U P               */
/**************************************/
void setup()
{
  // Band Switch
      pinMode(Band_10m, OUTPUT);
      pinMode(Band_20m, OUTPUT);
      pinMode(Band_30m, OUTPUT);
      pinMode(Band_40m, OUTPUT);
      pinMode(Band_80m, OUTPUT);
        
  Serial.begin(115200);
  Wire.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x64)


// Clear the buffer.
  display.clearDisplay();
  // Show the display buffer on the hardware.
  // NOTE: You _must_ call display after making any drawing commands
  // to make them visible on the display hardware!
  


// Read EEPROM
  radix = eeprom_read_dword((const uint32_t *)EE_SAVED_RADIX);
  if ((radix < 10UL) | (radix > 1000000UL)) radix = 100UL;  
  
  vfo_t = eeprom_read_dword((const uint32_t *)EE_SAVED_AFREQ);
  if ((vfo_t < F_MIN) | (vfo_t > F_MAX)) vfo_t = 14000000ULL;

  bfo_f = eeprom_read_dword((const uint32_t *)EE_SAVED_BFREQ);
  if ((bfo_f < F_MIN) | (bfo_f > F_MAX)) bfo_f = 9000000ULL;  

  vco_c = 0;
  if (eeprom_read_dword((const uint32_t *)EE_SAVED_CALBR) == 0x60)  {
    vco_c = eeprom_read_dword((const uint32_t *)EE_SAVED_OFSET);
  }  
  xt_freq = SI5351_XTAL_FREQ + vco_c;

//initialize the Si5351
  si5351.set_correction(0); // Set to zero because I'm using an other calibration method
  si5351.init(SI5351_CRYSTAL_LOAD_8PF, xt_freq); //If you're using a 27Mhz crystal, put in 27000000 instead of 0
  // 0 is the default crystal frequency of 25Mhz.
  si5351.set_pll(SI5351_PLL_FIXED, SI5351_PLLA);
  
// Set CLK0 to output the starting "vfo" frequency as set above by vfo = ?
  si5351.set_freq((vfo_t * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK0);
  si5351.drive_strength(SI5351_CLK0,SI5351_DRIVE_2MA);
// Set CLK1 to output the Rx frequncy = vfo +/- bfo frequency
  if (vfo_t <= bfo_f) vfo_r = vfo_t + bfo_f;    // Upper / lower mixing  
  else vfo_r = vfo_t - bfo_f;  
  si5351.set_freq((vfo_r * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK1);
  si5351.drive_strength(SI5351_CLK1,SI5351_DRIVE_2MA);
// Set CLK2 to output bfo frequency
  si5351.set_freq((bfo_f * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK2);
  si5351.drive_strength(SI5351_CLK2,SI5351_DRIVE_2MA);


// Clear the buffer.
  display.clearDisplay();
  display.display();
  
// text display tests
  display.setTextSize(1);
  display.setTextColor(WHITE);
  
// Encoder setup
  pinMode(ENCODER_BTN, INPUT_PULLUP);
  PCICR |= (1 << PCIE2);                       // Enable pin change interrupt for the encoder
  PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);

  sei();

// Pin Setup
  pinMode(Calibrbtn, INPUT_PULLUP);   // Calibrate
  pinMode(RIT_Switch, INPUT_PULLUP);  // RIT Switch
  pinMode(TX_Switch, INPUT_PULLUP);   // Select TRx or BFO
  
// Display first time  
  display_frequency();  // Update the display
}

/**************************************/
/*             L O O P                */
/**************************************/
void loop()
  {
  
  if (disp_txt == 4) {
    delay(3000);                  // Display calibration OK and wait 3 seconds
    disp_txt = 0;
  }

// Band Switch
   if (vfo_t >= 3500000UL && vfo_t <= 4500000)
        {
         digitalWrite(Band_80m,HIGH);
          }
   else {
         digitalWrite(Band_80m,LOW);      
          }
   if (vfo_t >= 6500000UL && vfo_t <= 7500000)
        {
         digitalWrite(Band_40m,HIGH);
          }
   else {
         digitalWrite(Band_40m,LOW);         
          }

   if (vfo_t >= 11000000UL && vfo_t <= 12000000)
        {
        digitalWrite(Band_30m,HIGH);
         }
   else {
         digitalWrite(Band_30m,LOW);         
          }
          
  if (vfo_t >= 14000000UL && vfo_t <= 15000000)
        {
        digitalWrite(Band_20m,HIGH);
         }
   else {
         digitalWrite(Band_20m,LOW);         
          }
          
  if (vfo_t >= 27000000UL && vfo_t <= 28000000UL)
      {
        digitalWrite(Band_10m,HIGH);
      }
   else {
         digitalWrite(Band_10m,LOW);         
          }
           
// Update the display if the frequency has been changed
  if (changed_f)  {
    display_frequency();
    
    if (act_clk == 0 && !calibrate)                   // No Tx update during calibrate
    si5351.set_freq((vfo_t * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK0);
    else if (act_clk == 2)                            // BFO update
    si5351.set_freq((bfo_f * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK2);      
// Update Rx frequency    
    if (vfo_t <= bfo_f) vfo_r = vfo_t + bfo_f;      // Upper / lower mixing  
    else vfo_r = vfo_t - bfo_f;    
    si5351.set_freq((vfo_r * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK1);

    changed_f = 0;
    disp_txt = 0;                   // Clear line
  }

  RIT_switch();                     // read RIT switch
  
// Button press changes the frequency change step for 1 Hz steps
// Also stored the last used frequency together with the step size before store
  if (get_button()) {
    if (stepflag) {                 // Stepsize button
      eeprom_write_dword((uint32_t *)EE_SAVED_RADIX, radix);
      eeprom_write_dword((uint32_t *)EE_SAVED_AFREQ, vfo_t);
  
      switch (radix)
      {
      case 1:
        radix = 10;
        break;
      case 10:
        radix = 100;
        break;
      case 100:
        radix = 1000;
        break;
      case 1000:
        radix = 10000;
        break;
      case 10000:
        radix = 100000;
        break;
      case 100000:
        radix = 1000000;
        break;
      case 1000000:
        radix = 1;
        break;       
      }
      stepflag  = 0;
    }
    else if (modeflag)  {         // Mode button
      if (act_clk == 0) act_clk = 2; else act_clk = 0;
      eeprom_write_dword((uint32_t *)EE_SAVED_BFREQ, bfo_f);
      modeflag = 0;  
      disp_txt = 0;                                 // Clear line
    }
    else if (calflag) {                             // Calibrate button
      if (!digitalRead(RIT_Switch)){                // RIT is on
        disp_txt = 1;                               // Message RIT off
      }
      else if (act_clk == 2){                       // BFO mode on
        disp_txt = 2;                               // Message BFO off        
      }
      else if (!calibrate)  {                       // Start calibrate
        vfo_s = vfo_t;                              // Save actual freq
        old_radix = radix;                          // and stepsize
        vfo_t = SI5351_XTAL_FREQ;                   // en set to default x-tal
        disp_txt = 3;                               // Message Calibrate
        calibrate = 1;
        radix = 10;                                 // Set to 10 Hz        
        si5351.set_freq((vfo_t * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK0); // Set CLK0
      }
      else if (calibrate) {                         // after tuning x-tal freq
        calibrate = 0;
        vco_c = vfo_t - SI5351_XTAL_FREQ;           // difference
        vfo_t = vfo_s;                              // restore freq
        radix = old_radix;                          // and stepsize
        disp_txt = 4;                               // Message Calibrate OK
        
        eeprom_write_dword((uint32_t *)EE_SAVED_OFSET, vco_c);        // store correction
        xt_freq = SI5351_XTAL_FREQ + vco_c;                           // Calibrated x-tal freq
        eeprom_write_dword((uint32_t *)EE_SAVED_CALBR, 0x60);         // Calibrated
        si5351.init(SI5351_CRYSTAL_LOAD_8PF, xt_freq);                // Initialize
        si5351.set_pll(SI5351_PLL_FIXED, SI5351_PLLA);        
        si5351.set_freq(bfo_f * SI5351_FREQ_MULT, SI5351_PLL_FIXED, SI5351_CLK2);   // correct BFO frequency
        si5351.set_freq(vfo_t * SI5351_FREQ_MULT, SI5351_PLL_FIXED, SI5351_CLK0);   // Correct Tx freq
        if (vfo_t <= bfo_f) vfo_r = vfo_t + bfo_f;                                  // Upper / lower mixing
        else vfo_r = vfo_t - bfo_f;
        si5351.set_freq(vfo_r * SI5351_FREQ_MULT, SI5351_PLL_FIXED, SI5351_CLK1);   // correct Rx frequency
      }
      calflag = 0;
    }
  }
  display_frequency();                              // Update display



                                
}



// end while loop

download Service Manual Yaesu FT180a pada link  dibawah ini : https://1drv.ms/f/s!AuMtm9KDRI6mgdsuCrW51F1OBv1zYw

diperlukan modifikasi BPF pada board RF Unit Yaesu FT 180A(band 80m, 40m, 26m dan 20m) dengan menggunakan Trafo IF warna biru, dan setting jumper simplex pada LPF selector


saya sertakan juga referensi saya yang lainnya untuk modifikasi lilitan BPF dan nilai kapasitor-nya 


dibawah ini pemasangan BPF on progress ... yg existing dilepas.


board yang existing, sebelum dimodifikasi 


dan trafo BPF baik RX maupun TX sudah terpasang dengan sempurna seperti gambar dibawah, masih tersisa 2 selector BPF dimana pada FT 180A ini range LPF-nya mulai dari 1.6MHz s/d 18MHz.


hal yang perlu diperhatikan adalah dalam pemilihan Capacitor untuk BPF, alangkah baik-nya kita ukur mengunakan L-C Meter, mengingat sepengalaman saya hampir 80% nilai capacitor yang ada di retail nilai-nya tidak bisa konsisten dan memiliki deviasi yang lumayan signifikan.


bagaimanakah proses installasi Adruino beserta modul Si5351-nya, detail dapat dilihat pada gambar dibawah ini 



Sekarang saat-nya untuk perhitungan matematis-nya

Default dari Yaesu FT-180A unt. BFO menggunakan Crystal 10.7MHz dan pada USB menggunakan Crystal Filter 10.69845MHz, dan kendalanya untuk main di LSB kita musti pasang Crystal Filter lagi, dari beberapa referensi yang ada dan eksperiment dengan adjust frekwensi osilator dan clarifier akhirnya memberanikan mengubah design.

BFO yang semula statis menggunakan Crystal Filter 10.7MHz, saja lepas Crystal 10.7MHz-nya, diinject dengan BFO dari si5351 yang dinamis, dapat kita adjust sesuai dengan yang kita inginkan. jadi teori-nya adalah Crystal Filter USB bawaan dari Yaesu kita gunakan sebagai Crystal utama sedangkan untuk main USB nilai BFO-nya yang dinamis 1500Hz diatas ataupun dibawah dari nilai 10.69845MHz.

Hasilnya yang sudah saya terapkan pada 40m band saat ini nilai VFO adalah Freq display ditambahkan freq BFO(Freq center dari Crystal Filter USB pada IF Board Yaesu FT-180A), si5351 secara otomatis untuk frekwensi 10MHz akan menggunakan USB mode, berikut tabel dari penjelasan diatas :




untuk si5351 CL2 adalah Freq BFO, CL1 adalah nilai VFO+BFO sedangkan CL0 adalah nilai Freq yang tampil di LCD OLED Display tersebut.

SELAMAT MENCOBA, apabila ada yang ditanyakan feel free untuk kontak saya by email ke redy@wibisono.xyz