13 Kasım 2020 Cuma

Si4735 ve Arduino ile LW, MW, SW (AM - SSB) - FM Radyo alıcısı

 Güncelleme: 18.03.2024

CesarSound isimli kullanıcının Arduino Project Hub'da bir projesine rastladım: "AM/FM/SW Radio Receiver - Si4730 / Si4735 © GPL3+"

Radyo alıcılarına merakım olduğundan, incelemeye başladım. Radyo, Silicon Labs'ın ürettiği Si47XX tümdevreleri etrafına kurulmuş. Bu tümdevreye bir Arduino ile kumanda ediliyor ve teknik veriler de 1.8 inçlik renkli bir LCD ekranda gösteriliyor. 150 kHZ ilâ 30 MHZ arasında AM modunda, 76 ilâ 108 MHz arasında WFM modunda çalışabiliyor. Eğer Si4735 tümdevresini kullanırsanız SSB de dinleyebiliyorsunuz.

Si4730 tümdevresi kullanan modüller Aliexpress'te PL102BA-S olarak satılıyor. Ancak burada dikkat etmek gereken bir husus olduğunu öğrendim: Si4730 tümdevresi AM kipinde sâdece ortadalga radyo yayınlarını alacak şekilde üretilmişken, daha sonra Si4730-D60 olarak ürettikleri tümdevrelere LW ve SW alma özelliği eklendiğini öğrendim. 

Dolayısıyla, PL102BA-S V2 modülündeki tümdevrenin 3060 olarak işaretlenmiş olması gerektiği, aksi takdirde modülün uzun ve kısa dalga bandlarında çalışmadığını da aynı sayfadan öğrendim.

PL102 modül

Tamam, modül PL102, versiyonu da iki, peki tümdevre ne? Benim Aliexpress'te incelediğim modüllerde tümdevrenin ismi okunabiliyorsa hep 3020 gördüm, hiç 3060'lı modül göremedim. Bazı modüllerin tümdevresinin ne olduğu ise okunamıyordu.
 
    
İşimi şansa bırakmak istemediğimden, modül değil Si4730 tümdevresinin kendisini almaya karar verdim ve 5 adet sipariş verdim.
SMD elemanlarla çalışmak çoğumuz için korkulacak bir iştir; oysa, deneyince o kadar da zor bir iş olmadığı anlaşılacaktır. SSOP kılıftaki elamanlar biraz "ince" bacak aralığına sâhip olsa da, korkmaya gerek yok. Ben, bir SSOP - DIL adaptör PCB'si kullanacağım bu çalışmada. Robiz.net'te 28 bacaklı SSOP kılıfı DIL'e çeviren bir adaptör PCB'si birkaç liraya satılıyor.  (8 Mart 2024 itibarıyla bu adaptör PCB'si RobizNet'te stok dışı).  Si4730-D60 SSOP 24 kılıfta. Alt tarafta 2'şer bacak yeri boş bırakılırsa bu adaptör PCB'si Si4730'a oldukça uygun. (Bu PCB'nin bir yüzü SSOP kılıf, diğer yüzü SO kılıf içindir.)

Kutulama işini Altınkayanın DT-210 kodlu kutusuna göre tasarlıyorum; 1.8 inçlik LCD ve Arduino kutunun ön kapağına paralel olarak yerleştirilecek. Radyo devresini ve li-ion pilleri ise kutunun geri kalanına monte etmeyi düşünüyorum. Ön kapaktaki PCB şöyle olacak:
Ses ayar potansiyometresi, encoder, LCD ve 3 adet buton PCB'bin ön yüzüne, Arduino mini pro ise arka (lehim yüzüne) monte edilecek. Radyo devresi ile birisi 6'lı, diğer 3 telli iki adet konnektör ile bağlantı kurulacak.
Tümdevreler geldiğinde, devreyi kurup sonuçlarını paylaşacağım.
Henüz Si4730'lar gelmedi, ama ben ön panelin baskı devresini hazırladım.

