Bouw een AM Muziekzender met Arduino Nano
Onderdelen en Benodigdheden
| Onderdeel | Aantal |
|---|---|
| Arduino Nano R3 | 1 |
| Weerstand 10k ohm | 2 |
| Condensator 10 µF | 1 |
| Breadboard | 1 |
Apps en Online Services
- Arduino IDE
Over dit Project
Met ATmega microcontrollers kun je leuke dingen doen. Ik wilde een AM-zender bouwen met een Arduino Nano (elke Arduino werkt).
Hoe AM-modulatie op een Digitale Apparaat Werkt
AM (amplitudemodulatie) betekent dat de amplitude van een draaggolf verandert volgens het invoersignaal. Wiskundig is dat vermenigvuldiging. Maar een ATmega heeft alleen digitale uitgangen (hoog/laag) – echte AM is dus niet mogelijk.
Toch kun je een signaal produceren dat helder te horen is op een gewone AM-radio!
De Oplossing
- Zet het analoge invoersignaal om in een PWM-signaal, gebruikmakend van de ADC en de 16-bit timer/teller1 van de ATmega.
- Timer/teller2 genereert de draaggolf, instelbaar tussen 31 kHz en 8 MHz.
- De draaggolf wordt uitgegeven op pin D11 in het ritme van het PWM-signaal.
- De AM-radio fungeert als laagdoorlaatfilter op de PWM, waardoor het originele audiosignaal terugkomt.
Dit is een proof-of-concept. Voor een echte RF-zender voeg je een laagdoorlaatfilter toe aan de audio-in (anti-aliasing) en aan de RF-uitgang (tegen harmonische golven).
Code
/* Dit werk is gelicenseerd onder Creative Commons Attribution-ShareAlike 4.0 International License.
Zie https://creativecommons.org/licenses/by-sa/4.0/
*/
#define ANTENNA_PIN PB3 // Arduino Nano/Uno D11
void setup() {
Serial.begin(115200);
// Draaggolf frequentie generatie
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 mode
TCCR2B = (0 << CS22) + (0 << CS21) + (1 << CS20); // Geen prescaling
OCR2A = F_CPU / (2000 * fTransmit) - 1;
char strbuf[255];
sprintf(strbuf, "Zendt op %d kHz", (F_CPU / (2 * (1 + OCR2A)) / 1000));
Serial.println(strbuf);
// PWM Signaal generatie (10-bit Fast PWM)
TCCR1A |= (1 << WGM11) + (1 << WGM10);
TCCR1B = (1 << WGM12);
TCCR1B |= (0 << CS12) + (0 << CS11) + (1 << CS10); // Geen prescaling
TIMSK1 = (1 << OCIE1A) + (1 << TOIE1);
// ADC Instellingen
ADMUX = (1 << REFS1) + (1 << REFS0); // Interne 1.1V referentie
ADCSRA = (1 << ADEN) + (1 << ADSC) + (1 << ADATE); // Auto trigger, free running
ADCSRA |= (1 << ADPS2) + (1 << ADPS1) + (0 << ADPS0); // Delen door 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() {
}
Schema
Zie het schema in de afbeelding: audio-in op A0, antenne op D11 (PB3), weerstanden en condensator voor signaalconditionering.
Productieproces
- Het Erfgoed en de Evolutie van de Klassieke Jukebox
- Bladmuziek: Van Middeleeuwse Handschriften tot Moderne Uitgeverij – Een Brancheoverzicht
- Verkeerslichten: Techniek, Geschiedenis en Toekomstige Innovaties
- Bouw Je Eigen LUMAZOID: Een DIY Arduino Muziek Visualizer
- Bluetooth-gecontroleerde Arduino Spybot bouwen
- RC-ontvanger PPM-signalen decoderen met Arduino: Stapsgewijze handleiding
- FlickMote: Gebarengecontroleerde IR-afstandsbediening voor Slimme Huizen
- DIY Arduino TV-B-Gone: Universele TV-uit-schakelaar
- Bouw een Aangepaste LED Hoofdklok met Alarm – Zichtbaar vanaf 12 Meter
- Find Me: Slimme Item Locator met Arduino en Bluetooth
- Thermistor Gebruik Gemaakt Eenvoudig: Stap-voor-Stap Arduino Handleiding