Doctor Volt
Published © CC BY-SA

(Ab)use an Arduino as AM Music Transmitter!

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

BeginnerFull instructions provided2 hours30,638
(Ab)use an Arduino as AM Music Transmitter!

Things used in this project

Hardware components

Arduino Nano R3
Arduino Nano R3
×1
Resistor 10k ohm
Resistor 10k ohm
×2
Capacitor 10 µF
Capacitor 10 µF
×1
Breadboard (generic)
Breadboard (generic)
×1
Ferrite antenna
From Ebay or old radio
×1
tuning capacitor or assortment
×1

Software apps and online services

Arduino IDE
Arduino IDE

Story

Read more

Schematics

Schematic

Code

Arduino AM Transmitter

C/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/.*/

// OCR2 values for available Transmit frequencies: OCR2A/B = 8000/Ft[Khz] - 1
#define F_8MHZ 0
#define F_4MHZ 1
#define F_2666 2
#define F_2000 3
#define F_1600 4
#define F_1333 5
#define F_1143 6
#define F_1000 7
#define F_880 8
#define F_800 9
#define F_727 10
#define F_666 11
#define F_615 12
#define F_571 13
#define F_533 14
#define F_500 15

#define FRQ F_1600 //Replace OCR2 value for frequency here, if necessary

#define ANTENNA_1 PD3 //Arduino Nano/Uno Pin D3
#define ANTENNA_2 PB3 //Arduino Nano/Uno Pin D11


void setup() {
	//Timer 2: Carrier Frequency generation
	TCCR2A = bit(COM2A0) + bit(COM2B0); // Toggle OC0A (Pin 11) and OC0B (Pin 3) on Compare Match
	bitSet(TCCR2A, WGM21); // CTC Mode
	TCCR2B = bit(CS20); // No clock Prescaling
	OCR2A = FRQ;
	OCR2B = FRQ;
	bitSet(TCCR2B, FOC2B);  // Force Output Compare B; Toggle inverted
	
	//Timer 1: PWM
	pinMode(9, OUTPUT);
	TCCR1A =  bit(WGM11) + bit(WGM10); //Fast PWM, 10 Bit
	TCCR1B = bit(WGM12) + bit(CS10); // No Prescaling
  TIMSK1 = bit(OCIE1A) + bit(TOIE1);// Output Compare A Match and overflow Interrupt Enable
	//TCCR1A += bit(COM1A0) + bit(COM1A1); //Toggle Pin 9 on compare match

	//ADC Settings
	ADMUX = bit(REFS1) + bit(REFS0); //Reference internal 1.1V
	ADCSRA = bit(ADEN) + bit(ADSC) + bit(ADATE); //Auto Trigger enable, free running
	ADCSRA += bit(ADPS2) + bit(ADPS1); //Divide by 64 -> 18.5k Sample rate
	DIDR0 = bit(ADC0D);
}

/* Overflow Interrupt*/
ISR(TIMER1_OVF_vect) {
	uint16_t adc = ADC;
	OCR1A = adc;
	bitSet(DDRD, ANTENNA_1); // timer 2 outputs on
	bitSet(DDRB, ANTENNA_2);
}

/* Output Compare A Match Interrupt */
ISR(TIMER1_COMPA_vect) {
	bitClear(DDRD, ANTENNA_1); // timer 2 outputs off
	bitClear(DDRB, ANTENNA_2);
}

void loop() 
{
}

Credits

Doctor Volt

Doctor Volt

19 projects • 127 followers

Comments