120x35 mm ebadındaki bu küçük panele LCD, arduino, encoder, potansiyometre ve 3 adet buton sığacak. Bu yüzden, Arduino pro miniyi lehim yüzüne takacak şekilde hazırladım PCB'yi. Bu arada bir problemle karşılaştım: Daha önce kullandığım Arduino pro minilerde, A4 ve A5 iki sıra pinlere göre daha içeride yer alıyordu ve dolayısıyla ben de PCB'yi buna göre hazırlamıştım. Gelin görün ki, yeni sipariş ettiğim Pro minide A4 ve A5 programlama pinlerinin karşı köşesinde idi. Bu sepeble bu iki bağlantılı tel köprü ile yaptım.



Panel bitti.
İşte çalışan panel.
Projenin birinci ayağı başarıyla bitti.

16 Aralık 2020

Bugün Si4730-D60 tümdevreleri geldi Çin'den. Şimdi iş SSOP kılıftaki tümdevreyi adaptör PCB'sine lehimlemek ve ikinci bir PCB tasarlayarak, Si4730 modülünü, ferrit anteni, ses frekansı güç kuvvetlendiricisini ve Li-ion pil devresini monte etmek. 
Si4730, FM stereo yayınları çözebiliyor. Ancak amacım müzik dinlemekten ziyade "radyo dinlemek" olduğu için mono bir ses frekansı güç kuvvetlendiricisi düşünüyorum.
Yeni devre böyle olacak. Kutuya pil ve hoparlör böyle yerleşecek.

Si4730'un  adaptör PCB'sine lehimlenmiş  hâli. PCB'nin fazladan 2+2 bacağını kesmek yerine, boş bıraktım.

18 Aralık 2020

Dün gece nihayet bitirdim ana devreyi. Ama bir an önce ve heyecanla devrenin çalışmasını görmek istediğimden olacak, baskı devreyi ters basmışım! Oturup yeniden baskı devre basmak yerine, normal yüze monte edilecek elemanları da bakırlı yol tarafına lehimleyerek devreyi çalıştırdım. Saat gecenin 03'ü idi.

23 Aralık 2020 - Mutluluk ve hayal kırıklığı

Devreyi çalıştırdım. Ama bir noksanıyla: Devre maalesef LW ve SW bandlarında çalışmıyordu. Acaba tümdevreyi mi bozdum diyerek bir tümdevre daha monte ettim adaptör PCB'sine. Hayır, netice yine aynıydı. FM'de gümbür gümbür çalışan devre, MW'de oldukça gürültülü bir şekilde çalışıyor, LW ve SW'de çalışmıyordu.

Önce CesarSound takma isimli kullanıcı ile haberleştim. "Ben ve ardkaşlarımın kurduğu bütün devreler çalıştı" diyordu. Ama onlar hep PL102BA-S modül kullanmışlardı. Daha sonra bu konuda oldukça iyi çalışmaları olan PU2CLR çağrı işaretli Ricardo Lima Caratti'ye konuyu açtım. O da hayretler içindeydi. Zira o, benim gibi Si4730-D60 tümdevresini kullanmış ve alıcı bütün bandlarda çalışıyormuş. "Acaba bu Çinlilier sahte tümdevre mi gönderdiler? Bu tümdevre Si4730-D60 değil mi?" diye düşünmeye başladım. Zira bu tümdevrenin D60 olmayan versiyonları sadece MW ve FM bandlarında çalışıyordu. PU2CLR'nin bir test programcığı var, onu kullanarak baktım tümdevre gerçekten de Si4730-D60. Peki ne oluyordu? Konuyla ilgili gruplara vs. bakıp yazışırken bir şey öğrendim: Bu tümdevrenin belli bir târihten önce üretilmişleri LW ve SW'de çalışmıyordu. (Şimdilik varabildiğimiz tek sonuç bu.)

