Désirant utiliser une vielle radio commande pour piloter mon robot, je cherche depuis quelques temps une méthode pour récupérer les infos des positions de manches et interrupteurs sans modifier la matériel.
Il existe depuis ‹ fort fort longtemps › un signal sur les radiocommandes qui fournit sur un fil unique les informations utiles, son petit nom, le CPPM.
En fait, historiquement, c’est un ‹ effet de bord › des premières radiocommandes, comme on ne pouvait pas numériser et/ou multiplexer les infos, les constructeurs les ont sérialisées.
Dans la liaison est envoyée de manière ‹ codée › :
position canal 1 , position canal 2 , position canal 3 , position canal 4 , position canal 5 , position canal 6 …
Dans la pratique, il a été choisi tout simplement de faire des impulsions dont la durée correspond à la position, et un pause sans impulsions pour indiquer le retour au début.
Ce système a par le passé permit également de relier 2 radiocommandes pour les élèves pilotes. Le prof avait un interrupteur qui permettait de choisir entre les impulsions venant de sa radio, ou de celles de son élève.
Au début, il y a eut plusieurs ‹ tailles › d’impulsion possibles selon les fabriquant, puis, petit à petit tout s’est uniformisé.
Aujourd’hui,
la durée mini d’une impulsion correspond à 1000µs
la durée maxi d’une impulsion correspond à 2000µs
Et c’est également de là que provient le signal qui est utilisé pour contrôler des servo moteurs.
Le signal pour contrôler des servo moteur s’appelle ‹ PPM › pour Pulse Position Modulation
Le signal de plusieurs infos PPM rassemblées s’appelle Combined Pulse Position Modulation CPPM.
D’un fabriquant à l’autre, pour simplifier, la valeur correspondante à la position est la durée des impulsions positives, ou la durée entre deux front montants, ou la durée entre deux impulsions positives…
Voilà à quoi ça ressemble
(Ici ce sont des impulsions ‹ negatives ›, mais en fait c’est la durée à l’état haut qui donne la position.)
une autre représentation, avec la ‹ conversion › du CPPM en signaux PPM pour bouger des servos
Quelques infos sur ce thème http://blog.oscarliang.net/pwm-ppm-difference-conversion/
Comme je n’arrive pas à trouver de librairie ‹ arduino › compatible avec ESP8266, je n’ai plus qu’a me créer la fonction
Plutôt que de partir de rien, j’ai quand même regardé ce qui se fait à droite à gauche. pas évident de s’y retrouver, mais ça donne toujours des idées.
Donc, ce que j’ai trouvé sur le net :
https://github.com/jorisplusplus/AR.Drone-ESP8266/blob/master/Drone.ino , extrait
void loop(void) {
attachInterrupt(2, rising, RISING); // pin 2 gérée en interruption, appel fonction 'rising' sur front montant (RISING)
fait des choses, reste du code
}
// fonction rising, détecte un début de pulse
void rising(void) {
start = micros();
attachInterrupt(2, falling, FALLING); // pin 2 gérée en interruption, appel fonction 'falling' sur front descendant (FALLING)
}
// fonction rising, détecte un début de pulse
void falling(void) {
unsigned int diff = micros() - start;
if(diff > 8000) {
if(pos == 6) {
dready = true;
}
pos = 0;
} else {
if(pos < 6) times[pos] = diff;
pos++;
}
if(dready) detachInterrupt(2);
else attachInterrupt(2, rising, RISING);
}
Il y a aussi des choses plus complètes par exemple sur http://sourceforge.net/p/arduinorclib/code/HEAD/tree/trunk/ , mais pas forcement plus exploitables.
Des échanges sur plusieurs forums http://forum.arduino.cc/index.php?topic=131905.0
Compte tenu des ‹ variantes › existantes et du signal dispo sur le matériel que je désire employer, je vais tenter de ré-écrire ça pour le rendre plus universel…