Arduino – CPPM Library

Révision du 2015-08-06.

  • Ajout d’une trame de sortie CPPM.
  • Augmentation de la plage des temps Sync/Pulse/Frame.
  • Modification de la pulse de synchronisation sur le flanc descendant.

Cette librairie offre un interface pour décoder la trame d’un signal CPPM délivré par un récepteur R/C comme par exemple le modèle Orange R615X.
Ordinairement, la trame CPPM de 22ms limite le nombre maximum de servos/canaux à 9.

Nouveauté: La librairie génère également une trame CPPM en sortie.

Changement: La pulse de synchronisation démarre sur le flanc descendant.

Exemple

Trame CPPM 22ms

Les signaux des clichés suivants sont tous issus d’un récepteur Orange R920X.
L’émetteur est un Spektrum DX8 en mode DSMX 22ms.

Note 1: La trame CPPM est formée de 9 pulses servo concaténées et d’1 pulse de séparation.
Note 2: Le trig T est établi sur le flanc descendant de la pulse de séparation.

Note 1: Le curseur A est établi sur le flanc descendant du début de la trame CPPM.
Note 2: Le curseur B est établi sur le flanc descendant de la trame CPPM suivante.
Note 3: La longueur de la trame CPPM est plus précisément de 21980us.
Note 4: La longueur d’une trame CPPM non-synchronisée est d’environ 22120us.
Note 5: La longueur des trames CPPM non-synchronisées peut largement varier d’un modèle/fabricant d’un autre.

Pulse CPPM Servo 1520us

Note 1: Le curseur A est établi sur le flanc descendant de la pulse de synchronisation CPPM.
Note 2: Le curseur B est aligné sur le flanc descendant de la pulse de synchronisation suivante.
Note 3: La pulse servo CPPM démarre et finit par une pulse de synchronisation CPPM.
Note 4: La largeur médiane d’une pulse servo CPPM est plus précisément de 1510us.
Note 5: La largeur médiane d’une pulse servo CPPM peut varier largement d’un modèle/fabricant d’un autre.
Note 6: L’amplitude +/-100% de la pulse servo CPPM correspond approximativement à +/-455us.
Note 7: L’amplitude d’une pulse servo CPPM peut varier largement d’un modèle/fabricant d’un autre.

Pulse de synchronisation CPPM 300us

Attention: La largeur de la pulse de synchronisation standard FrSky standard  est de 300us. Le récepteur Orange R920X diffère largement de cette valeur.

Note 1: Le curseur A est aligné sur le flanc descendant de la pulse de synchronisation.
Note 2: Le curseur B est aligné sur le flanc montant de la pulse de synchronisation.
Note 3: La largeur de la pulse de synchronisation CPPM est plus précisément de 136us.
Note 4: La largeur de la pulse de synchronisation CPPM CPPM peut varier largement d’un modèle/fabricant d’un autre.

Implémentation

Cette librairie est utilisable seulement avec des implémentations ATmega328 des Arduino UNO, Duemillanove et similaires, également Leonardo. Elle utilise le Timer1 16bit. Donc les commandes PWM analogWrite() sur les pins 9 et 10 sont impossibles. La librairie Servo n’est également pas compatible parce qu’elle utilise également Timer1.

Le signal d’entrée CPPM est connecté sur la pin 8 Arduino nommée ICP1. Un signal de sortie CPPM est généré sur la pin 9 Arduino nommée OC1A. La pin 10 Arduino nommée OC1B n’a actuellement pas d’usage précis.

Cette implémentation diffère de https://github.com/claymation/CPPM en un point significatif: Les flancs sont capturés avec exactitude par le compteur hardware ICR1 avec une précision de 0.5us. Le compteur TCNT1 est un compteur incrémental jamais resetté par software.

L’implémentation a été testée intensivement avec les récepteurs Orange R920X (9 canaux) et Orange R615X (6 canaux)  et un émetteur Spektrum DX8.

Protégez le signal d’entrée CPPM des impulsions parasites que peut capturer ICP1. Ajoutez un condensateur 1nF entre ICP1 et GND et insérez une résistance 330ohms dans le signal CPPM. Cette précaution est particulièrement nécessaire lorsque des grands courants sont commutés(moteurs dc, etc…).

Installation

Téléchargment: https://github.com/jmparatte/CPPM

1. Télécharger le fichier ZIP.
2. Dans le menu Arduino, cliquer sur Croquis / Importer bibliothèque… / Add Library…
3. Verifier le contenu dézippé dans le dossier Documents/Arduino/libraries/CPPM.
4. Redémarrer l’environnement Arduino.
5. Connecter un récepteur et tester l’exemple Monitor.