Module RF 433 MHz Arduino : émetteur, récepteur, antenne, code
Module RF 433 MHz et Arduino : câbler l'émetteur FS1000A et le récepteur XY-MK-5V, antenne de 17,3 cm, messages RadioHead, copie de télécommande avec RCSwitch.
Un module RF 433 MHz est le moyen le moins cher d'ajouter une liaison sans fil à un projet Arduino : un kit composé d'un émetteur (FS1000A) et d'un récepteur (XY-MK-5V) coûte très peu, se branche avec un seul fil de données et, avec une antenne filaire de 17 cm, transporte un signal sur des dizaines de mètres. Les prises télécommandées, les sonnettes sans fil, les télécommandes de volets roulants, les détecteurs d'ouverture de porte et de fenêtre et les sondes extérieures des stations météo utilisent aussi le plus souvent la même fréquence. Avec ces modules, tu peux donc envoyer des données entre deux Arduino, mais aussi lire les codes des télécommandes de ta maison et les renvoyer depuis un Arduino.
Dans ce guide, tu vas découvrir comment les modules fonctionnent avec la modulation ASK (OOK), pourquoi l'antenne doit mesurer 17,3 cm et comment les brancher sur un Arduino Uno, un ESP32 et un Raspberry Pi Pico. Ensuite, tu enverras du texte et des données de capteurs entre deux Arduino avec la bibliothèque RadioHead, tu liras et copieras le code de la télécommande d'une prise avec la bibliothèque RCSwitch, tu verras comment augmenter la portée et tu compareras le module au nRF24L01.
Qu'est-ce qu'un module RF 433 MHz et comment fonctionne-t-il ?
Le kit se compose de deux cartes séparées. Le petit émetteur carré FS1000A (vendu aussi sous le nom XY-FST) allume et éteint une onde porteuse de 433,92 MHz selon le signal reçu sur sa broche DATA. Le récepteur XY-MK-5V, plus long, capte ce signal dans l'air et le restitue sous forme de 0 et de 1 sur sa broche DATA. Autrement dit, les modules eux-mêmes n'ont ni protocole, ni adresse, ni contrôle d'erreurs ; leur seul rôle est de transporter un signal numérique sans fil jusqu'à l'autre côté. Mettre les données en paquets, les vérifier et les décoder, c'est le travail de la bibliothèque sur l'Arduino. La communication est unidirectionnelle : l'émetteur ne fait qu'envoyer, le récepteur ne fait qu'écouter.
| Caractéristique | FS1000A (émetteur) | XY-MK-5V (récepteur) |
|---|---|---|
| Fréquence | 433,92 MHz (il existe aussi une version 315 MHz) | 433,92 MHz |
| Tension d'alimentation | 3–12 V | 5 V |
| Courant | Environ 9–40 mA en émission (selon la tension) | Environ 4 mA |
| Modulation | ASK / OOK | ASK / OOK, récepteur à super-réaction |
| Débit | Jusqu'à ~10 kbit/s (1–4 kbit/s en pratique) | Même limite que l'émetteur |
| Puissance / sensibilité | Environ 10 mW, augmente avec la tension | Environ −105 dBm |
| Broches | DATA, VCC, GND + pastille ANT | VCC, DATA, DATA, GND + pastille ANT |
| Dimensions | Environ 19 × 19 mm | Environ 30 × 14 mm |
Les deux broches DATA du récepteur sont reliées sur la carte : peu importe celle que tu utilises. Le XY-MK-5V est un récepteur à super-réaction bon marché mais peu sélectif : sa fréquence est fixée par une bobine réglable sur la carte et il est facilement perturbé par les parasites proches. Ne tourne pas la vis de cette bobine ; si le réglage d'usine est perdu, le récepteur n'entend plus l'émetteur. Pour des résultats plus stables, les récepteurs superhétérodynes comme le RXB6 sont plus sensibles et fonctionnent aussi en 3,3 V. Le kit existe aussi en version 315 MHz ; l'émetteur et le récepteur doivent être sur la même fréquence, et le résonateur métallique de l'émetteur porte généralement la fréquence imprimée.
Modulation ASK (OOK) : pourquoi as-tu besoin d'une bibliothèque ?
En OOK (On-Off Keying), la forme la plus simple de l'ASK (Amplitude Shift Keying, modulation par déplacement d'amplitude), la porteuse est allumée pour un bit 1 et éteinte pour un bit 0. Ça paraît simple, mais le récepteur a une particularité : son contrôle automatique de gain (CAG) pousse le gain au maximum en l'absence de signal, prend le bruit ambiant pour des données et sort en permanence des impulsions aléatoires sur la broche DATA. C'est pourquoi brancher l'émetteur directement sur la broche TX de l'Arduino et le récepteur sur RX pour communiquer avec Serial.print donne presque toujours des caractères incompréhensibles.
Le pilote RH_ASK de la bibliothèque RadioHead règle ce problème ainsi : avant chaque paquet, il envoie un préambule de 36 bits et un symbole de départ de 12 bits pour que le gain du récepteur se stabilise. Il convertit ensuite chaque octet en deux symboles de 6 bits équilibrés en continu (codage 4 vers 6) et ajoute un CRC de 16 bits à la fin du paquet. Le récepteur rejette en silence les paquets dont le CRC est faux : seules les données intactes te parviennent. RCSwitch, lui, décode le codage par largeur d'impulsion utilisé par les puces des télécommandes : chaque bit est représenté par des impulsions qui restent à HIGH et à LOW pendant des durées précises.
Longueur d'antenne 433 MHz : pourquoi 17,3 cm ?
Les modules n'ont pas d'antenne, seulement une pastille à souder marquée ANT. Sans antenne, un kit ne fonctionne qu'à 1–3 mètres. L'antenne simple la plus efficace est un fil droit d'un quart de longueur d'onde : λ = c / f = 300 000 000 / 433 920 000 ≈ 0,69 m, dont le quart vaut environ 17,3 cm. Pour les modules 315 MHz, le même calcul donne 23,8 cm. Soude l'extrémité d'un fil rigide monobrin sur la pastille ANT et garde le fil droit et vertical ; soude aussi un fil de même longueur sur le récepteur et oriente les deux antennes dans le même sens.
| Antenne | Longueur | Portée approximative (champ libre) | Remarque |
|---|---|---|---|
| Sans antenne | — | 1–3 m | Seulement pour des essais sur le bureau |
| Fil droit (λ/4), émetteur en 5 V | 17,3 cm | 20–50 m | L'option la plus simple et la plus efficace |
| Fil droit (λ/4), émetteur en 9–12 V | 17,3 cm | 50–100 m et plus | La vue dégagée et la hauteur comptent beaucoup |
| Antenne hélicoïdale (ressort) toute faite | 2–4 cm de long | Plus courte qu'avec un fil droit | Tient dans un boîtier |
Branchement du module RF 433 MHz : Arduino Uno, ESP32 et Pico
| Broche du module | Arduino Uno (RadioHead) | Arduino Uno (RCSwitch) | ESP32 | Raspberry Pi Pico |
|---|---|---|---|---|
| FS1000A VCC | 5V ou 9–12 V externe | 5V | VIN (5 V) | VBUS (5 V) |
| FS1000A DATA | D12 | D10 | GPIO 26 | GP15 |
| FS1000A GND | GND | GND | GND | GND |
| XY-MK-5V VCC | 5V | 5V | VIN (5 V) | VBUS (5 V) |
| XY-MK-5V DATA | D11 | D2 (broche d'interruption) | GPIO 27 (via un pont diviseur) | GP14 (via un pont diviseur) |
| XY-MK-5V GND | GND | GND | GND | GND |
L'émetteur fonctionne sans problème avec un signal de 3,3 V sur sa broche DATA : sur l'ESP32 et le Pico, tu peux donc l'alimenter en 5 V et relier DATA directement à un GPIO. C'est la tension de l'émetteur qui influence le plus la portée : en 3,3 V elle diminue nettement, en 9–12 V elle est multipliée. Placer un condensateur céramique de 100 nF et un électrolytique de 10 µF juste à côté des broches VCC et GND du récepteur réduit le bruit d'alimentation et améliore visiblement la réception.
Envoyer des messages entre deux Arduino avec RadioHead
- Ouvre le gestionnaire de bibliothèques de l'IDE Arduino, cherche RadioHead et installe la bibliothèque de Mike McCauley. Pour plus de détails, consulte ajouter une bibliothèque Arduino.
- Branche l'émetteur sur le premier Arduino : DATA → D12, VCC → 5V, GND → GND.
- Branche le récepteur sur le second Arduino : DATA → D11, VCC → 5V, GND → GND.
- Soude un fil de 17,3 cm sur la pastille ANT de chaque module.
- Téléverse le code de l'émetteur sur la première carte et celui du récepteur sur la seconde, puis ouvre le moniteur série côté récepteur à 9600 bauds.
1#include <RH_ASK.h>
2#include <SPI.h> // RadioHead derlemesi için / needed for RadioHead to compile
3
4RH_ASK rf(2000, 11, 12); // hız (bps), RX pini, TX pini / speed (bps), RX pin, TX pin
5unsigned int sayac = 0;
6
7void setup() {
8 Serial.begin(9600);
9 if (!rf.init()) Serial.println("RF init hatasi / failed");
10}
11
12void loop() {
13 char mesaj[24];
14 snprintf(mesaj, sizeof(mesaj), "Merhaba %u", sayac++);
15 rf.send((uint8_t *)mesaj, strlen(mesaj));
16 rf.waitPacketSent(); // paket bitene kadar bekle / wait until the packet is sent
17 Serial.print("Gonderildi / sent: ");
18 Serial.println(mesaj);
19 delay(1000);
20}1#include <RH_ASK.h>
2#include <SPI.h> // RadioHead derlemesi için / needed for RadioHead to compile
3
4RH_ASK rf(2000, 11, 12); // vericiyle aynı hız / same speed as the transmitter
5
6void setup() {
7 Serial.begin(9600);
8 if (!rf.init()) Serial.println("RF init hatasi / failed");
9}
10
11void loop() {
12 uint8_t buf[RH_ASK_MAX_MESSAGE_LEN + 1]; // +1: metin sonu için / +1 for the string terminator
13 uint8_t len = RH_ASK_MAX_MESSAGE_LEN; // her turda yeniden ayarla / reset on every pass
14 if (rf.recv(buf, &len)) { // yalnız CRC doğruysa true / true only if the CRC is valid
15 buf[len] = '\0';
16 Serial.print("Alindi / received: ");
17 Serial.println((char *)buf);
18 }
19}| Commande | Rôle |
|---|---|
| RH_ASK rf(2000, 11, 12) | Vitesse de 2000 bit/s, récepteur sur D11, émetteur sur D12 ; la vitesse doit être identique des deux côtés |
| rf.init() | Prépare le timer et les broches ; renvoie false en cas de problème |
| rf.send(donnees, longueur) | Commence l'envoi d'un paquet de 60 octets maximum |
| rf.waitPacketSent() | Attend que le paquet soit entièrement émis |
| rf.recv(buf, &len) | S'il y a un nouveau paquet au CRC correct, le copie dans buf, met à jour len et renvoie true |
| RH_ASK_MAX_MESSAGE_LEN | La plus grande quantité de données par paquet : 60 octets |
Dans le code du récepteur, il est important de réinitialiser la variable len à chaque tour : recv() y écrit la taille du paquet reçu et, à l'appel suivant, cette valeur est prise pour la taille du tampon ; sans réinitialisation, les messages plus longs sont tronqués. Si tout va bien, tu verras chaque seconde les lignes "Merhaba 0", "Merhaba 1" dans le moniteur série. Si des numéros manquent, des paquets se sont perdus en route ; vérifie alors l'antenne et l'alimentation.
Envoyer des données de capteur : un paquet avec un struct
Dans les vrais projets, envoyer des nombres est plus efficace que du texte. Tu peux regrouper tes mesures dans un struct et envoyer ses octets tels quels. L'émetteur ci-dessous envoie cinq fois par seconde la valeur d'une LDR ou d'un potentiomètre branché sur A0 et l'état du bouton sur D2. Le récepteur allume la LED de D13 quand on appuie sur le bouton distant et repère les paquets perdus.
1#include <RH_ASK.h>
2#include <SPI.h>
3
4struct __attribute__((packed)) Paket { // iki tarafta birebir aynı olmalı / must be identical on both sides
5 uint16_t no; // paket numarası / packet number
6 int16_t deger; // analog değer / analog value
7 uint8_t buton; // 1 = basılı / 1 = pressed
8};
9
10RH_ASK rf; // varsayılan: 2000 bps, RX 11, TX 12 / defaults
11Paket p = {0, 0, 0};
12
13void setup() {
14 pinMode(2, INPUT_PULLUP); // buton D2-GND / button D2-GND
15 rf.init();
16}
17
18void loop() {
19 p.no++;
20 p.deger = analogRead(A0); // örneğin LDR ya da potansiyometre / e.g. LDR or potentiometer
21 p.buton = (digitalRead(2) == LOW);
22 rf.send((uint8_t *)&p, sizeof(p));
23 rf.waitPacketSent();
24 delay(200);
25}1#include <RH_ASK.h>
2#include <SPI.h>
3
4struct __attribute__((packed)) Paket {
5 uint16_t no;
6 int16_t deger;
7 uint8_t buton;
8};
9
10RH_ASK rf;
11const int LED = 13;
12uint16_t sonNo = 0;
13
14void setup() {
15 Serial.begin(9600);
16 pinMode(LED, OUTPUT);
17 rf.init();
18}
19
20void loop() {
21 Paket p;
22 uint8_t len = sizeof(p);
23 if (rf.recv((uint8_t *)&p, &len) && len == sizeof(p)) {
24 digitalWrite(LED, p.buton ? HIGH : LOW); // uzaktaki buton LED'i yakar / remote button lights the LED
25 if (sonNo != 0 && p.no != (uint16_t)(sonNo + 1)) {
26 Serial.println("Paket kaybi / packet lost");
27 }
28 sonNo = p.no;
29 Serial.print(p.no);
30 Serial.print(" A0 = ");
31 Serial.println(p.deger);
32 }
33}L'attribut __attribute__((packed)) empêche le compilateur d'ajouter des octets de remplissage entre les champs. C'est important : le même struct peut occuper 5 octets sur un Arduino Uno et 6 sur un ESP32, et les données se décalent quand deux cartes différentes communiquent. Grâce au numéro de paquet, le récepteur peut compter les pertes. Comme les modules 433 MHz n'ont pas d'accusé de réception, c'est une bonne habitude de répéter plusieurs fois les commandes importantes. Si tu mets un émetteur et un récepteur de chaque côté, tu peux aussi créer une communication avec accusés de réception et réémissions grâce à la classe RHReliableDatagram de RadioHead.
Lire les codes des télécommandes du commerce avec RCSwitch
Beaucoup de prises télécommandées, de sonnettes sans fil, de télécommandes de volets et de portails ainsi que de détecteurs d'ouverture et de mouvement (PIR) utilisent des puces de codage comme l'EV1527 ou le PT2262. À chaque appui, ces puces envoient plusieurs fois de suite le même code de 12 à 24 bits, séparé par des pauses de synchronisation. La bibliothèque RCSwitch (rc-switch dans le gestionnaire de bibliothèques) décode ces codes. Sur l'Uno, relie la broche DATA du récepteur à une broche d'interruption, c'est-à-dire D2 ou D3, et téléverse le code suivant :
1#include <RCSwitch.h>
2
3RCSwitch rf = RCSwitch();
4
5void setup() {
6 Serial.begin(9600);
7 rf.enableReceive(digitalPinToInterrupt(2)); // alıcı DATA -> D2 (kesme pini) / receiver DATA -> D2 (interrupt pin)
8 Serial.println(F("Kumandanin tusuna bas / press a remote button"));
9}
10
11void loop() {
12 if (rf.available()) {
13 Serial.print(F("Kod / code: "));
14 Serial.print(rf.getReceivedValue());
15 Serial.print(F(" Bit: "));
16 Serial.print(rf.getReceivedBitlength());
17 Serial.print(F(" Protokol / protocol: "));
18 Serial.print(rf.getReceivedProtocol());
19 Serial.print(F(" Darbe / pulse: "));
20 Serial.print(rf.getReceivedDelay());
21 Serial.println(F(" us"));
22 rf.resetAvailable(); // bir sonraki koda hazırlan / get ready for the next code
23 }
24}Ouvre le moniteur série et appuie sur une touche de la télécommande ; tu verras une ligne comme "Kod / code: 5393 Bit: 24 Protokol / protocol: 1 Darbe / pulse: 350 us". Note pour chaque touche le code, le nombre de bits, le protocole et la durée d'impulsion : il te faudra les quatre pour la copie. Sur les télécommandes à EV1527, les 20 premiers des 24 bits sont l'identifiant de la télécommande et les 4 derniers la touche pressée ; c'est pourquoi les codes des touches d'une même télécommande sont très proches. En protocole 1, une unité dure environ 350 µs : un bit 0 vaut 1 unité à HIGH et 3 à LOW, un bit 1 vaut 3 unités à HIGH et 1 à LOW, et la synchronisation 1 unité à HIGH et 31 à LOW.
| Puce de télécommande | Structure du code | Copiable avec RCSwitch ? |
|---|---|---|
| EV1527 (code d'apprentissage) | Identifiant de 20 bits + touche de 4 bits, 24 bits au total | Oui |
| PT2262 / SC2262 | 12 bits à trois états (0, 1, F) ; adresse réglée par interrupteurs DIP | Oui |
| HT6P20B | Code fixe, protocole 6 de RCSwitch | Oui |
| Puces à code tournant comme le HCS301 (KeeLoq) | Code chiffré qui change à chaque appui | Non |
Envoyer le code de la télécommande depuis l'Arduino
Pour envoyer le code lu, relie la broche DATA de l'émetteur à D10 et deux boutons entre D4 et D5 et GND. À chaque appui, l'Arduino répète le code 10 fois, exactement comme la télécommande ; les touches marche et arrêt de la prise sont désormais sur ton Arduino :
1#include <RCSwitch.h>
2
3RCSwitch rf = RCSwitch();
4const int BTN_AC = 4; // "aç" butonu D4-GND / "on" button D4-GND
5const int BTN_KAPAT = 5; // "kapat" butonu D5-GND / "off" button D5-GND
6
7void setup() {
8 pinMode(BTN_AC, INPUT_PULLUP);
9 pinMode(BTN_KAPAT, INPUT_PULLUP);
10 rf.enableTransmit(10); // verici DATA -> D10 / transmitter DATA -> D10
11 rf.setProtocol(1); // önce protokol... / protocol first...
12 rf.setPulseLength(350); // ...sonra okuduğun darbe süresi / ...then the pulse length you read
13 rf.setRepeatTransmit(10); // her gönderim 10 kez tekrarlanır / each send is repeated 10 times
14}
15
16void loop() {
17 if (digitalRead(BTN_AC) == LOW) {
18 rf.send(5393, 24); // okuduğun "aç" kodu ve bit sayısı / the "on" code and bit length you read
19 delay(300);
20 }
21 if (digitalRead(BTN_KAPAT) == LOW) {
22 rf.send(5396, 24); // okuduğun "kapat" kodu / the "off" code you read
23 delay(300);
24 }
25}Comme setProtocol() remet la durée d'impulsion à la valeur par défaut du protocole, appelle toujours setPulseLength() après. Si la prise ne réagit pas, indique d'abord exactement la durée d'impulsion lue (par exemple 320 ou 420 µs), puis augmente le nombre de répétitions à 15. Les prises à code d'apprentissage offrent un autre raccourci : si tu mets la prise en mode apprentissage et que tu envoies n'importe quel code de 24 bits depuis l'Arduino, la prise l'enregistre dans sa mémoire. Tu peux ainsi créer tes propres codes sans copier aucune télécommande.
Récepteur 433 MHz avec l'ESP32 : piloter un relais avec une télécommande
L'ESP32 est un pont idéal pour relier les télécommandes 433 MHz au monde du Wi-Fi. RCSwitch fonctionne aussi sur l'ESP32 et, comme tous ses GPIO acceptent les interruptions, tu peux brancher le récepteur sur la broche sûre de ton choix. Le code ci-dessous lit les codes d'un récepteur relié au GPIO 27 (via un pont diviseur) ; quand le code de ta propre télécommande arrive, il bascule la LED du GPIO 2 ou un module relais. Comme une télécommande envoie son code de nombreuses fois pour un seul appui, le programme ne rebascule pas tant que le code n'a pas cessé pendant 600 ms :
1#include <RCSwitch.h>
2
3RCSwitch rf = RCSwitch();
4const int RX_PIN = 27; // alıcı DATA, gerilim bölücüyle / receiver DATA, through a divider
5const int ROLE_PIN = 2; // dahili LED ya da röle girişi / onboard LED or relay input
6const unsigned long KOD = 5393; // kendi kumandanın kodu / your own remote's code
7bool durum = false;
8unsigned long sonGorulme = 0;
9
10void setup() {
11 Serial.begin(115200);
12 pinMode(ROLE_PIN, OUTPUT);
13 rf.enableReceive(digitalPinToInterrupt(RX_PIN)); // ESP32'de her GPIO kesme alır / every GPIO takes interrupts on the ESP32
14}
15
16void loop() {
17 if (rf.available()) {
18 unsigned long kod = rf.getReceivedValue();
19 Serial.printf("Kod / code: %lu %u bit protokol %u\n", kod, rf.getReceivedBitlength(), rf.getReceivedProtocol());
20 if (kod == KOD) {
21 // kumanda kodu art arda tekrarlar; yalnız yeni basışta değiştir / the remote repeats the code; toggle only on a new press
22 if (millis() - sonGorulme > 600) {
23 durum = !durum;
24 digitalWrite(ROLE_PIN, durum ? HIGH : LOW);
25 }
26 sonGorulme = millis();
27 }
28 rf.resetAvailable();
29 }
30}Tu peux construire beaucoup de choses sur cette base : transmets les codes reçus à Home Assistant via MQTT pour intégrer des détecteurs d'ouverture 433 MHz bon marché à ta domotique, ou commande des prises depuis ton téléphone avec un émetteur sur le GPIO 26. RadioHead prend aussi en charge l'ESP32 ; la seule différence est d'écrire explicitement les broches dans le constructeur : RH_ASK rf(2000, 27, 26, 25); (récepteur 27, émetteur 26 et 25 comme broche libre pour PTT). Si tu découvres l'ESP32, jette un œil à Qu'est-ce que l'ESP32 ?.
Émetteur 433 MHz avec le Raspberry Pi Pico et MicroPython
MicroPython n'a pas d'équivalent tout prêt de RCSwitch, mais la temporisation du protocole 1 est si simple que tu peux l'écrire toi-même en quelques lignes. Relie le VCC du FS1000A à la broche VBUS (5 V) du Pico, DATA au GP15 et un bouton entre GP16 et GND. Quand tu appuies sur le bouton, le Pico envoie les 24 bits en commençant par le bit de poids fort, comme RCSwitch, ajoute l'impulsion de synchronisation à la fin et répète tout le paquet 10 fois. Si tu ne sais pas encore installer MicroPython sur le Pico, commence par Qu'est-ce que le Raspberry Pi Pico ?.
1from machine import Pin
2import time
3
4tx = Pin(15, Pin.OUT, value=0) # FS1000A DATA -> GP15
5buton = Pin(16, Pin.IN, Pin.PULL_UP) # buton GP16-GND / button GP16-GND
6T = 350 # darbe süresi µs (RCSwitch protokol 1) / pulse length µs (RCSwitch protocol 1)
7
8def darbe(yuksek, dusuk): # süreler T cinsinden / durations in units of T
9 tx.value(1)
10 time.sleep_us(yuksek * T)
11 tx.value(0)
12 time.sleep_us(dusuk * T)
13
14def gonder(kod, bit=24, tekrar=10):
15 for _ in range(tekrar):
16 for i in range(bit - 1, -1, -1): # en anlamlı bitten başla / start from the most significant bit
17 if (kod >> i) & 1:
18 darbe(3, 1) # "1" biti: 3T HIGH, 1T LOW / bit "1"
19 else:
20 darbe(1, 3) # "0" biti: 1T HIGH, 3T LOW / bit "0"
21 darbe(1, 31) # senkron: 1T HIGH, 31T LOW / sync
22
23while True:
24 if buton.value() == 0: # butona basıldı / button pressed
25 gonder(5393) # okuduğun kodu yaz / put the code you read here
26 time.sleep_ms(300)Pour le processeur à 125 MHz du Pico, des impulsions de 350 µs sont un rythme confortable ; les petits retards de Python restent bien en dessous de la tolérance de 60 % des récepteurs RCSwitch. Tu peux tester le code tout de suite en posant à côté un Arduino équipé du code lecteur RCSwitch : le nombre envoyé doit s'afficher dans le moniteur série. Pour la réception, il faudrait mesurer et décoder les durées d'impulsion avec des horodatages ; pour cela, un Arduino ou un ESP32 avec RCSwitch est plus pratique.
Portée et parasites : envoyer le signal plus loin
- N'oublie pas l'antenne : soude un fil droit de 17,3 cm des deux côtés ; c'est ce qui influence le plus la portée.
- Augmente la tension de l'émetteur : alimenter le FS1000A en 9–12 V augmente nettement la puissance et la portée. N'oublie pas la masse commune.
- Réduis la vitesse : utiliser 1000 bit/s au lieu de 2000 dans RadioHead allonge chaque bit et permet au récepteur de décoder des signaux plus faibles. Mets la même vitesse des deux côtés.
- Vue dégagée et hauteur : les murs en béton armé, les boîtiers métalliques et un montage près du sol peuvent diviser la portée par deux ; sors les antennes des boîtiers métalliques et place-les le plus haut possible.
- Soigne l'alimentation : les moteurs, les relais et les alimentations à découpage rendent le récepteur sourd. Donne-lui une alimentation filtrée et garde des fils courts.
- Prends un meilleur récepteur : un récepteur superhétérodyne comme le RXB6 à la place du XY-MK-5V va souvent nettement plus loin avec le même émetteur.
- Renvoie : comme il n'y a pas d'accusé de réception, envoie les commandes importantes 3 à 5 fois et élimine les doublons côté récepteur grâce au numéro de paquet.
N'oublie pas que le 433 MHz est une bande partagée : la station météo du voisin, les clés de voiture et les sonnettes émettent sur la même fréquence. En Europe et en Turquie, la plage 433,05–434,79 MHz est ouverte sans licence aux appareils à courte portée, mais la puissance est limitée à 10 mW (PAR) et tu ne dois pas occuper le canal en permanence. Envoyer les données à intervalles réguliers ou seulement quand quelque chose change, plutôt qu'en continu, respecte les règles et prolonge l'autonomie ; pour un émetteur sur pile, tu peux utiliser le calculateur d'autonomie de batterie.
Module RF 433 MHz ou nRF24L01 ?

| Caractéristique | RF 433 MHz (FS1000A + XY-MK-5V) | nRF24L01 |
|---|---|---|
| Fréquence | 433,92 MHz | 2,4 GHz |
| Modulation | ASK / OOK | GFSK |
| Sens | Unidirectionnel (émetteur et récepteur séparés) | Bidirectionnel (un seul module émetteur-récepteur) |
| Débit | 1–4 kbit/s en pratique (2 kbit/s par défaut dans RadioHead) | 250 kbit/s – 2 Mbit/s |
| Branchement | Une seule broche de données | SPI (7 fils) |
| Alimentation | Émetteur 3–12 V, récepteur 5 V | 1,9–3,6 V |
| Contrôle d'erreurs | Logiciel (CRC de RadioHead) | CRC matériel, accusé de réception et réémission automatiques |
| Portée | 20–100 m avec une antenne de 17,3 cm | 50–100 m, ~1 km avec la version PA+LNA |
| Traversée des murs | Meilleure (fréquence plus basse) | Moins bonne |
| Compatible avec les appareils du commerce | Télécommandes de prises, sonnettes et capteurs | Non |
| Prix | Très bon marché | Bon marché |
En bref, si tu dois envoyer dans un seul sens de petites données peu fréquentes (un bouton, une température, l'ouverture d'une porte) ou travailler avec des prises et capteurs du commerce, le module 433 MHz est la solution la plus simple et la moins chère. Pour une voiture radiocommandée, un joystick ou des réseaux de capteurs à plusieurs nœuds qui ont besoin d'une communication rapide, bidirectionnelle et avec accusé de réception, le nRF24L01 est un meilleur choix. Si tu as besoin de plusieurs kilomètres de portée, regarde les modules LoRa ; pour voir toutes les options côte à côte, lis les modules de communication sans fil pour Arduino.
Idées de projets avec le module RF 433 MHz
- Sonnette sans fil : joue une mélodie dans la maison quand le bouton du portail envoie un signal ; un buzzer suffit pour le son.
- Piloter des prises depuis l'Arduino : copie les codes des prises télécommandées et allume ou éteins des lampes selon l'heure ou la luminosité.
- Détecteur d'ouverture sans fil : place sur la porte un interrupteur reed (ILS) et un petit Arduino avec émetteur ; quand la porte s'ouvre, le côté récepteur déclenche l'alarme.
- Système d'alarme maison : construis un système d'alarme Arduino qui regroupe des détecteurs PIR et d'ouverture 433 MHz du commerce dans une centrale.
- Station de capteurs pour le jardin : envoie l'humidité du sol ou la température à la maison toutes les quelques minutes avec un émetteur sur pile.
- Passerelle 433 MHz vers Wi-Fi : pilote avec un ESP32 tous les appareils 433 MHz de la maison depuis ton téléphone et ta domotique.
Erreurs fréquentes et solutions
| Symptôme | Cause probable | Solution |
|---|---|---|
| Aucun paquet n'arrive au récepteur (RadioHead) | Vitesse ou broches différentes des deux côtés, pas d'antenne | Utilise le même constructeur des deux côtés (2000, 11, 12) et soude 17,3 cm de fil sur les deux modules |
| Ça ne marche qu'à quelques centimètres | Pas d'antenne ou tension trop faible sur l'émetteur | Ajoute une antenne et alimente l'émetteur en 5–12 V |
| Erreur multiple definition of `__vector_11' | RadioHead et la bibliothèque Servo ne peuvent pas partager le Timer1 | Utilise RH_ASK_ARDUINO_USE_TIMER2 ou ServoTimer2 |
| La PWM sur D9 et D10 ne marche pas, l'appareil sur D10 se comporte bizarrement | RH_ASK utilise le Timer1 et D10 (PTT) | Laisse ces broches libres ou choisis une autre broche PTT dans le constructeur |
| RCSwitch n'affiche aucun code | Le DATA du récepteur est sur une broche sans interruption | Utilise D2 ou D3 sur l'Uno et le Nano |
| Des codes inconnus s'affichent | Stations météo ou capteurs des voisins, ou bruit | Ne réagis qu'aux codes, nombres de bits et protocoles connus |
| Le code copié n'actionne pas la prise | Durée d'impulsion ou protocole différent, ou télécommande à code tournant | Mets la valeur de getReceivedDelay() dans setPulseLength() et augmente les répétitions |
| L'ESP32 ne reçoit rien ou fonctionne de façon instable | La sortie 5 V du récepteur est reliée directement à un GPIO | Utilise un pont diviseur ou un récepteur 3,3 V |
| Les données se coupent quand un moteur tourne | Bruit et chutes de tension sur l'alimentation | Alimente le récepteur séparément et ajoute des condensateurs de 100 nF + 10 µF |
Les modules RF 433 MHz offrent à tes projets un bras sans fil pour presque rien et font partie des rares modules capables de dialoguer avec les appareils télécommandés déjà présents chez toi. Une fois la logique de la commande sans fil comprise, tu apprendras facilement d'autres méthodes comme les télécommandes IR et le Bluetooth. Dans l'application BlueGrays, tu trouveras des projets comme la communication entre deux Arduino, l'allumage d'une ampoule 220 V avec une télécommande, un détecteur de porte avec interrupteur reed et une alarme de mouvement ESP32, avec schémas de câblage et code pas à pas.
Questions fréquentes
Quelle est la portée d'un module RF 433 MHz ?
Sans antenne, un kit ne fonctionne qu'à 1–3 mètres. Avec une antenne filaire de 17,3 cm soudée des deux côtés et l'émetteur alimenté en 5 V, on atteint 20–50 mètres en champ libre, et plus de 100 mètres avec l'émetteur en 9–12 V. À l'intérieur d'un bâtiment, les murs et les parasites réduisent nettement ces valeurs.
Quelle longueur pour une antenne 433 MHz ?
L'antenne simple la plus efficace est un fil droit quart d'onde : environ 17,3 cm pour 433 MHz et 23,8 cm pour 315 MHz. Soude le fil sur la pastille ANT du module et garde-le droit et vertical ; les antennes de l'émetteur et du récepteur doivent être orientées dans le même sens.
Un émetteur et un récepteur 433 MHz peuvent-ils communiquer dans les deux sens ?
Avec une seule paire, la communication va uniquement de l'émetteur vers le récepteur. Si tu mets un émetteur et un récepteur de chaque côté, tu peux travailler dans les deux sens, et la classe RHReliableDatagram de RadioHead ajoute même accusés de réception et réémissions dans ce montage. Pour cela, des modules bidirectionnels d'origine comme le nRF24L01 ou le HC-12 restent plus pratiques.
Peut-on copier une télécommande de voiture ou de garage avec un module 433 MHz ?
Les clés de voiture et les télécommandes de garage modernes utilisent un code tournant (rolling code) : le code change à chaque appui et un code enregistré est refusé, donc RCSwitch ne peut pas les copier. Les télécommandes à code fixe de prises, sonnettes et capteurs, elles, peuvent être copiées. N'utilise cette méthode que sur tes propres appareils ; tenter d'accéder aux systèmes d'autrui peut entraîner des problèmes juridiques.
Le module RF 433 MHz fonctionne-t-il avec l'ESP32 ?
Oui. Tu peux alimenter l'émetteur FS1000A en 5 V et relier sa broche DATA directement à un GPIO ; un signal de 3,3 V suffit. Comme la sortie du récepteur XY-MK-5V est en 5 V, il faut ajouter un pont diviseur ou choisir un récepteur qui fonctionne en 3,3 V, comme le RXB6. Les bibliothèques RCSwitch et RadioHead prennent en charge l'ESP32.
Quelle est la différence entre un module 433 MHz et un module 315 MHz ?
Les deux versions sont construites de la même façon ; seule la fréquence de travail change. En Europe, les télécommandes utilisent surtout 433,92 MHz, alors que le 315 MHz est courant aux États-Unis et dans certains pays d'Asie. L'émetteur et le récepteur, ou la télécommande que tu veux copier, doivent être exactement sur la même fréquence.
Projets à réaliser après cet article
Voir tous les projets
Communication unidirectionnelle entre 2 Arduino
Tu fais discuter deux Arduino par un seul fil : appuie sur le bouton de l'un et la LED de l'autre s'allume, appuie encore et elle s'éteint. La carte qui envoie signale l'appui par un court message, et

Communication bidirectionnelle entre 2 Arduino
Deux Arduino reliés par des fils se parlent : appuie sur le bouton de l'un et la lumière de l'autre s'allume, appuie encore et elle s'éteint. Les deux cartes ont le même programme, donc chacune envoie

Allumer une ampoule 220 V avec une télécommande
Allume et éteins une vraie ampoule de la maison avec une télécommande, sans quitter le canapé. L'Arduino lit le signal lumineux invisible de la télécommande ; le bouton marche fait coller le relais et

Capteur de porte avec interrupteur reed
Sache si ta porte est ouverte ou fermée rien qu'en regardant une lumière. Tu fixes un petit aimant sur la porte et sur le cadre un interrupteur qui sent les aimants ; porte fermée, ils sont côte à côt

Allumer et éteindre des LED avec un récepteur IR et une télécommande
Comme commander trois lampes sans quitter ton fauteuil : les touches 1, 2 et 3 de la télécommande allument les LED bleue, rouge et verte, et les touches 4, 5 et 6 les éteignent dans le même ordre. La

Télécommande universelle ESP32 IR (récepteur IR + télécommande + 3 LED + buzzer + écran OLED)
Avec l'ESP32, tu peux lire les signaux d'une télécommande IR standard et contrôler ton propre appareil ! Dans ce projet, nous capturons les signaux d'une télécommande IR à 20 touches à l'aide d'un récepteur infrarouge (protocole NEC 38 kHz). Nous avons défini une action différente pour chaque touche : les touches 1/2/3 activent ou désactivent trois LED distinctes, la touche PWR les éteint toutes, et les chiffres 4 à 9 affichent des informations spécifiques sur l'écran OLED. Sur l'écran OLED SSD1

Contrôler une LED depuis un téléphone via Bluetooth
Une petite répétition pour allumer et éteindre les lumières de ta chambre depuis ton téléphone. Le module Bluetooth transmet à l'Arduino les lettres envoyées par ton téléphone ; une lettre allume la L
Autres articles
Application BlueGrays
Réalise ce montage pas à pas sur ton téléphone
Schéma, code et liste des composants sur un seul écran. Plus de 200 projets Arduino, ESP32 et Pico à réaliser.
Scanne avec ton téléphone
Pointe l’appareil photo vers le code : la boutique d’applications de ton téléphone s’ouvre.
ou ouvre la boutique