Kaderime küstüm ve MW ve FM'de çalışan bir devre olarak kaldı uygulama. Aynı devre Si4735-D60 tümdevresi ile kullanıldığında, 150 kHz - 30 MHz arasında AM ve SSB kiplerinde çalışabiliyor.

Bu arada, devreyi tek bir li-ion pil ile besleyip, bir gerilim yükseltici ile 5v elde etmeyi, ses frekansı güç kuvvetlendiricisi olarak da D sınıfı hazır bir modül kullanmayı plânlamıştım. Ancak hem gerilim yükseltme devresi ve hem de D sınıfı amplifikatör -anahtarlamalı çalışma sistemleri sebebiyle- özellikle MW alışında çok gürültüye sebep oluyor. Bu yüzden, bir dengeleyici devresiyle 2 adet li-ion pil  ve amplifikatör olarak LM386 kullandım. Bu yeni yapılanmayı gösteren yerleştirme planı aşağıdadır. Alış şimdi çok iyi. Sayfanın en altında gerçekleştirdiğim devrenin kısa bir videosu var.

Elemanlar ve devreler kutuya böyle yerleşecek.


Baskı devreye üst yüzde yerleşecek elemanlar

Baskı devreye alt yüzde yerleşecek elemanlar

Şimdi bir Si4735-D60 temin edip devam etmek düşüncesine geldim.

Sâdece AM ve FM bandında çalışan devre için, orijinal yazılımı kısalttım ve çalışmayan bandları çıkarttım.

Yeni yazılımın kodları aşağıdadır.

Devrenin baskı devre planları ve yazılımıyla ilgili bilgilere https://qsl.net/ta2ei adresinden ulaşabilirsiniz.

/*******************************************************************************************************************************************************

  SI4735/30 AM/FM STEREO - LW/MW/SW/CB RADIO RECEIVER WITH ST7735 COLOR TFT (LIB TFT_ST7735 BODMER) ARDUINO NANO/UNO/PRO MINI - WRITE BY JCR FEB/2020 RECEPTION RANGE: AM 150kHz TO 30MHz - FM 64 TO 108MHz

  VERSION TO SHARE - JUN/2020

  REV.2.1a - NOV/2020

********************************************************************************************************************************************************

  ELECTRIC CONNECTIONS (ALSO SEE THE SCHEMATICS):

ST7735 DISPLAY PIN CONNECTION TO ARDUINO NANO/UNO/PRO MINI:

  LED (BACKLIGHT) - 5V(VIA 100R RESISTOR SERIES); SCK - D13; SDA - D11; AO - D9; RESET - D8; CS - D10; GND - GND; VCC - 5V

  ROTARY ENCODER TO ARDUINO: D2; GND; D3

  PUSH BUTTONS:

  BAND SELECT - A0; TUNING STEPS (1k / 5k / 10k) - A1; AM IF FILTER SEL - A2; COLOR THEME - A3 (NOTE: THE OTHER SIDE OF P.B. IS CONNECTED TO GND)

  SI4735/30: SDA - A4 (VIA 1k RESISTOR SERIES); SCL - A5 (VIA 1k RESISTOR SERIES); RESET - D7 (VIA 10k RESISTOR SERIES); VCC - 3.3V; GND - GND

*********************************************************************************************************************************************************

  ATTENTION!

  -MUST INSTALL AND USE THE LIBRARIES LOCATED IN "INSTALL THESE LIBRARIES" FOLDER

  -PLEASE BELOW CHOOSE THE CORRECT I2C ADDRESS FOR YOUR SI4730/35 (0x11 OR 0x63), BEFORE TO START. MODULE PL102BA-S V2.11 USE 0x63

  -FOLLOW THE WIRING AS INDICATED ON SCHEMATICS

  -WORKS WITH IC SI4730-D60 AND SI4731/32/34/35 OR RADIO MODULE PL102BA-S V2.11

  -FOR ICs SI4730/31/34/35 - D60  A 10k PULLUP RESISTOR MUST BE USED IN EACH I2C LINES. FOR PL102BA-S MODULE PULLUPS NOT REQUIRED

*********************************************************************************************************************************************************/


