Décoder les signaux PPM d'un récepteur RC avec Arduino : Guide pas à pas
Composants et fournitures
- Arduino UNO (×1)
Applications et services en ligne
- Arduino IDE
À propos du projet
Un émetteur RC convient parfaitement aux projets nécessitant une liaison sans fil grâce à ses liaisons chiffrées et sa bonne portée.
Tous les récepteurs RC sont conçus pour piloter des servomoteurs. Chaque canal dispose de 3 broches : masse, Vcc et signal. Un signal particulier est utilisé : des impulsions envoyées à intervalle régulier. Quand le servo reçoit une impulsion de 1,5 ms, il se positionne à 90° ; en variant cette valeur entre 1 et 2 ms, le servo va de sa position minimum à maximum. (Sur la photo, un récepteur 6 canaux avec broche PPM).
La méthode simple consiste à mesurer la largeur d'impulsion sur chaque broche et mapper ces données. Mais deux problèmes se posent :
- Pour chaque canal, il faut connecter un fil vers une broche Arduino. Cela demande beaucoup de connexions et consomme beaucoup de broches.
- La plupart des Arduino n'ont que 2 broches d'interruption. Si on utilise plus de 2 canaux, il faut ajouter des délais dans le code, ce qui peut poser problème pour certaines applications.
Pour résoudre cela, de nombreux récepteurs disposent d'une broche supplémentaire appelée PPM. Cette broche transmet les données de tous les canaux dans un signal unique.
Comment est composé le signal de la broche PPM ?


Ce signal consiste en paquets de données séparés par des espaces vides. L'espace entre les pics représente la valeur du canal. Dans cet exemple avec un récepteur 6 canaux, on observe 7 impulsions.
Dans le code, on doit d'abord détecter l'espace de séparation, puis enregistrer les données des impulsions pour chaque canal.
Comme on le voit sur la seconde image, toutes les données sont séparées par environ 11 500 microsecondes, suivies des 6 valeurs pour chaque canal.
Utilisation du code

La fonction read_me() s'exécute sur interruption (broche 2) et capture 15 valeurs temporelles qu'elle stocke dans un tableau :
a = micros();
c = a - b;
b = a;
x[i] = c;
i = i + 1;
if (i == 15) {
for (int j = 0; j < 15; j++) {
ch1[j] = x[j];
}
i = 0;
}
La fonction read_rc() recherche un espace supérieur à 10 000 µs (l'espace de séparation), et quand elle le détecte, passe à la section suivante. Les 6 valeurs suivantes correspondent à la position de chaque canal, stockées dans le tableau ch[1] à ch[6].
Code
Lecture des canaux récepteur RC (Arduino)
unsigned long int a, b, c;
int x[15], ch1[15], ch[7], i; // tableaux et variables pour stocker les valeurs
void setup() {
Serial.begin(9600);
pinMode(2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), read_me, FALLING); // interruption sur broche 2
}
void loop() {
read_rc();
Serial.print(ch[1]); Serial.print("\t");
Serial.print(ch[2]); Serial.print("\t");
Serial.print(ch[3]); Serial.print("\t");
Serial.print(ch[4]); Serial.print("\t");
Serial.print(ch[5]); Serial.print("\t");
Serial.print(ch[6]); Serial.print("\n");
delay(100);
}
void read_me() {
// Lit la valeur du récepteur RC depuis la broche PPM (broche 2 ou 3)
// Donne des valeurs de canal 0-1000
// -: ABHILASH :-
a = micros(); // stocke le temps 'a' sur front descendant
c = a - b; // calcule le temps entre deux pics
b = a;
x[i] = c; // stocke 15 valeurs dans le tableau
i = i + 1;
if (i == 15) {
for (int j = 0; j < 15; j++) {
ch1[j] = x[j];
}
i = 0;
}
} // copie toutes les valeurs du tableau temporaire vers un autre après 15 lectures
void read_rc() {
int i, j, k = 0;
for (k = 14; k > -1; k--) {
if (ch1[k] > 10000) { j = k; }
} // détection espace de séparation 10000 µs dans l'autre tableau
for (i = 1; i <= 6; i++) {
ch[i] = (ch1[i + j] - 1000);
} // assigne les 6 valeurs de canal après l'espace de séparation
}
Processus de fabrication
- Surveiller la température de votre maison avec un tableau de bord Raspberry Pi
- Construire un décodeur DTMF avec un Arduino seul – Aucun CI supplémentaire nécessaire
- Créer un système Ambilight spectaculaire pour moniteur avec Arduino
- Construire un dispositif de lévitation ultrasonique avec Arduino – Guide étape par étape
- Programmer facilement les Atmel AT89 avec Arduino Uno – Guide pas à pas
- Construire un Voltmètre Intelligent avec Arduino et Smartphone – Projet DIY Facile
- Moniteur de Fréquence Cardiaque IoT en Temps Réel avec Arduino et MAX30100
- Serveur Web Arduino Uno WiFi : Commander une LED via Navigateur
- Compteur de stationnement intelligent : Suivi véhicule en temps réel avec Arduino, Processing et PHP