Construye una radio de todas las bandas con Si4730 y Arduino Nano: LW, MW, SW, FM
Componentes y suministros
| Arduino Nano R3 | × | 1 |
| Módulo de radio Si4730 | × | 1 |
| Pantalla LCD estándar Adafruit 16x2 Blanco sobre Azul | × | 1 |
| Codificador rotativo con pulsador | × | 1 |
| Placa de desarrollo, Módulo amplificador de audio Clase D | × | 1 |
| Altavoz: 0.25W, 8 ohmios | × | 1 |
| Barra de ferrita de vieja radio MW | × | 1 |
| Interruptor deslizante | × | 1 |
Herramientas y máquinas necesarias
- Soldador (genérico)
Aplicaciones y servicios en línea
- Arduino IDE
Sobre este proyecto
Cuando mencionas radio Arduino, siempre piensas en radio FM moderna (88-108 MHz en Europa). Las bandas LW, MW y SW cubren el rango de 0,2 a 30 MHz. La SW es especialmente interesante. Las ondas de radio en la banda de onda corta pueden reflejarse o refractarse desde una capa de átomos cargados eléctricamente en la atmósfera llamada ionosfera. Así, la radio de onda corta puede usarse para comunicaciones de muy larga distancia, a veces continentes enteros o más allá.
A continuación presento el desarrollo de una radio que cubre todas las bandas mencionadas. El «corazón» de esta radio es el IC Si4730 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 se controla mediante 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 uso una mini placa amplificadora digital 2x3W PAM8403 Clase D, que es muy barata y funcional.
El dispositivo se ensambla en una carcasa adecuada y representa una pequeña radio de ondas mundiales completa. Vivo en la planta baja en una zona relativamente densamente poblada y uso una antena de diez metros, por lo que la recepción es bastante débil, pero aún comparable a las radios de bolsillo comerciales que tengo.
Por último, mencionar que este chip es usado por muchas marcas conocidas de radios portátiles como TECSUN, DEGEN, SANGEAN y otras.
Código
- Código principal
- Bibliotecas
Código C/C++
/**************************************************************************************************
JCR Si4730/5 Receiver LW/MW/SW/FM - Versión para compartir. Ver esquemáticos para detalles de cableado.
Escrito por Julio C. Rosa - The CesarSound - May/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);
*****************************************************************************************************/
// Librerías
#include <Si4735.h>
#include <LiquidCrystal.h>
#include <rotary.h>
#include "Wire.h"
// Configuración I/O
Rotary r = Rotary(2, 3);
LiquidCrystal lcd(12, 13, 7, 6, 5, 4);
const byte band = A0;
// Configuración de variables
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;
// Crear una instancia del Si4730/5 llamada radio.
Si4735 radio;
void setup() {
lcd.begin(16, 2);
PCICR |= (1 << PCIE2);
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
sei();
// Pulsador selector de bandas
pinMode(band, INPUT_PULLUP);
// Inicializar la radio. Modos posibles: AM, FM, SW, LW.
radio.begin();
radio.setMode(AM);
command_am();
// Establecer frecuencia inicial
radio.tuneFrequency(freq);
lcd.setCursor(0, 2);
lcd.print("JCR Multiband Rx");
lcd.setCursor(0, 0);
lcd.print("F>>");
lcd.setCursor(3, 0);
lcd.print(":");
lcd.setCursor(13, 0);
lcd.print("kHz");
}
// Interrupción del codificador
ISR(PCINT2_vect) {
unsigned char result = r.process();
if (result) {
if (result == 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(band);
// Selector de bandas
if (buttonstate == LOW) {
inc_preset();
while (digitalRead(band) == 0);
}
// Medidor - S-Meter (dBu) y SNR (dB) - descomentar si se desea 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 INC
void inc_preset() {
count++;
if (count > 15) count = 1;
bandpresets();
delay(100);
}
// Presets Selector de Bandas
void bandpresets() {
lcd.setCursor(0, 0);
switch (count) {
case 1: freq = 370; radio.setMode(LW); radio.tuneFrequency(freq); command_am(); fstep = 5; lcd.print("LW1"); break;
case 2: freq = 620; radio.setMode(AM); radio.tuneFrequency(freq); fstep = 5; lcd.print("MW1"); break;
case 3: freq = 840; radio.setMode(AM); radio.tuneFrequency(freq); fstep = 5; lcd.print("MW2"); break;
case 4: freq = 3700; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW0"); break;
case 5: freq = 4985; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW1"); break;
case 6: freq = 6010; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 1; lcd.print("SW2"); break;
case 7: freq = 7200; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 1; lcd.print("SW3"); break;
case 8: freq = 10000; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW4"); break;
case 9: freq = 11940; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW5"); break;
case 10: freq = 13710; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW6"); break;
case 11: freq = 15400; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW7"); break;
case 12: freq = 17560; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW8"); break;
case 13: freq = 21505; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW9"); break;
case 14: freq = 27015; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("CB1"); break;
case 15: freq = 9700; radio.setMode(FM); radio.tuneFrequency(freq); fstep = 10; lcd.print("FM1"); break;
}
}
// Sintonizador
void tune() {
radio.tuneFrequency(freq);
}
// Comandos soft mute off / AVC max gain
void 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++
Sin vista previa (solo descarga).
Esquemáticos
No se proporcionan esquemáticos en el proyecto original.
Proceso de manufactura
- La Evolución e Ingeniería de la Tecnología de Radio
- La Evolución y Producción de las Gomas Elásticas
- Thermocam DIY: de idea en el aula a producto global
- Kit esterilizador UVC DIY: caja UV de bajo costo y fácil construcción para artículos médicos y personales
- Radio Internet Wi‑Fi con Raspberry Pi y Arduino: Emisoras globales en streaming
- Generador de Ondas JX – Oscilador DDS Compatible con Arduino con Pantalla OLED
- Construye un Skateboard VR Casero con Arduino, Google Cardboard y Bluetooth
- Construye una radio FM a prueba de agua para la ducha con Arduino Nano, RDA5807, LCD Nokia y PAM8403
- Asistente de voz J.A.R.V.I.S DIY con Arduino y diseño Arc Reactor
- Sierra de cinta vertical: Propósito, características y aplicaciones
- Circuitos de Radio a Cristal y Transistor: Desde Detectores Básicos a Receptores AM/FM Integrados