#include <SPI.h>

#include "Wire.h"

#include <TFT_ST7735.h> //BODMER graphics and font library for ST7735 driver chip

#include <Si4735.h>     //MICHAEL KENNEDY SI4735 I2C library modified by JCR

#include <Rotary.h>     //BUXTON Rotary encoder library


TFT_ST7735 tft = TFT_ST7735();  //Invoke library, pins defined in User_Setup.h

Rotary r = Rotary(3, 2);

Si4735 radio;


const byte band = A0;     //Band seçimi

const byte frstep = A1;   //Tuning adımları

const byte filtsel = A2;  //IF filtresi seçimi

const byte modesel = A3;  //Renk düzenini değiştirir


byte SI7435_ADDRESS = 0x63; //I2C ADDRESS OF SI4735: 0x11 (SEN PIN TO GND) or 0x63 (SEN PIN TO 3v3)


const int bl[22] = {"160 ", "120 ", "90m ", "80m ", "75m ", "60m ", "49m ", "40m ", "41m ", "31m ", "30m ",

                    "25m ", "22m ", "20m ", "19m ", "17m ", "16m ", "15m ", "13m ", "12m ", "11m ", "10m "

                   };

unsigned int freq;

unsigned int fstep;

unsigned int freqold;

int sm, sm_old, mx, mod;

int stp = 0; // orj. 2

int mode = 2;

byte encoder = 1;

byte count = 6;

byte filter = 0x03;

byte fil = 4;

byte fr_h;

byte fr_l;

byte ssb_m = 0x00; //0x00 AM;

byte mw_sw = 0x00; //0x00 MW ; 0x01 SW

byte am_fm = 0x40; //0x40 AM ; 0x20 FM

int period = 100;  //millis period timer for refresh RSQ

unsigned long time_now = 0;  //millis init timer for refresh RSQ

int period_sm = 1000;  //millis period timer for S-meter val peak hold

unsigned long time_now_sm = 0;  //millis init timer S-meter val peak hold


uint16_t ca = 0x0005;  //Mâvi - Arka plan

uint16_t cb = 0xFFFF;  //Beyaz - Metin rengi (ORIG 0x07FF Cyan)

uint16_t cc = 0xFFFF;  //Beyaz - çizgiler

uint16_t cd = 0x3FE0;  //Yeşil - Smetre göstergesi

uint16_t ce = 0xF81F;  //Macenta - MD göstergesi

uint16_t cf = 0x0000;  //Siyah - SM/MD'nin zemin rengi

uint16_t cg = 0x1FFF;  //Beyaz - Frekans rengi //eski değeri 0xFFFF

uint16_t ch = 0x07FF;  //Camgöbeği -  RIT göstergesi



void setup() {

  tft.init();

  tft.setRotation(1); // LCD ekranın  yönünü belirleme

  SPI.begin();

  Wire.begin();

  start_msg();

  tft.fillScreen(ca); //


  pinMode(band, INPUT_PULLUP);

  pinMode(frstep, INPUT_PULLUP);

  pinMode(filtsel, INPUT_PULLUP);

  pinMode(modesel, INPUT_PULLUP);


  radio.begin(0, SI7435_ADDRESS);

  power_up_norm();

  delay(400);

  am_command();

  count = 1;      //Açılışta hangi band çalışacak?

  bandpresets();

  layout();

  setstep();

  frequency();

  smeter();

  band_ind();

  filterAM();


  PCICR |= (1 << PCIE2);

  PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);

  sei();

}


