Crear un Transmisor de Música AM con Arduino Nano
Componentes y Suministros
| Arduino Nano R3 | × | 1 |
| Resistencia 10k ohm | × | 2 |
| Condensador 10 µF | × | 1 |
| Protoboard (genérica) | × | 1 |
Aplicaciones y Servicios Online
- Arduino IDE
Sobre el Proyecto
Se pueden hacer cosas interesantes con MCUs ATmega. Así que se me ocurrió construir un transmisor AM con un Arduino Nano (cualquier otro Arduino también sirve).
La pregunta es: ¿cómo se puede lograr modulación de amplitud (AM) en un dispositivo digital? AM significa que la amplitud de una frecuencia portadora cambia según la amplitud de la señal de entrada que queremos transmitir. Matemáticamente, multiplicamos la portadora por la señal de entrada. Pero como un ATmega solo tiene salidas digitales, solo puede dar dos valores: alto y bajo. Francamente, no hay forma de obtener AM real de un Arduino.
Sin embargo, ¡es posible producir una señal de salida que se escuche claramente con un receptor de radio AM normal!
La solución consiste en transformar la señal analógica de entrada en una señal PWM, usando el ADC y el temporizador/contador 1 de 16 bits del MCU ATmega.
El temporizador/contador 2 genera la señal portadora, que puede variar en un amplio rango entre 31 kHz y 8 MHz.
Esta señal portadora se emite por el pin D11 al ritmo de la señal PWM. La radio AM se comporta como un filtro paso bajo sobre el PWM, así que recuperamos la señal de audio original.
Esto es solo una prueba de concepto, así que lo mantuve simple. Si realmente quieres usarlo como transmisor RF, deberías añadir un filtro paso bajo para anti-aliasing en la entrada de audio y un filtro paso bajo contra armónicos en la salida RF.
Código
Transmisor AM Arduino C/C++
/* Esta obra está licenciada bajo Creative Commons Attribution-ShareAlike 4.0 International License.
Para ver una copia de esta licencia, visita https://creativecommons.org/licenses/by-sa/4.0/. */
#define ANTENNA_PIN PB3 // Arduino Nano/Uno D11
void setup() {
Serial.begin(115200);
// Generación de frecuencia portadora
uint32_t fTransmit = 600; // KHz
DDRB |= (1 << ANTENNA_PIN);
TCCR2A = (0 << COM2A1) + (1 << COM2A0); // Toggle OC0A on Compare Match
TCCR2A |= (1 << WGM21) + (0 << WGM20); // CTC
TCCR2B = (0 << CS22) + (0 << CS21) + (1 << CS20); // Sin preescalado
OCR2A = F_CPU / (2000 * fTransmit) - 1;
char strbuf[255];
sprintf(strbuf, "Will broadcast at %d KHz", (F_CPU / (2 * (1 + OCR2A)) / 1000));
Serial.println(strbuf);
// Generación de señal PWM
TCCR1A |= (1 << WGM11) + (1 << WGM10); // Fast PWM 10 Bit
TCCR1B = (1 << WGM12);
TCCR1B |= (0 << CS12) + (0 << CS11) + (1 << CS10); // Sin preescalado
TIMSK1 = (1 << OCIE1A) + (1 << TOIE1);
// Configuración ADC
ADMUX = (1 << REFS1) + (1 << REFS0); // Referencia interna 1.1V
ADCSRA = (1 << ADEN) + (1 << ADSC) + (1 << ADATE); // Auto Trigger enable, free running
ADCSRA |= (1 << ADPS2) + (1 << ADPS1) + (0 << ADPS0); // Dividir por 64 -> 18.5k Sample rate
DIDR0 = (1 << ADC0D);
}
ISR(TIMER1_OVF_vect) {
uint8_t adcl = ADCL;
uint8_t adch = ADCH;
OCR1A = (adch << 8) + adcl;
DDRB |= (1 << ANTENNA_PIN);
}
ISR(TIMER1_COMPA_vect) {
DDRB &= ~(1 << ANTENNA_PIN);
}
void loop() {
}
Esquemáticos

Proceso de manufactura
- El legado y evolución del jukebox clásico
- Partituras: De manuscritos medievales a edición moderna — Visión de la industria
- Semáforos: Ingeniería, Historia e Innovaciones Futuras
- Construya su propio LUMAZOID: Visualizador de música DIY con Arduino
- Construye un Spybot controlado por Bluetooth con Arduino
- Decodifica señales PPM de receptor RC con Arduino: Guía paso a paso
- FlickMote: Mando IR por gestos para Smart Home
- TV‑B‑Gone DIY con Arduino: Mando universal para apagar cualquier TV
- Construye un Reloj Maestro LED Personalizado con Alarma – Visible desde 12 Metros
- Find Me: Localizador Inteligente de Objetos con Arduino y Bluetooth
- Uso Fácil de Termistor: Guía Paso a Paso con Arduino