arduino PPM

tarrinos

Nouveau membre
Bonjour à tous,

J’essaie de réaliser un montage avec une carte arduino afin de commander un quadricoptere dji phantom2.


Pour cela j’envoie un signal directement dans la prise écolage à l’arrière de ma radiocommande futaba f8fg pour simuler une autre radio (élevé/pilote)


Le programme est des plus simple, je reproduit simplement le signal PPM qui transite entre les deux radio et commence par mettre un peu de lacet afin de faire tourner mon petit drone sur lui-même.
Je test …
Cela fonctionne, l’engin tourne bien sur lui-même mais dérive pas mal …
Je revérifie avec mon oscilloscope le signal que je balance et ne vois rien d’anormal … (photo)

osci.jpg




Je vais dans l’assistant dji pour regarder ce qui se passe sur les voies et la dès que j’enclenche le switch écolage (carte arduino) les curseurs se mettent à danser ? (video)




Je ne comprends vraiment pas.
J’ai tous vérifié et tous semble ok.
Avez-vous une idée du problème ?


Merci à vous
Dan,


Le prog :
/* arduino_radio_ppm
Daniel Wambach 21 mars 2014
*/

// constantes

// choix des entrées/sorties
const int Sortie_ppm = 8;

// Variables:

int roulis_ppm = 1100;
int tangage_ppm = 1100;
int gaz_ppm = 1100;
int lacet_ppm = 1185; //15 sec
int rd_ppm = 500;
int sr_ppm = 1450;
int se_ppm = 1450;
int nc_ppm = 1100;

int t_entre_imp = 400;
int t_entre_sec = 22000;
int nombre_de_cycle = 0;


void setup() {

// entrée/sortie 8 (Sortie_ppm) est une sortie
pinMode(Sortie_ppm, OUTPUT);
}

void loop()
{
digitalWrite(Sortie_ppm, LOW); // met la broche à 1 (niveau HAUT)
delayMicroseconds(t_entre_imp);

digitalWrite(Sortie_ppm, HIGH); // met la broche à 1 (niveau HAUT)###ROULIS###
delayMicroseconds(roulis_ppm);
digitalWrite(Sortie_ppm, LOW); // met la broche à 0 (niveau BAS)
delayMicroseconds(t_entre_imp);

digitalWrite(Sortie_ppm, HIGH); // met la broche à 1 (niveau HAUT)###TANGAGE###
delayMicroseconds(tangage_ppm);
digitalWrite(Sortie_ppm, LOW); // met la broche à 0 (niveau BAS)
delayMicroseconds(t_entre_imp);

digitalWrite(Sortie_ppm, HIGH); // met la broche à 1 (niveau HAUT)###GAZ###
delayMicroseconds(gaz_ppm);
digitalWrite(Sortie_ppm, LOW); // met la broche à 0 (niveau BAS)
delayMicroseconds(t_entre_imp);

digitalWrite(Sortie_ppm, HIGH); // met la broche à 1 (niveau HAUT)###LACET###
delayMicroseconds(lacet_ppm);
digitalWrite(Sortie_ppm, LOW); // met la broche à 0 (niveau BAS)
delayMicroseconds(t_entre_imp);

digitalWrite(Sortie_ppm, HIGH); // met la broche à 1 (niveau HAUT)###RD###
delayMicroseconds(rd_ppm);
digitalWrite(Sortie_ppm, LOW); // met la broche à 0 (niveau BAS)
delayMicroseconds(t_entre_imp);

digitalWrite(Sortie_ppm, HIGH); // met la broche à 1 (niveau HAUT)###SR###
delayMicroseconds(sr_ppm);
digitalWrite(Sortie_ppm, LOW); // met la broche à 0 (niveau BAS)
delayMicroseconds(t_entre_imp);

digitalWrite(Sortie_ppm, HIGH); // met la broche à 1 (niveau HAUT)###SE###
delayMicroseconds(se_ppm);
digitalWrite(Sortie_ppm, LOW); // met la broche à 0 (niveau BAS)
delayMicroseconds(t_entre_imp);

digitalWrite(Sortie_ppm, HIGH); // met la broche à 1 (niveau HAUT)###LIBRE###
delayMicroseconds(nc_ppm);
digitalWrite(Sortie_ppm, LOW); // met la broche à 0 (niveau BAS)
delayMicroseconds(t_entre_imp);

t_entre_sec = (22000 - (roulis_ppm + tangage_ppm + gaz_ppm + lacet_ppm + rd_ppm + sr_ppm + se_ppm + nc_ppm +3600));

digitalWrite(Sortie_ppm, HIGH); // met la broche à 1 (niveau HAUT)

delayMicroseconds(t_entre_sec);

nombre_de_cycle=nombre_de_cycle+1;

}
 
Tout d'abord, le temps de l'impulsion négative doit être de 300 µs et non 400.

Ensuite, la fonction delayMicroseconds() est précise dans une fourchette de +/- 20 %, ce qui apparaît très clairement sur ta vidéo.

Il existe des bouts de code qui générent le signal PPM en utilisant un timer et des interruptions, produisant une sortie beaucoup plus stable.
 
jpparisy;2299528 à dit:
Tout d'abord, le temps de l'impulsion négative doit être de 300 µs et non 400.

Ensuite, la fonction delayMicroseconds() est précise dans une fourchette de +/- 20 %, ce qui apparaît très clairement sur ta vidéo.

Il existe des bouts de code qui générent le signal PPM en utilisant un timer et des interruptions, produisant une sortie beaucoup plus stable.

Merci jpparisy !


20% ???? :eek

Oui ça ressemble à ça, j'avoue que je ne maitrise ni les timers, ni les interruptions , je vais fouiller un peu ... Si tu as des liens, je suis preneur :)

Pour les 400 je pense que mon code est correcte ...

Dan,
 
tarrinos;2299538 à dit:
Si tu as des liens, je suis preneur :)
Dans Google, une recherche sur "arduino ppm generator", donne au moins deux résultats intéressants : http://www.rcgroups.com/forums/showthread.php?t=1808432, qui est un programme Arduino complet et http://www.linkedin.com/groups/Ive-made-RC-library-Arduino-1268377.S.94690328, présenté sous forme de bibliothèque Arduino.

Il y en a certainement d'autres tout aussi intéressants, je n'ai pas tout regardé.

Pour la construction d'un signal PPM, lis les documents théoriques de Monsieur F. Thobois, ils ne sont pas de première jeunesse, mais jamais rien de mieux n'a été écrit jusqu'à nos jours.
 
Haut