void loop() {

  if (freqold != freq) {

    freqold = freq;

    tune_freq();

    frequency();

  }


  if ((digitalRead(band)) == LOW) {

    inc_preset();

    while (digitalRead(band) == LOW);

  }


  if ((digitalRead(frstep)) == LOW) {

    if (am_fm != 0x20) inc_step();

    if (am_fm == 0x20) setstepFM();

    while (digitalRead(frstep) == LOW);

  }


  if ((digitalRead(filtsel)) == LOW) {

    if (am_fm != 0x20) filterAM();

    if (am_fm == 0x20) filterFM();

    while (digitalRead(filtsel) == LOW);

  }


  if (digitalRead(modesel) == LOW) {

    delay(500);


    ca = 0x0000;  //Siyah

    cb = 0xFFFF;  //Beyaz

    cc = 0xFFFF;  //Beyaz

    cd = 0xF81F;  //Macenta   //0x001F;  //Mâvi

    ce = 0xF81F;  //Macenta

    cg = 0x3FE0;  //Yeşil

    ch = 0x07FF;  //Camgöbeği

    tft.fillScreen(ca);

    //tft.setTextSize(1);

    tft.setTextColor(cb, ca);

    //tft.setCursor(20, 20);

    layout();

    bandpresets();

    frequency(); 

    if (am_fm != 0x20) {fil = 4; filterAM();}

    if (am_fm == 0x20) {fil = 0; filterFM();}

  }

 


  if (millis() > time_now + period) {

    time_now = millis();

    rsq();

    smeter();

    modgraf();

    if (am_fm != 0x20) band_ind();

    if (am_fm == 0x20) pilot();

  }


  if (sm > mx) mx = sm;

  if (millis() - time_now_sm >= period_sm) {

    time_now_sm = millis();

    mx = sm;

  }

}


ISR(PCINT2_vect) {

  char result = r.process();

  if (result == DIR_CW)

    set_frequency(1);

  else if (result == DIR_CCW)

    set_frequency(-1);

}


void set_frequency(short dir) {

  if (encoder == 1) {     //AM band sınırları

    if (dir == 1) freq = freq + fstep;

    if (freq >= 1701) freq = 1701;

    if (dir == -1) freq = freq - fstep;

    if (freq <= 531) freq = 531;

  }

  if (encoder == 2) {     //FM band sınırları

    if (dir == 1) freq = freq + fstep;

    if (freq >= 10800) freq = 10800;

    if (dir == -1) freq = freq - fstep;

    if (freq <= 8750) freq = 8750;

  }

}


void inc_preset() {

  count++;

  if (count > 2)

    count = 1;

  bandpresets();

  delay(50);

}


void bandpresets() {

  tft.setTextSize(1);

  tft.setTextColor(cb, ca);

  switch (count)  {

    case 1:

      encoder = 1;

      radio.begin(0, SI7435_ADDRESS);

      power_down();

      power_up_norm();

      delay(200);

      ssb_m = 0x00;

      freq = 531;

      am_fm = 0x40;

      tune_freq();

      am_command();

      filter = 0x03;

      stp = 3;

      setstep();

      tft.drawString("MW        ", 30, 57, 2);

      tft.drawString("2k ", 135, 74, 2);

      break;

   

    case 2:

      encoder = 2;

      power_down();

      power_up_FM();

      delay(200);

      am_fm = 0x20;

      ssb_m = 0x00;

      freq = 10280;

      fstep = 10; 

      tune();

      radio.setMode(FM);

      fil = 0; filterFM();

      stp = 0; setstepFM();

      break;

  }

  if (am_fm == 0x20) {

    tft.setTextColor(cg, ca); tft.drawString("MHz", 132, 57, 2); tft.setTextColor(cb, ca); tft.drawString("FM ", 3, 57, 2);

  }

  else {

    tft.setTextColor(cg, ca); tft.drawString("kHz ", 132, 57, 2); tft.setTextColor(cb, ca); tft.drawString("AM ", 3, 57, 2);

  }

}


