Transmit AM audio on 727 KHz. using a voltage divider and an Arduino.
By Markus Gritsch
Note: with the actual circuit the signal is closer to 760 KHz.
Samples incoming audio at 34 KHz. and rebroadcasts as RF using the Arduino clock.
This is a simplification of Markus’ original circuit. It eliminates the tuned output circuit. Probably at the expense of increased harmonic distortion.
The voltage divider is uses 2 47K Ohm resistors and a 1 uF electrolytic capacitor. It is the input half of the original circuit.
http://dangerousprototypes.com/forum/viewtopic.php?f=56&t=2892#p28410
(I substituted 2 100 K Ohm resistors in parallel for each of the 47 K’s.)
A voltage divider is useful as a general purpose coupler, for sampling analog signals using Arduino PWM input.
The Arduino sketch is Markus’ original – reprinted here:
(note) Local file is AM_audio_transmitter.
// Simple AM Radio Signal Generator :: Markus Gritsch
// http://www.youtube.com/watch?v=y1EKyQrFJ−o
//
// /|\ +5V ANT
// | \ | /
// | −−−−−−−−−−−−−−−− \|/
// | | R1 | Arduino 16 MHz | C2 |
// | | 47k | | || | about
// audio C1 | | | TIMER_PIN >−−−−−||−−−−−+ 40Vpp
// input || | | | || |
// o−−−−−||−−−−−+−−−−−−−> INPUT_PIN | 1nF |
// +|| | | | )
// 1uF | | R2 | ATmega328P | ) L1
// | | 47k −−−−−−−−−−−−−−−− fres = ) 47uH
// fg < 7 Hz | | 734 kHz )
// | |
// | |
// −−− GND −−− GND
//
// fg = 1 / ( 2 * pi * ( R1 || R2 ) * C1 ) < 7 Hz
// fres = 1 / ( 2 * pi * sqrt( L1 * C2 ) ) = 734 kHz
#define INPUT_PIN 0 // ADC input pin
#define TIMER_PIN 3 // PWM output pin, OC2B (PD3)
#define DEBUG_PIN 2 // to measure the sampling frequency
#define LED_PIN 13 // displays input overdrive
#define SHIFT_BY 3 // 2 ... 7 input attenuator
#define TIMER_TOP 20 // determines the carrier frequency
#define A_MAX TIMER_TOP / 4
void setup() {
pinMode( DEBUG_PIN, OUTPUT );
pinMode( TIMER_PIN, OUTPUT );
pinMode( LED_PIN, OUTPUT );
// set ADC prescaler to 16 to decrease conversion time (0b100)
ADCSRA = ( ADCSRA | _BV( ADPS2 ) ) & ~( _BV( ADPS1 ) | _BV( ADPS0 ) );
// non−inverting; fast PWM with TOP; no prescaling
TCCR2A = 0b10100011; // COM2A1 COM2A0 COM2B1 COM2B0 − − WGM21 WGM20
TCCR2B = 0b00001001; // FOC2A FOC2B − − WGM22 CS22 CS21 CS20
// 16E6 / ( OCR2A + 1 ) = 762 kHz @ TIMER_TOP = 20
OCR2A = TIMER_TOP; // = 727 kHz @ TIMER_TOP = 21
OCR2B = TIMER_TOP / 2; // maximum carrier amplitude at 50% duty cycle
}
void loop() {
// about 34 kHz sampling frequency
digitalWrite( DEBUG_PIN, HIGH );
int8_t value = (analogRead( INPUT_PIN ) >> SHIFT_BY ) - (1 << (9 - SHIFT_BY ));
digitalWrite( DEBUG_PIN, LOW );
// clipping
if( value < -A_MAX) {
value = -A_MAX;
digitalWrite( LED_PIN, HIGH );
} else if ( value > A_MAX ) {
value = A_MAX;
digitalWrite( LED_PIN, HIGH );
} else {
digitalWrite( LED_PIN, LOW );
}
OCR2B = A_MAX + value;
}