DIY Si4730 All Band Radio (LW, MW, SW, FM)
Componentes e suprimentos
| | × | 1 | |
| | × | 1 | |
| Adafruit LCD padrão - 16x2 branco em azul | | × | 1 | |
| Codificador rotativo com botão de pressão | | × | 1 | |
| Placa de desenvolvimento, Módulo amplificador de áudio Classe D | | × | 1 | |
| Alto-falante:0,25 W, 8 ohms | | × | 1 | |
| haste de ferite do antigo rádio MW | | × | 1 | |
| | × | 1 | |
Aplicativos e serviços online
Sobre este projeto
Quando você menciona o rádio Arduino, sempre pensa no rádio FM moderno (88-108 MHz na Europa). As bandas LW, MW e SW cobrem a faixa de 0,2 a 30 MHz. SW é especialmente interessante. As ondas de rádio na banda de ondas curtas podem ser refletidas ou refratadas de uma camada de átomos eletricamente carregados na atmosfera chamada ionosfera. Assim, o rádio de ondas curtas pode ser usado para comunicação de longa distância, às vezes em continentes inteiros ou além.
A seguir apresentarei a vocês o desenvolvimento de uma rádio que cobre todas as bandas citadas acima. O "coração" deste rádio é o Si4730 IC da Silicon Labs, que pode ser adquirido no AliExpress na forma de uma pequena placa de desenvolvimento por alguns dólares.
Esta placa é controlada por um Arduino usando o protocolo I2C. O código foi escrito por Julio C. Rosa e é baseado na biblioteca Si4735-I2C-R4 fornecida abaixo junto com o código e o esquema. Embora o fabricante diga que este chip (Si4730) é apenas para AM / FM, ele também funciona em SW. Para saída de áudio eu uso placa de amplificador digital mini 2 * 3W PAM8403 Classe D que é muito barata e funcional.
O dispositivo é montado em uma caixa adequada e representa um pequeno rádio World Band completo. Fora isso, eu moro no andar térreo em uma área relativamente densamente povoada e uso uma antena de dez metros de comprimento, então a recepção é bem fraca, mas ainda comparável aos rádios de bolso de qualidade comercial que eu possuo.
E por último, para mencionar que este chip é usado por muitas marcas conhecidas de rádios portáteis como TECSUN, DEGEN, SANGEAN e outros.
Código
Código C / C ++
/ ********************************************** *************************************************** ** Receptor JCR Si4730 / 5 LW / MW / SW / FM - Versão para compartilhar. Veja os esquemas para detalhes de fiação. Escrito por Julio C. Rosa - O CesarSound - Maio / 2019 Comandos:radio.volumeUp (); radio.volumeDown (); radio.seekDown (); radio.seekUp (); radio.mute (); radio.unmute (); radio.setMode (FM); radio.tuneFrequency (9490); radio.getStatus (); radio.getVolume (); radio.getMode (); radio.getMute (); radio.toggleMute (); RSQMetrics rsq; radio.getRSQ (&rsq); (rsq.stereo); print_number (rsq.stereoBlend); print_number (rsq.SNR); (rsq.seekable); print_number (rsq.RSSI); print_mode (); print_station_freq (); print_volume (); print_mute (); print_home (); radio.getCallSign (callSign); printp (rds1); Serial.write (callSign); radio.getProgramTypeStr (programType); Serial.write (programType); (rds1); (rds2); (rds3); (rds4); (rds5); ********************************************* *************************************************** ***** /// Library # include #include #include #include "Wire.h" // I / O SettingsRotary r =Rotary (2, 3 ); LiquidCrystal lcd (12, 13, 7, 6, 5, 4); banda de bytes const =A0; // Configuração da variável sem sinal freq int =880; sem sinal freqmax =10800; sem sinal int freqmin =50; sem sinal int fstep =10; unsigned int freqold; unsigned int buttonstate; unsigned int count =15; // Cria uma instância do Si4730 / 5 chamada radio.Si4735 radio; void setup () {lcd.begin (16, 2); PCICR | =(1 <>"); lcd.setCursor (3, 0); lcd.print (":"); lcd.setCursor (13, 0); lcd.print ("kHz");} // Encoder InterruptISR (PCINT2_vect) {resultado de caractere não assinado =r.process (); if (resultado) {if (resultado ==DIR_CW) {freq =freq + fstep; if (freq> =freqmax) {freq =freqmax; }} else {freq =freq - fstep; if (freq <=freqmin) {freq =freqmin; }}}} void loop () {if (freqold! =freq) {tune (); } freqold =freq; lcd.setCursor (5, 0); lcd.print (freq); lcd.print (""); buttonstate =digitalRead (banda); // Seletor de bandas if (buttonstate ==LOW) {inc_preset (); enquanto (digitalRead (banda) ==0); } // Medidor - S-Meter (dBu) e SNR (dB) - descomente se quiser usar RSQMetrics rsq; radio.getRSQ (&rsq); lcd.setCursor (0, 2); lcd.print ("dBu:"); lcd.print (rsq.RSSI); lcd.setCursor (9, 2); lcd.print ("dB:"); lcd.print (rsq.SNR);} // Presets INCvoid inc_preset () {count ++; if (contagem> 15) contagem =1; presets de banda (); delay (100);} // Presets Seletor de Bandasvoid bandpresets () {lcd.setCursor (0, 0); switch (contagem) {caso 1:freq =370; radio.setMode (LW); radio.tuneFrequency (freq); command_am (); fstep =5; lcd.print ("LW1"); pausa; caso 2:freq =620; radio.setMode (AM); radio.tuneFrequency (freq); fstep =5; lcd.print ("MW1"); pausa; caso 3:freq =840; radio.setMode (AM); radio.tuneFrequency (freq); fstep =5; lcd.print ("MW2"); pausa; caso 4:freq =3700; radio.setMode (SW); radio.tuneFrequency (freq); fstep =5; lcd.print ("SW0"); pausa; caso 5:freq =4985; radio.setMode (SW); radio.tuneFrequency (freq); fstep =5; lcd.print ("SW1"); pausa; caso 6:freq =6010; radio.setMode (SW); radio.tuneFrequency (freq); fstep =1; lcd.print ("SW2"); pausa; caso 7:freq =7200; radio.setMode (SW); radio.tuneFrequency (freq); fstep =1; lcd.print ("SW3"); pausa; caso 8:freq =10000; radio.setMode (SW); radio.tuneFrequency (freq); fstep =5; lcd.print ("SW4"); pausa; caso 9:freq =11940; radio.setMode (SW); radio.tuneFrequency (freq); fstep =5; lcd.print ("SW5"); pausa; caso 10:freq =13710; radio.setMode (SW); radio.tuneFrequency (freq); fstep =5; lcd.print ("SW6"); pausa; caso 11:freq =15400; radio.setMode (SW); radio.tuneFrequency (freq); fstep =5; lcd.print ("SW7"); pausa; caso 12:freq =17560; radio.setMode (SW); radio.tuneFrequency (freq); fstep =5; lcd.print ("SW8"); pausa; caso 13:freq =21505; radio.setMode (SW); radio.tuneFrequency (freq); fstep =5; lcd.print ("SW9"); pausa; caso 14:freq =27015; radio.setMode (SW); radio.tuneFrequency (freq); fstep =5; lcd.print ("CB1"); pausa; caso 15:freq =9700; radio.setMode (FM); radio.tuneFrequency (freq); fstep =10; lcd.print ("FM1"); pausa; }} // Sintonizador - tunervoid tune () {radio.tuneFrequency (freq);} // Comandos soft mute off / AVC max gainvoid command_am () {radio.setProperty (PROP_AM_SOFT_MUTE_MAX_ATTENUATION, 0); // 0 (OFF) - 63 radio.setProperty (PROP_AM_AUTOMATIC_VOLUME_CONTROL_MAX_GAIN, 0x3A98); // 1000 - 7800}
Bibliotecas C / C ++
Sem visualização (somente download).