void filterAM() {

  tft.setTextSize(1);

  tft.setTextColor(cb, ca);

  switch (fil) {

    case 0:

      fil = 1;

      filter = 0x00; tft.drawString("6k ", 135, 74, 2);

      break;

    case 1:

      fil = 2;

      filter = 0x01; tft.drawString("4k ", 135, 74, 2);

      break;

    case 2:

      fil = 3;

      filter = 0x02; tft.drawString("3k ", 135, 74, 2);

      break;

    case 3:

      fil = 4;

      filter = 0x06; tft.drawString("2k5", 135, 74, 2);

      break;

    case 4:

      fil = 5;

      filter = 0x03; tft.drawString("2k ", 135, 74, 2);

      break;

    case 5:

      fil = 6;

      filter = 0x05; tft.drawString("1k8", 135, 74, 2);

      break;

    case 6:

      fil = 0;

      filter = 0x04; tft.drawString("1k ", 135, 74, 2);

      break;

  }

  property_filter_AM();

}


void filterFM() {

  tft.setTextSize(1);

  tft.setTextColor(cb, ca);

  switch (fil) {

    case 0:

      fil = 1;

      filter = 0x00; tft.drawString("Otm", 135, 74, 2);

      break;

    case 1:

      fil = 2;

      filter = 0x01; tft.drawString("110", 135, 74, 2);

      break;

    case 2:

      fil = 3;

      filter = 0x02; tft.drawString("84k", 135, 74, 2);

      break;

    case 3:

      fil = 4;

      filter = 0x03; tft.drawString("60k", 135, 74, 2);

      break;

    case 4:

      fil = 0;

      filter = 0x04; tft.drawString("40k", 135, 74, 2);

      break;

  }

  fm_command();

}


void inc_step() {

  stp++;

  if (stp > 4)

    stp = 1;

  setstep();

  delay(50);

}


void setstep() {

  tft.setTextSize(1);

  tft.setTextColor(cb, ca);

  switch (stp) {

    case 1:

      fstep = 1;    // 1kHz

      tft.drawString("1k ", 100, 57, 2);

      break;

    case 2:

      fstep = 5;    // 5kHz

      tft.drawString("5k ", 100, 57, 2);

      break;

   case 3:

      fstep = 9;  // 9kHz

      tft.drawString("9k ", 100, 57, 2); //MW'da adımlar 9 kHz olduğu için ekledim.

      break;

    case 4:

      fstep = 10;  // 10kHz

      tft.drawString("10k", 100, 57, 2);

      break;

  }

}


void setstepFM() {

  tft.setTextSize(1);

  tft.setTextColor(cb, ca);

  switch (stp) {

    case 0:

      stp = 1;

      fstep = 10;    // 50kHz

      tft.drawString(" x1", 100, 57, 2);

      break;

    case 1:

      stp = 0;

      fstep = 20;    // 100kHz

      tft.drawString(" x2", 100, 57, 2);

      break;

  }

}


void frequency() {    //Frekans göstergesindeki rakkamların biçimi

  tft.setTextColor(cg, ca);

  if (freq >= 10000) tft.drawNumber(freq, 0, 1, 7); if (freq < 10000 && freq >= 1000) tft.drawNumber(freq, 32, 1, 7);

  if (freq < 1000 && freq >= 100) tft.drawNumber(freq, 64, 1, 7); if (freq < 100 && freq >= 10) tft.drawNumber(freq, 96, 1, 7);

  if (freq < 10) tft.drawNumber(freq, 128, 1, 7); if (freq < 10000) tft.fillRect (2, 1, 28, 48, ca);

  if (freq < 1000) tft.fillRect (34, 1, 28, 48, ca);


  if (am_fm == 0x40 && freq >= 1000) tft.fillCircle(63, 51, 2, cg); else  tft.fillCircle(63, 51, 2, ca);

  if (am_fm == 0x20) tft.fillCircle(95, 51, 2, cg);  else tft.fillCircle(95, 51, 2, ca);

}


