Composants · 16 min de lecture

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éristiqueFS1000A (émetteur)XY-MK-5V (récepteur)
Fréquence433,92 MHz (il existe aussi une version 315 MHz)433,92 MHz
Tension d'alimentation3–12 V5 V
CourantEnviron 9–40 mA en émission (selon la tension)Environ 4 mA
ModulationASK / OOKASK / OOK, récepteur à super-réaction
DébitJusqu'à ~10 kbit/s (1–4 kbit/s en pratique)Même limite que l'émetteur
Puissance / sensibilitéEnviron 10 mW, augmente avec la tensionEnviron −105 dBm
BrochesDATA, VCC, GND + pastille ANTVCC, DATA, DATA, GND + pastille ANT
DimensionsEnviron 19 × 19 mmEnviron 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.

AntenneLongueurPortée approximative (champ libre)Remarque
Sans antenne—1–3 mSeulement pour des essais sur le bureau
Fil droit (λ/4), émetteur en 5 V17,3 cm20–50 mL'option la plus simple et la plus efficace
Fil droit (λ/4), émetteur en 9–12 V17,3 cm50–100 m et plusLa vue dégagée et la hauteur comptent beaucoup
Antenne hélicoïdale (ressort) toute faite2–4 cm de longPlus courte qu'avec un fil droitTient dans un boîtier

Branchement du module RF 433 MHz : Arduino Uno, ESP32 et Pico

Broche du moduleArduino Uno (RadioHead)Arduino Uno (RCSwitch)ESP32Raspberry Pi Pico
FS1000A VCC5V ou 9–12 V externe5VVIN (5 V)VBUS (5 V)
FS1000A DATAD12D10GPIO 26GP15
FS1000A GNDGNDGNDGNDGND
XY-MK-5V VCC5V5VVIN (5 V)VBUS (5 V)
XY-MK-5V DATAD11D2 (broche d'interruption)GPIO 27 (via un pont diviseur)GP14 (via un pont diviseur)
XY-MK-5V GNDGNDGNDGNDGND
La sortie DATA du récepteur XY-MK-5V monte jusqu'à 5 V. Les broches de l'ESP32 et du Pico ne tolèrent pas le 5 V : quand tu branches le récepteur sur ces cartes, place toujours un pont diviseur de tension sur la ligne DATA (par exemple 10 kΩ en haut et 20 kΩ en bas, ce qui donne environ 3,3 V) ou utilise un récepteur qui fonctionne en 3,3 V. Si tu alimentes l'émetteur en 12 V, ne laisse jamais cette tension toucher une broche de la carte et relie toutes les masses (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

  1. 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.
  2. Branche l'émetteur sur le premier Arduino : DATA → D12, VCC → 5V, GND → GND.
  3. Branche le récepteur sur le second Arduino : DATA → D11, VCC → 5V, GND → GND.
  4. Soude un fil de 17,3 cm sur la pastille ANT de chaque module.
  5. 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.
C++ (Arduino IDE)
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}
C++ (Arduino IDE)
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}
CommandeRô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_LENLa 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.

Sur l'Arduino Uno, RH_ASK utilise le Timer1. Comme la bibliothèque Servo a aussi besoin du Timer1, les deux ne compilent pas dans le même croquis et tu obtiens l'erreur "multiple definition of `__vector_11'" ; de plus, la PWM sur D9 et D10 ne fonctionne plus. Par défaut, le pilote utilise aussi D10 comme broche d'activation de l'émetteur (PTT). Si tu as besoin d'un servo, décommente la ligne RH_ASK_ARDUINO_USE_TIMER2 au début de RH_ASK.cpp (tone() ne fonctionnera plus) ou utilise la bibliothèque ServoTimer2.

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.

C++ (Arduino IDE)
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}
C++ (Arduino IDE)
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 :

