Construye una Radio FM Fiable con Componentes SparkFun y Arduino
Componentes y suministros
| Componente | Cantidad | Notas |
|---|---|---|
| SparkFun FM Tuner Basic Breakout - Si4703 | 1 | Sintonizador FM en chip Si4703 |
| Altavoz SparkFun - 0.5 Watt (8 Ohm) | 1 | Ideal para proyectos de radio pequeños |
| Pantalla OLED gráfica monocromática Adafruit 0.96" 128x64 | 1 | Alto contraste y bajo consumo |
| Amplificador de audio LM386 - DIP-8 (Texas Instruments) | 1 | Clásico para proyectos de audio a batería |
| Arduino Nano R3 | 1 | Controlador principal (16 MHz, 5V) |
| Teclado de membrana 1x4 (Adafruit) | 2 | Control de volumen y sintonía |
| Convertidor de nivel lógico I2C bidireccional 4 canales (Adafruit) | 1 | Para conectar dispositivos 3.3V al bus I2C de 5V del Nano |
| Antena telescópica FM con conector F | 1 | Recepción óptima |
| Conector F tipo panel atornillable | 1 | Montaje de la antena en caja |
Sobre el proyecto
De niño construí radios AM, pero las FM resultaban demasiado complejas. Hoy existen sintonizadores FM completos en un solo chip, aunque son componentes SMD difíciles de soldar para aficionados. Afortunadamente, SparkFun ofrece una placa breakout para el chip Si4703 de Silicon Laboratories, que expone todos los pines. Te mostraré cómo construir una radio FM completa alrededor de esta placa y controlar el sintonizador mediante Arduino a través de su interfaz de dos hilos (I2C). SparkFun proporciona una biblioteca completa que simplifica la programación.
Además, añadí una pequeña pantalla OLED de alto contraste y consumo mínimo. Finalmente, explicaré cómo construir un amplificador de audio mono de gran calidad con componentes mínimos. La radio terminada funciona con tres pilas AA durante muchas horas.
Placa SparkFun FM Tuner Basic Breakout y bus I2C
La placa breakout es fácil de usar. Primero suelda los conectores macho para usarla en protoboard. Consulta la distribución de pines abajo. Un metro de cable fino soldado al pin ANT funciona como antena provisional.
- LOUT y ROUT: Salidas de audio izquierdo y derecho, se conectan al amplificador.
- Vcc: Alimentación +3.3V.
- GND: Tierra (0V).
El Si4703 usa una interfaz de dos hilos (I2C) para control serial desde Arduino. Las líneas son:
- Línea de datos serie (SDA) - llamada SDIO en el Si4703
- Línea de reloj serie (SCL) - llamada SCLK en el Si4703
- Línea de reinicio (RST)
Todos los Arduino tienen I2C integrado. En nuestro bus, el Arduino actúa como maestro y tanto el Si4703 como la pantalla OLED como esclavos.
Niveles de voltaje en el bus I2C y elección de Arduino
Tanto el Si4703 como la pantalla OLED operan a 3.3V en el bus I2C. SparkFun recomienda en su guía usar un Arduino de 3.3V (como el Pro Mini), pero este funciona a 8 MHz, la mitad de velocidad que un Nano o Uno. Mis pruebas mostraron que 8 MHz es demasiado lento para manejar la pantalla OLED.
Opté por un Arduino Nano (16 MHz, 5V) y usé convertidores bidireccionales de nivel lógico I2C para conectar las señales de 3.3V de la pantalla y el chip de radio. Necesitamos convertir tres señales: SDA, SCL y RST. Usé dos convertidores de 2 canales cada uno (existen de 4 canales para simplificar cableado).
El Nano es casi idéntico al Uno pero en formato reducido. Ambos tienen conector USB y son fáciles de programar con el IDE de Arduino.
Esquemáticos: Conexiones Arduino a radio y pantalla
El proyecto se alimenta con tres pilas AA (4.5V) conectadas directamente al pin 5V del Nano, saltándose el regulador interno. ¡ADVERTENCIA! Desconecta siempre las pilas antes de conectar el Nano por USB al ordenador. De lo contrario, los 5V del PC harían cortocircuito con las pilas. Durante las pruebas iniciales, alimenta el circuito solo por USB sin pilas.
Para mayor seguridad, usa seis pilas AA (9V) conectando el positivo al pin VIN del Nano (en lugar del pin 5V). Así la gestión de energía del Nano desconectará automáticamente las pilas al conectar el USB. (Una pila de 9V bloque también sirve, pero durará solo unas horas).
- Arduino SDA (A4) y SCL (A5) → lado 5V del convertidor I2C
- Pin D2 → señal RST al lado 5V del convertidor
- Lado 3.3V del convertidor → SDIO, SCLK y RST del Si4703
- Pantalla OLED → solo SDA y SCL al lado 3.3V (la mía no tenía pin RST)
- Todos los componentes a 3.3V del Nano y GND
- Convertidor I2C: 5V en lado alto voltaje
- Pines D5-D12 → dos teclados (pulsación conecta entrada a GND)
Amplificador de audio de bajo voltaje LM386
Usé el LM386 para construir un amplificador mono. Este chip existe desde los 70 y está diseñado para aplicaciones de audio de bajo voltaje. Su ganancia interna es 20, pero añadiendo un resistor y capacitor entre pines 1 y 8 se puede aumentar hasta 200. Trabajaremos con la ganancia mínima de 20, más que suficiente para un altavoz de 8 Ohm.
El esquema del amplificador:
En el Si4703, las salidas de audio se conectan así: R4 a LOUT y R5 a ROUT, combinándose en señal MONO. La placa breakout ya tiene condensadores de salida, no hace falta añadirlos. R2 y R3 forman un divisor de tensión para ajustar el nivel de entrada al amplificador. Podrías usar un potenciómetro para control de volumen analógico, pero controlaremos el volumen digitalmente: el Si4703 permite ajustar la salida de 1 a 15 vía I2C. Con R2/R3 adaptas este rango al amplificador experimentando con resistencias (aumentar R3 sube el volumen).
El circuito sigue la hoja de datos. C2 debe ser ≥220 µF (valores menores atenúan graves). C3 cerca del chip; C3 y C1 son opcionales.
Clave para buen sonido: Muchos proyectos LM386 suenan mal por mala disposición de masas. Observa cómo separé la masa de entrada de la de salida; solo se unen en el pin 4 (tierra del chip). Para profundizar, mira los videos de JohnAudioTech.
El LM386N-1 necesita mínimo 4V y entrega cientos de mW. Con 3 pilas AA (4.5V) logro volumen 1-10 con buena calidad. Importante: usa altavoz de 8 Ohm (no 4 Ohm) a bajo voltaje. Al volumen 15 distorsiona. Para más volumen, sube alimentación a 9V.
Prototipado
Recomiendo encarecidamente montar primero todo en dos protoboards. Mantén Arduino, convertidor I2C y pantalla OLED en una; el Si4703 y el amplificador juntos en otra para minimizar interferencias acústicas. En mi primer prototipo tenía el Si4703 cerca del Arduino con cables largos a la parte de audio y causaba distorsiones.
Alimenta el Arduino por USB (su salida 3.3V regula la pantalla y chip de radio). Alimenta el LM386 con pilas (4.5-9V).
Código del programa
Bibliotecas necesarias:
#include <SparkFunSi4703.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
La biblioteca SparkFun simplifica el control I2C del Si4703. Las bibliotecas Adafruit con tutorial están aquí.
Definiciones principales:
// Botones de control
#define volDown 9
#define volUp 10
#define channelDown 11
#define channelUp 12
// Chip Si4703
#define resetPin 2
#define SDIO A4
#define SCLK A5
Si4703_Breakout radio(resetPin, SDIO, SCLK);
#define SI4703Address 0x10 // Dirección I2C Si4703
El uso de #define hace el código más legible. Tras definir volDown como pin 9, escribes volDown cada vez que te refieres a D9.
Sección setup():
int channel;
int volume;
void setup() {
// Resistencias pull-up internas en entradas
pinMode(volDown, INPUT_PULLUP);
pinMode(volUp, INPUT_PULLUP);
pinMode(channelUp, INPUT_PULLUP);
pinMode(channelDown, INPUT_PULLUP);
// Inicializar radio
radio.powerOn();
channel = 882; // 88.2 MHz
radio.setChannel(channel);
volume = 4;
radio.setVolume(volume);
}
Los pines 9-12 son entradas con pull-up interno: nivel ALTO salvo pulsación (BAJO). La biblioteca SparkFun facilita el control con powerOn(), setChannel() y setVolume().
Bucle principal escucha botones y actúa:
void loop() {
// Volumen abajo
if (digitalRead(volDown) == LOW) {
if (volume > 0) volume--;
radio.setVolume(volume);
UpdateDisplay();
delay(100);
}
// Volumen arriba
if (digitalRead(volUp) == LOW) {
if (volume < 15) volume++;
radio.setVolume(volume);
UpdateDisplay();
delay(100);
}
// Canal abajo (seek)
if (digitalRead(channelDown) == LOW) {
channel = radio.seekDown();
UpdateDisplay();
delay(100);
}
// Canal arriba (seek)
if (digitalRead(channelUp) == LOW) {
channel = radio.seekUp();
UpdateDisplay();
delay(100);
}
}
El código completo (enlace al final) incluye cuatro botones para emisoras predefinidas y toda la gestión de la pantalla OLED, que consume casi toda la RAM disponible. Consulta el excelente tutorial de Adafruit para la biblioteca SSD1306. Ojo: la biblioteca no detecta automáticamente el tamaño de pantalla; debes especificarlo editando Adafruit_SSD1306.h tras instalarla.
Hay una función "avanzada" para medir nivel de batería comparándola con la referencia interna de 1.1V del chip AVR. Al funcionar con pilas, no tenemos referencia constante de 5V. Más info en Secret Arduino Voltmeter y foro Gammon.
De prototipo en protoboard a radio terminada
Si has llegado aquí, tienes un prototipo funcional en dos protoboards. Pasemos el circuito a dos placas perforadas (perfboards) y metamos todo en una caja de proyecto. Si no lo has hecho antes, no temas: no hay mucho que pueda salir mal y aprenderás sobre la marcha. Collin de Adafruit tiene dos videos introductorios recomendados: Breadboards & perfboards y Perfboard prototyping.
Decidí poner el Nano con los convertidores I2C (necesité dos) en una perfboard:
Para hacer esta perfboard seguí un tutorial que recomiendo estudiar en detalle: How to Prototype without using printed circuit boards. Paso 3: ¡haz tu plan de cableado! La planificación es el paso más importante y marca la diferencia entre éxito y fracaso. Consejos: usé hilo negro 22 AWG, demasiado grueso y difícil. Consigue "Wire Wrapping Wire" (30 AWG) en varios colores. Y usa una perfboard más grande. Hice conectores pin-header y usé cables Dupont para conectar las partes.
Coloca el Si4703 y el amplificador en una segunda perfboard. Aquí un tutorial para amplificador LM386 que puedes usar de inspiración: From Schematics to Veroboard. Sugiero usar zócalo IC para el LM386. Alternativamente, JohnAudioTech tiene un video completo de amplificador LM386 con buen layout separando masas de potencia y señal.
Necesitas una caja bonita. Collin muestra cómo hacerlo en este video. Me gustó especialmente la idea de usar cinta de pintor para marcar taladros. Compré cinta de pintor (poco adhesiva). Además de cinta y taladro, usa pistola de silicona caliente. Pega altavoz, perfboards, portapilas, etc. en la caja y conecta todo con cables Dupont. El resultado final:
Fui demasiado optimista y compré una caja pequeña. Para la abertura cuadrada de la pantalla en el frontal, corté con cúter desde dentro (para no marcar el exterior). No muy elegante, pero funcional. Pegué la pantalla con silicona caliente. Marqué el tamaño del altavoz, taladré muchos agujeros de 3mm para el sonido y pegué el altavoz por detrás.
En la foto aún se ve el cable de antena. Luego compré un conector F de panel y una antena telescópica FM. Aunque la antena mide solo 50 cm, la recepción es muy buena y el pequeño altavoz suena sorprendentemente bien. Lo más asombroso: no he cambiado las pilas aún tras muchos días de uso.
Otros proyectos de radio
Me inspiró inicialmente el video de Great Scott, que luego hizo una caja de madera. Más cercano en detalle es el Si4703 Pocket FM Radio de John Owen, que usa el mismo breakout SparkFun; revisa su descripción. Usé su código para la función Mono y medición de batería.
Código
Repositorio GitHub con código para Arduino Nano: https://github.com/Notthemarsian/FM-radio
Esquemáticos
Diagramas Fritzing radio FM: Archivos originales Fritzing, imágenes y PDF en GitHub
Proceso de manufactura
- La Evolución e Ingeniería de la Tecnología de Radio
- UnifiedWater v1 – Kit completo de sensor de calidad de agua con Arduino
- Radio Internet Wi‑Fi con Raspberry Pi y Arduino: Emisoras globales en streaming
- Construye una radio FM a prueba de agua para la ducha con Arduino Nano, RDA5807, LCD Nokia y PAM8403
- Sistema de votación portátil con conectividad GSM
- Construye un Amplificador de Audio Clase B Push-Pull de Alto Rendimiento con Op-Amp TL082
- Oscilador Histérico 555 – Construye un Multivibrador RC Clásico
- Circuitos de Radio a Cristal y Transistor: Desde Detectores Básicos a Receptores AM/FM Integrados
- Fundamentos de radio: cómo se generan y transmiten las ondas electromagnéticas
- Sensor de radio basado en átomos revela dirección de señal para comunicaciones más limpias
- Propagación Radio Tierra-a-Tierra: Entendiendo su Impacto en Enlaces Inalámbricos