void smeter() {  //BARGRAPH SIGNAL METER

  if (sm > 90) sm = 90;


  tft.fillRect(31, 111, sm, 14, cd); // BAR DIRECT

  tft.fillRect(31 + sm, 111, 90 - sm, 14, ST7735_BLACK); // BAR INVERSE


  tft.setTextSize(1);

  tft.setTextColor(cb, ca);

  if (mx < 1) tft.drawString("S0 ", 136, 110, 2);

  if ((mx >= 1) && (mx < 10)) tft.drawString("S1 ", 136, 110, 2);

  if ((mx >= 10) && (mx < 25)) tft.drawString("S3 ", 136, 110, 2);

  if ((mx >= 25) && (mx < 35)) tft.drawString("S5 ", 136, 110, 2);

  if ((mx >= 35) && (mx < 55)) tft.drawString("S7 ", 136, 110, 2);

  if ((mx >= 55) && (mx < 65)) tft.drawString("S9 ", 136, 110, 2);

  if ((mx >= 65) && (mx < 75)) tft.drawString("+20", 136, 110, 2);

  if ((mx >= 75) && (mx < 80)) tft.drawString("+40", 136, 110, 2);

  if (mx >= 80) tft.drawString("+60", 136, 110, 2);

}


void modgraf() {  //BARGRAPH SIGNAL TO NOISE

  int mod_g = map(mod, 0, 65, 65, 0);

  tft.fillRect(26, 77, mod_g, 10, ch); // BAR DIRECT

  tft.fillRect(26 + mod_g, 77, 65 - mod_g, 10, ST7735_BLACK); // BAR INVERSE

}


void layout() {

  tft.setTextColor(TFT_WHITE, TFT_BLUE);

  tft.drawFastHLine(0, 56, 160, cc);  //125

  tft.drawFastVLine(125, 56, 20, cc);

  tft.drawFastHLine(0, 73, 160, cc);

  tft.drawFastHLine(0, 90, 160, cc);

  tft.drawFastHLine(0, 107, 160, cc);

  tft.drawFastVLine(125, 107, 20, cc);


  tft.setTextSize(1);

  tft.setTextColor(cb, ca);

  tft.drawString("JCR", 3, 91, 2);

  tft.drawString(" DSP MW-FM ALICI ", 30, 91, 2);

  tft.drawString("MD", 3, 74, 2);

  tft.drawString("BWF", 105, 74, 2);

  tft.drawString("S|dB", 3, 110, 2);

}


void start_msg() {

  tft.fillScreen(TFT_BLACK);

  tft.setTextSize(1);

  tft.setTextColor(TFT_WHITE, TFT_BLACK);

  tft.drawString("JCR Radio   2020", 23, 10, 2);

  tft.drawString("DSP MW - FM RECEIVER ", 3, 40, 2);

  tft.drawString("REVISION 2.1a", 35, 70, 2);

  tft.setTextColor(TFT_CYAN, TFT_BLACK); 

  tft.drawString("mod: TA2EI", 44, 100, 2);

  delay(2000);

}


void band_ind() {

  tft.setTextSize(1); tft.setTextColor(cb, ca);

  if (freq >= 1800 && freq <= 2000) tft.drawString(bl[0], 30, 57, 2);

}


//----------------------------------------------------------------------------------------------------------------

void tune_freq() {

  fr_h = (freq) >> 8;      //Ondalık sayı iki byte'lık hexadesimal sayıya dönüştürülecek

  fr_l = (freq) & 0x00FF;


  if ((freq) < 1800) {     //MW ayar kapasitörü - 0x00 - MW ; 0x01 - SW

    mw_sw = 0x00;

  }

  else (mw_sw = 0x01);


  tune();

}


void rsq() {

  RSQMetrics rsq;

  radio.getRSQ(&rsq);

  sm = (rsq.RSSI);

  mod = (rsq.SNR);

}


