arduino  RC Navy (2015)

Exemple asynchrone avec les librairies <TinyPpmGen> et <TinyPpmReader>

Cet exemple montre la facilité d'utilisation des bibliothèques TinyPpmGen et TinyPpmReader pour:
- Générer un train PPM
- Lire un train PPM
- Ajouter une voie
- Changer la modulation PPM
- Regénérer un train PPM

Génération/Lecture/Regénération train PPM

1) Sketch chargé dans l'arduino Digispark

Ce sketch génère une train PPM tel qu'on peut le trouver sur la prise écolage d'un émetteur RC.

#include <TinyPpmGen.h>
#include <Rcul.h>

#define CH_MAX_NB 4

#define STEP_US 5

#define PULSE_WIDTH_MIN_US 1000
#define PULSE_WIDTH_MAX_US 2000
#define PPM_PERIOD_US 20000

uint16_t Width_us = PULSE_WIDTH_MAX_US;
uint16_t Step_us = STEP_US;

void setup()
{
TinyPpmGen.begin(TINY_PPM_GEN_POS_MOD, CH_MAX_NB, PPM_PERIOD_US);
TinyPpmGen.setChWidth_us(1, 500); /* RC Channel#1 */
TinyPpmGen.setChWidth_us(2, 1000); /* RC Channel#2 */
TinyPpmGen.setChWidth_us(3, 1500); /* RC Channel#3 */
TinyPpmGen.setChWidth_us(4, 2000); /* RC Channel#4 */
}

void loop()
{
TinyPpmGen.setChWidth_us(CH_MAX_NB, Width_us); /* Sweep RC Channel#4 */
Width_us += Step_us;
if(Width_us > PULSE_WIDTH_MAX_US) Step_us = -STEP_US; /* Max reached: change direction */
if(Width_us < PULSE_WIDTH_MIN_US) Step_us = +STEP_US;
/* Min reached: change direction */
 delay(10); /* Will not block the PPM frame generation: TinyPpmGen is an interrupt-driven library */
}


Détails du sketch chargé dans le Digispark:
L'arduino Digispark génère un train PPM de modulation positive transportant 4 voies à l'aide de la bibliothèque TinyPpmGen.
- la période du train PPM est de 20000µs (20ms)
- l'impulsion de la voie N°1 a une largeur constante de   500µs
- l'impulsion de la voie N°2 a une largeur constante de 1000µs
- l'impulsion de la voie N°3 a une largeur constante de 1500µs
- l'impulsion de la voie N°4 a une largeur variant de 1000 à 2000µs
- Le train PPM est disponible sur la broche 0 du Digispark (voir contenu du fichier TinyPpmGen.h)


2) Sketch chargé dans l'arduino UNO

Ce sketch lit le train PPM reçu et en régénère un nouveau avec certaines modifications.

#include <TinyPinChange.h>
#include <TinyPpmReader.h>
#include <TinyPpmGen.h>
#include <Rcul.h>

#define PPM_INPUT_PIN 2

#define CHANNEL_NB 5

#define STEP_US 5

#define PULSE_WIDTH_MIN_US 1000
#define PULSE_WIDTH_MAX_US 2000
#define PPM_PERIOD_US 20000

uint16_t Width_us = PULSE_WIDTH_MAX_US;
uint16_t Step_us = STEP_US;

void setup()
{
TinyPpmReader.attach(PPM_INPUT_PIN); /* Attach TinyPpmReader to PPM_INPUT_PIN pin */
TinyPpmGen.begin(TINY_PPM_GEN_NEG_MOD, CHANNEL_NB,
PPM_PERIOD_US); /* <- Please note NEG */
}

void loop()
{
if(TinyPpmReader.isSynchro()) /* Occurs every 20ms */
{
Width_us += Step_us;
if(Width_us > PULSE_WIDTH_MAX_US) Step_us = -STEP_US;
if(Width_us < PULSE_WIDTH_MIN_US) Step_us = +STEP_US;

TinyPpmGen.setChWidth_us(1, Width_us); /* RC Channel#1: sweeps between 1000 and 2000µs */
TinyPpmGen.setChWidth_us(2, 3000 - Width_us); /* RC Channel#2:
sweeps between 2000 and 1000µs */
TinyPpmGen.setChWidth_us(3, TinyPpmReader.width_us(3)); /* RC Channel#3: forward rx value */
TinyPpmGen.setChWidth_us(4, TinyPpmReader.width_us(4)); /* RC Channel#4:
forward rx value */
TinyPpmGen.setChWidth_us(5, 2000);
/* RC Channel#5: added with a fixed pulse width (2000 us) */
}
}

Détails du sketch chargé dans l'arduino UNO:
L'arduino UNO lit le train PPM généré par le Digispark
à l'aide de la bibliothèque TinyPpmReader et génère un nouveau train PPM de modulation négative transportant 5 voies (et non plus 4) à l'aide de la bibliothèque TinyPpmGen.
- la période du train PPM est de 20000µs (20ms)
- la modulation PPM est désormais négative (il est évidemment possible de de la rendre positive)

- l'impulsion de la voie N°1 a une largeur
variant de 1000 à 2000µs (en remplacement de la valeur 500µs fixe reçue)
- l'impulsion de la voie N°2 a une largeur
variant de 2000 à 1000µs (en remplacement de la valeur 1000µs fixe reçue)
- l'impulsion de la voie N°3 a une largeur constante de 1500µs (fait suivre la valeur reçue)
- l'impulsion de la voie N°4 a une largeur variant de 1000 à 2000µs
(fait suivre la valeur reçue)
- la voie N°5 est ajoutée au train PPM et a une largeur fixe de 2000µs

- Le nouveau train PPM généré est disponible sur la broche 6 de l'UNO (voir contenu du fichier TinyPpmGen.h)


3) Le résultat en vidéo



- La trace du haut correspond à la trame PPM généré par l'arduino Digispark et qui est lue par l'arduino UNO.
- La trace du bas correspond à la trame PPM générée par l'UNO après traitement.
- L'arduino UNO remplace les voies N°1 et N°2, fait suivre les voies N°3 et N°4 et finit par ajouter la voie N°5 de largeur fixe.
- Le défilement observé des 2 trains PPM est normal: le Digispark et l'UNO n'étant pas synchronisés. Cela démontre l'aspect asynchrone.


4) Tout cela, c'est bien, mais ça sert à quoi?

Pour en comprendre l'intérêt, jetez un oeil sur le bas de la page suivante: extensions universelles pour ensembles RC


Retour