C++ (Arduino IDE)
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écommandeStructure du codeCopiable avec RCSwitch ?
EV1527 (code d'apprentissage)Identifiant de 20 bits + touche de 4 bits, 24 bits au totalOui
PT2262 / SC226212 bits à trois états (0, 1, F) ; adresse réglée par interrupteurs DIPOui
HT6P20BCode fixe, protocole 6 de RCSwitchOui
Puces à code tournant comme le HCS301 (KeeLoq)Code chiffré qui change à chaque appuiNon
Les clés de voiture, les télécommandes d'alarme et les télécommandes de garage récentes utilisent un code tournant (rolling code) : le code change à chaque appui, et un code enregistré n'est pas accepté une seconde fois. Essayer de copier ces systèmes ne fonctionne pas et, sur les appareils d'autrui, peut t'attirer des ennuis juridiques. N'utilise cette méthode que pour tes propres prises, sonnettes et capteurs.

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 :

C++ (Arduino IDE)
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 :

C++ (Arduino IDE)
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 ?.

MicroPython
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 ?

Module de communication sans fil nRF24L01 2,4 GHz
nRF24L01 : une alternative en 2,4 GHz qui se branche en SPI, fonctionne dans les deux sens et intègre le contrôle d'erreurs dans le matériel.
CaractéristiqueRF 433 MHz (FS1000A + XY-MK-5V)nRF24L01
Fréquence433,92 MHz2,4 GHz
ModulationASK / OOKGFSK
SensUnidirectionnel (émetteur et récepteur séparés)Bidirectionnel (un seul module émetteur-récepteur)
Débit1–4 kbit/s en pratique (2 kbit/s par défaut dans RadioHead)250 kbit/s – 2 Mbit/s
BranchementUne seule broche de donnéesSPI (7 fils)
AlimentationÉmetteur 3–12 V, récepteur 5 V1,9–3,6 V
Contrôle d'erreursLogiciel (CRC de RadioHead)CRC matériel, accusé de réception et réémission automatiques
Portée20–100 m avec une antenne de 17,3 cm50–100 m, ~1 km avec la version PA+LNA
Traversée des mursMeilleure (fréquence plus basse)Moins bonne
Compatible avec les appareils du commerceTélécommandes de prises, sonnettes et capteursNon
PrixTrè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ômeCause probableSolution
Aucun paquet n'arrive au récepteur (RadioHead)Vitesse ou broches différentes des deux côtés, pas d'antenneUtilise 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ètresPas d'antenne ou tension trop faible sur l'émetteurAjoute 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 Timer1Utilise RH_ASK_ARDUINO_USE_TIMER2 ou ServoTimer2
La PWM sur D9 et D10 ne marche pas, l'appareil sur D10 se comporte bizarrementRH_ASK utilise le Timer1 et D10 (PTT)Laisse ces broches libres ou choisis une autre broche PTT dans le constructeur
RCSwitch n'affiche aucun codeLe DATA du récepteur est sur une broche sans interruptionUtilise D2 ou D3 sur l'Uno et le Nano
Des codes inconnus s'affichentStations météo ou capteurs des voisins, ou bruitNe réagis qu'aux codes, nombres de bits et protocoles connus
Le code copié n'actionne pas la priseDurée d'impulsion ou protocole différent, ou télécommande à code tournantMets la valeur de getReceivedDelay() dans setPulseLength() et augmente les répétitions
L'ESP32 ne reçoit rien ou fonctionne de façon instableLa sortie 5 V du récepteur est reliée directement à un GPIOUtilise un pont diviseur ou un récepteur 3,3 V
Les données se coupent quand un moteur tourneBruit et chutes de tension sur l'alimentationAlimente le récepteur séparément et ajoute des condensateurs de 100 nF + 10 µF
Pour le dépannage, teste d'abord les deux modules à 1 mètre l'un de l'autre, avec antennes et en 5 V. Si ça fonctionne à cette distance, le problème ne vient pas du câblage mais de la portée et des parasites ; augmente la distance pas à pas et observe l'effet de l'antenne, de la tension de l'émetteur et du débit. Si rien ne fonctionne, vérifie les broches, le réglage de vitesse et les exemples fournis avec la bibliothèque.

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.

Voir tous les projets
Communication unidirectionnelle entre 2 Arduino
#57Intermédiaire
Premium

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

4.4(37)
50
Communication bidirectionnelle entre 2 Arduino
#58Intermédiaire
Premium

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

4.5(20)
26
Allumer une ampoule 220 V avec une télécommande
#21Avancé
Premium

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

4.4(22)
30
Capteur de porte avec interrupteur reed
#38Débutant
Premium

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

4.7(34)
44
Allumer et éteindre des LED avec un récepteur IR et une télécommande
#17Intermédiaire
Premium

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

4.7(45)
66
Télécommande universelle ESP32 IR (récepteur IR + télécommande + 3 LED + buzzer + écran OLED)
#143Avancé
Premium

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

4.5(9)
16
Contrôler une LED depuis un téléphone via Bluetooth
#34Débutant
Premium

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

4.8(68)
89