void pilot() {

  RSQMetrics rsq;

  radio.getRSQ(&rsq);

  tft.setTextSize(1);

  tft.setTextColor(cb, ca);

  if (am_fm == 0x20) {

    if (rsq.stereo == 1)

      tft.drawString(">  Stereo <", 30, 57, 2);

    if (rsq.stereo == 0)

      tft.drawString("<  Mono  >", 30, 57, 2);

  }

}


void am_command() {

  radio.setProperty(PROP_AM_SOFT_MUTE_MAX_ATTENUATION, 1); // 0 (OFF) - 63

  radio.setProperty(PROP_AM_AUTOMATIC_VOLUME_CONTROL_MAX_GAIN, 0x32C8); // 0x1000 - 0x7800

  radio.setProperty(PROP_AM_AGC_ATTACK_RATE, 4); // 4–248

  radio.setProperty(PROP_AM_AGC_RELEASE_RATE, 4); // 4–248

}


void fm_command() {

  radio.setProperty(PROP_FM_DEEMPHASIS, 0x0001); // 02 = 75 μs;  01 = 50 μs

  radio.setProperty(PROP_FM_CHANNEL_FILTER, filter); // 0 = automat; 1 = 110kHz; 4 = 40kHz

  radio.setProperty(PROP_FM_SOFT_MUTE_MAX_ATTENUATION, 0); // 0 = disable; 31 = max

  radio.setProperty(PROP_FM_BLEND_STEREO_THRESHOLD, 0); // 0 = stereo; 127 = mono

  radio.setProperty(PROP_FM_BLEND_MONO_THRESHOLD, 0); // 0 = stereo; 127 = mono

}

//----------------------------------------------------------------------------------------------------------------

void power_down() {

  Wire.beginTransmission(SI7435_ADDRESS);

  Wire.write(0x11);

  Wire.endTransmission();

  delay(1);

}


void power_up_norm() {

  Wire.beginTransmission(SI7435_ADDRESS);

  Wire.write(0x01);

  Wire.write(0x11);  //11 - NORM ; 31 - PATCH

  Wire.write(0x05);

  Wire.endTransmission();

  delay(1);

}


void power_up_FM() {

  Wire.beginTransmission(SI7435_ADDRESS);

  Wire.write(0x01);

  Wire.write(0x10);  //10 - NORM ; 30 - PATCH

  Wire.write(0x05);

  Wire.endTransmission();

  delay(1);

}


void tune() {

  Wire.beginTransmission(SI7435_ADDRESS);

  Wire.write(am_fm); //0x40 AM ; 0x20 FM

  Wire.write(ssb_m);

  Wire.write(fr_h);  //Hi byte Tune

  Wire.write(fr_l);  //Lo byte Tune

  Wire.write(0x00);

  Wire.write(mw_sw); //0x00 MW ; 0x01 SW

  Wire.endTransmission();

  delay(1);

}


void property_filter_AM() {

  Wire.beginTransmission(SI7435_ADDRESS);

  Wire.write(0x12);

  Wire.write(0x00);

  Wire.write(0x31);

  Wire.write(0x02);

  Wire.write(0x00);     //0x01 = Low cut filter 100Hz ON - 0x00 = OFF

  Wire.write(filter);   //0x00 = 6kHz; 1 = 4kHz; 2 = 3kHz; 3 = 2kHz; 4 = 1kHz; 5 = 1.8kHz; 6 = 2.5kHz;

  Wire.endTransmission();

  delay(1);

}


9 ocak 2021

Çinden beklediğim Si4735 D60 geldi. Bütün bantlarda çalışıyor alıcı şimdi. Tümdevre için bir de yeni modül tasarladım.




Şimdi alıcı 150 kHz ile 29.999 kHz arasını alıyor. SSB modunda da çalışıyor.



Âcil duruma hazırlık

Güncelleme : 5  Geçenlerde basında şöyle bir haber yer aldı: 'İngiltere Başbakan Yardımcısı Oliver Dowden, bir felaket sonucu internet v...