Créer un émetteur radio AM avec Arduino Nano
Composants et fournitures
| Arduino Nano R3 | × | 1 |
| Résistance 10 kΩ | × | 2 |
| Condensateur 10 µF | × | 1 |
| Plaque d'essai (générique) | × | 1 |
Applications et services en ligne
- Arduino IDE
À propos du projet
On peut réaliser des choses étonnantes avec les MCU ATmega. J'ai eu l'idée de construire un émetteur AM avec un Arduino Nano (tout autre Arduino convient).
La question : comment réaliser une modulation d'amplitude (AM) sur un dispositif numérique ? L'AM consiste à faire varier l'amplitude d'une porteuse selon l'amplitude du signal d'entrée à transmettre. Mathématiquement, on multiplie la porteuse par le signal d'entrée. Mais un ATmega n'a que des sorties numériques : seulement deux états, haut et bas. Franchement, il est impossible d'obtenir une vraie AM avec un Arduino.
Néanmoins, il est possible de produire un signal de sortie audible clairement sur un récepteur AM ordinaire !
La solution consiste à transformer le signal analogique d'entrée en signal PWM, en utilisant l'ADC et le timer/compteur 16 bits (timer1) de l'ATmega.
Le timer/compteur 2 génère le signal de porteuse, variable dans une large plage entre 31 kHz et 8 MHz.
Ce signal de porteuse est sorti sur la broche D11 au rythme du signal PWM. Le récepteur AM se comporte comme un filtre passe-bas sur le PWM, restituant ainsi le signal audio original.
Ceci n'est qu'une preuve de concept, maintenue simple. Pour une utilisation réelle comme émetteur RF, ajoutez :
- Un filtre passe-bas anti-repliement sur l'entrée audio
- Un filtre passe-bas contre les harmoniques sur la sortie RF
Code
Émetteur AM Arduino C/C++
/* Ce travail est sous licence Creative Commons Attribution-ShareAlike 4.0 International.
Voir https://creativecommons.org/licenses/by-sa/4.0/ */
#define ANTENNA_PIN PB3 // Arduino Nano/Uno D11
void setup() {
Serial.begin(115200);
// Génération fréquence porteuse
uint32_t fTransmit = 600; // kHz
DDRB |= (1 << ANTENNA_PIN);
TCCR2A = (0 << COM2A1) + (1 << COM2A0); // Toggle OC2A on Compare Match
TCCR2A |= (1 << WGM21) + (0 << WGM20); // Mode CTC
TCCR2B = (0 << CS22) + (0 << CS21) + (1 << CS20); // Pas de prédiviseur
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);
// Génération signal PWM
// TCCR1A |= (0 << WGM11) + (1 << WGM10); // Fast PWM 8 bits
// TCCR1A |= (1 << WGM11) + (0 << WGM10); // Fast PWM 9 bits
TCCR1A |= (1 << WGM11) + (1 << WGM10); // Fast PWM 10 bits
TCCR1B = (1 << WGM12);
TCCR1B |= (0 << CS12) + (0 << CS11) + (1 << CS10); // Pas de prédiviseur
TIMSK1 = (1 << OCIE1A) + (1 << TOIE1);
// Configuration ADC
ADMUX = (1 << REFS1) + (1 << REFS0); // Référence interne 1,1V
ADCSRA = (1 << ADEN) + (1 << ADSC) + (1 << ADATE); // Auto-trigger, free-running
ADCSRA |= (1 << ADPS2) + (1 << ADPS1) + (0 << ADPS0); // Division par 64 -> ~18,5 kHz échantillonnage
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() {
// Tout se passe dans les interruptions
}
Schémas

Processus de fabrication
- L'héritage et l'évolution du jukebox classique
- La partition : Des manuscrits médiévaux à l'édition moderne — Aperçu de l'industrie
- Feux de signalisation : ingénierie, histoire et innovations futures
- Construisez votre propre LUMAZOID : Visualiseur musical DIY Arduino
- Construire un Spybot Arduino piloté par Bluetooth
- Décoder les signaux PPM d'un récepteur RC avec Arduino : Guide pas à pas
- FlickMote : Télécommande IR à gestes pour maison connectée
- TV-B-Gone DIY Arduino : Télécommande universelle pour toutes les TV
- Utiliser une thermistance facilement : Guide étape par étape Arduino