Project tutorial
(Ab)use an Arduino as AM Music Transmitter!

(Ab)use an Arduino as AM Music Transmitter! © CC BY

See how an Arduino can be transmit music over AM with only a few lines of code.

  • 3,777 views
  • 13 comments
  • 28 respects

Components and supplies

Apps and online services

About this project

Cool things can be done with ATmega MCUs. So I got the idea to build an AM transmitter with an Arduino Nano (any other Arduino is also possible)

The question is, how can amplitude modulation (AM) be achieved on a digital device? AM means that the amplitude of a carrier frequency is changed according to the amplitude of the input signal which we want to transmit. Mathematically spoken, we multiply the carrier with the input signal. But as an ATmega has only digital outputs, it can give only two values: high and low. Frankly spoken, there is no way to get real AM out of an Arduino.

Nevertheless it is possible to produce some output signal that can be heard clearly with an ordinary AM radio receiver!

The solution consists of transforming the analog input signal into a PWM signal, using the ADC and the 16-bit timer/counter1 of the ATmega MCU.

The timer/counter2 generates the carrier signal, which can be varied in a wide range between 31KHz and 8MHz.

This carrier signal is output on pin D11 in the rhythm of the PWM signal. The AM radio behaves like a low pass filter on the PWM, so we get back the original audio signal there.

This is only a proof of concept, so I kept it simple. If you really want to use this as RF transmitter, you should add a low-pass fillter for anti-aliasing to the audio input and a low pass against the harmonics to the RF output.


Code

Arduino AM TransmitterC/C++
/*This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/.*/

#define ANTENNA_PIN PB3 //Arduino Nano/Uno D11

// the setup function runs once when you press reset or power the board
void setup() {
	Serial.begin(115200);

	//Carrier Frequency generation
	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); //No Prescaling
	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);

	//PWM Signal generation
	//TCCR1A |= (0 << WGM11) + (1 << WGM10);  //Fast PWM 8 Bit
	//TCCR1A |= (1 << WGM11) + (0 << WGM10);  //Fast PWM 9 Bit
	TCCR1A |= (1 << WGM11) + (1 << WGM10); //Fast PWM 10 Bit
	TCCR1B = (1 << WGM12);					
	TCCR1B |= (0 << CS12) + (0 << CS11) + (1 << CS10); //No Prescaling
	TIMSK1 = (1 << OCIE1A) + (1 << TOIE1);

	//ADC Settings
	ADMUX = (1 << REFS1) + (1 << REFS0); //Reference internal 1.1V
	ADCSRA = (1 << ADEN) + (1 << ADSC) + (1 << ADATE); //Auto Trigger enable, free running
	ADCSRA |= (1 << ADPS2) + (1 << ADPS1) + (0 << ADPS0); //Divide by 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() {
}

Schematics

Schematic
Capture ugarrktysj

Comments

Similar projects you might like

Out of My League - Music on Arduino

Project tutorial by MrZmann

  • 1,350 views
  • 0 comments
  • 2 respects

Music Reactive LED Strip

Project showcase by buzzandy

  • 69,370 views
  • 77 comments
  • 143 respects

TuneGlass: Can We Make MUSIC Using Our EYES???

Project tutorial by ashraf_minhaj

  • 1,836 views
  • 0 comments
  • 12 respects

Polyphonic Music - Avengers

Project tutorial by marcelomaximiano

  • 9,182 views
  • 9 comments
  • 48 respects

Play Music With Your Remote

Project tutorial by Simone Adobs

  • 8,425 views
  • 22 comments
  • 30 respects

Infinity Mirror VU Meter Music Equalizer

Project showcase by TheTNR

  • 8,004 views
  • 4 comments
  • 37 respects
Add projectSign up / Login