Acerca de este proyecto
Cuando mencionas la radio Arduino, siempre piensas en la radio FM moderna (88-108 MHz en Europa). Las bandas LW, MW y SW cubren el rango de 0,2 a 30 MHz. SW es especialmente interesante. Las ondas de radio en la banda de onda corta pueden reflejarse o refractarse de una capa de átomos cargados eléctricamente en la atmósfera llamada ionosfera. Por lo tanto, la radio de onda corta se puede utilizar para comunicaciones de muy larga distancia, a veces continentes enteros o más allá.
A continuación les presentaré el desarrollo de una radio que cubre todas las bandas mencionadas anteriormente. El "corazón" de esta radio es Si4730 IC de Silicon Labs, que se puede comprar en AliExpress en forma de una pequeña placa de desarrollo por unos pocos dólares.
Esta placa está controlada por un Arduino usando el protocolo I2C. El código está escrito por Julio C. Rosa y se basa en la biblioteca Si4735-I2C-R4 que se proporciona a continuación junto con el código y el esquema. Aunque el fabricante dice que este chip (Si4730) es solo para AM / FM, en realidad también funciona en SW. Para la salida de audio utilizo una placa amplificadora digital mini 2 * 3W PAM8403 Clase D que es muy económica y funcional.
El dispositivo está montado en una carcasa adecuada y representa una pequeña radio World Band completa. De lo contrario, vivo en la planta baja en un área relativamente densamente poblada y uso una antena de diez metros de largo, por lo que la recepción es bastante débil, pero aún comparable a las radios de bolsillo de calidad comercial que tengo.
Y por último mencionar que este chip es utilizado por muchas marcas reconocidas de radios portátiles como TECSUN, DEGEN, SANGEAN y otras.
Código
Código C / C ++
/ ******************************************** *********************************************** ** Receptor JCR Si4730 / 5 LW / MW / SW / FM - Versión para compartir. Consulte los esquemas para conocer los detalles del cableado. Escrito por Julio C. Rosa - El CesarSound - Mayo / 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); número_impresión (rsq.stereoBlend); número_impresión (rsq.SNR); (rsq.seekable); número_impresión (rsq.RSSI); modo_impresión (); print_station_freq (); print_volume (); print_mute (); print_home (); radio.getCallSign (callSign); printp (rds1); Serial.write (callSign); radio.getProgramTypeStr (programType); Serial.write (tipo de programa); (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); const byte band =A0; // Ajuste variable unsigned int freq =880; unsigned int freqmax =10800; unsigned int freqmin =50; unsigned int fstep =10; unsigned int freqold; unsigned int buttonstate; unsigned int count =15; // Cree una instancia de la radio Si4730 / 5 llamada radio.Si4735; void setup () {lcd.begin (16, 2); PCICR | =(1 <>"); lcd.setCursor (3, 0); lcd.print (":"); lcd.setCursor (13, 0); lcd.print ("kHz");} // Codificador InterruptISR (PCINT2_vect) {unsigned char result =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 (frecuencia); lcd.print (""); buttonstate =digitalRead (banda); // Selector de bandas if (buttonstate ==LOW) {inc_preset (); while (lectura digital (banda) ==0); } // Medidor - S-Meter (dBu) e SNR (dB) - descomente si desea utilizar 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 ++; si (cuenta> 15) cuenta =1; bandpresets (); delay (100);} // Presets Seletor de Bandasvoid bandpresets () {lcd.setCursor (0, 0); switch (count) {caso 1:freq =370; radio.setMode (LW); radio.tuneFrequency (freq); comando_am (); fstep =5; lcd.print ("LW1"); descanso; caso 2:frecuencia =620; radio.setMode (AM); radio.tuneFrequency (freq); fstep =5; lcd.print ("MW1"); descanso; caso 3:frecuencia =840; radio.setMode (AM); radio.tuneFrequency (freq); fstep =5; lcd.print ("MW2"); descanso; caso 4:frecuencia =3700; radio.setMode (SW); radio.tuneFrequency (freq); fstep =5; lcd.print ("SW0"); descanso; caso 5:frecuencia =4985; radio.setMode (SW); radio.tuneFrequency (freq); fstep =5; lcd.print ("SW1"); descanso; caso 6:frecuencia =6010; radio.setMode (SW); radio.tuneFrequency (freq); fstep =1; lcd.print ("SW2"); descanso; caso 7:frecuencia =7200; radio.setMode (SW); radio.tuneFrequency (freq); fstep =1; lcd.print ("SW3"); descanso; caso 8:frecuencia =10000; radio.setMode (SW); radio.tuneFrequency (freq); fstep =5; lcd.print ("SW4"); descanso; caso 9:frecuencia =11940; radio.setMode (SW); radio.tuneFrequency (freq); fstep =5; lcd.print ("SW5"); descanso; caso 10:frecuencia =13710; radio.setMode (SW); radio.tuneFrequency (freq); fstep =5; lcd.print ("SW6"); descanso; caso 11:frecuencia =15400; radio.setMode (SW); radio.tuneFrequency (freq); fstep =5; lcd.print ("SW7"); descanso; caso 12:frecuencia =17560; radio.setMode (SW); radio.tuneFrequency (freq); fstep =5; lcd.print ("SW8"); descanso; caso 13:frecuencia =21505; radio.setMode (SW); radio.tuneFrequency (freq); fstep =5; lcd.print ("SW9"); descanso; caso 14:frecuencia =27015; radio.setMode (SW); radio.tuneFrequency (freq); fstep =5; lcd.print ("CB1"); descanso; caso 15:frecuencia =9700; radio.setMode (FM); radio.tuneFrequency (freq); fstep =10; lcd.print ("FM1"); descanso; }} // 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 (APAGADO) - 63 radio.setProperty (PROP_AM_AUTOMATIC_VOLUME_CONTROL_MAX_GAIN, 0x3A98); // 1000 - 7800}
Bibliotecas C / C ++
Sin vista previa (solo descarga).