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