Page 1 sur 1

arduino/PPM

Posté : 10 mai 2014, 14:26
par tarrinos
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)

Image


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)

http://youtu.be/gk8Vh8jsnOE


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;

}

Re: arduino/PPM

Posté : 10 mai 2014, 19:19
par DanRZ
Salut, essayes de t'inspirer de ça par exemple :
https://code.google.com/p/generate-ppm- ... loads/list
( Télécharges le .ino c'est le code qui t'intéresse je pense )

Il doit y avoir un soucis de séquençage dans ton code et ça agit bizarrement.

;)

Re: arduino/PPM

Posté : 10 mai 2014, 21:36
par tarrinos
Merci beaucoup pour ta réponse :)

j'ai vu ces codes, mais avoue être un peu largué ....

j'aime encore bien comprendre tous ce que j'envoie dans mon ptit drone

Dan,

Re: arduino/PPM

Posté : 10 mai 2014, 21:48
par DanRZ
Salut, oué je comprends.

Je viens de regarder un peu plus loin et là où toi tu comptabilises tes temps de traitement avec tes delayMicroseconds
le code du lien calcule les vrais délais écoulés entre chaque action LOW/HIGH.

On le voit à la ligne 59 : "wait till servo signal time (values from the ppm array) has passed"

Quand tu attends un delayMicroseconds tu perds le temps passé par tes digitalWrite ...

Le code du lien calcule le temps effectivement écoulé avec des micros() qui doit retourner les microsecondes écoulées.
Si tu appelles micros() une fois, l'appel à micros() suivant te donnera le temps écoulé réellement.
Par différence, tu peux déduire si tu passes au signal suivant ou pas.

A mon avis, tu viens de mettre le doigt sur un problème de codage en "temps réel" ...

Re: arduino/PPM

Posté : 10 mai 2014, 22:03
par tarrinos
Un gros merci à toi !!!!!!!!!!

Je pense avoir sous-estimé le signal ppm de ma radio :)

je refouille et replonge dans le code !!!!!!!!!!!!!!!!!!

Dan,

Re: arduino/PPM

Posté : 11 mai 2014, 13:02
par tarrinos
DanRZ a écrit :Salut, essayes de t'inspirer de ça par exemple :
https://code.google.com/p/generate-ppm- ... loads/list
( Télécharges le .ino c'est le code qui t'intéresse je pense )

Il doit y avoir un soucis de séquençage dans ton code et ça agit bizarrement.

;)
Arg!

Je viens d'essayer ce code et les curseurs ont la bougeotte comme sur ma vidéo .

Je ne comprends plus ... J'ai tous remis à jour et même changé de carte arduino :wacko:

Dan,

Re: arduino/PPM

Posté : 11 mai 2014, 13:30
par DanRZ
Salut, contrôles bien la cohérence de tes masses, ça peut donner des comportements bizarres.

Re: arduino/PPM

Posté : 11 mai 2014, 14:01
par tarrinos
Merci,

la masse de l'arduino est bien sur la masse de ma prise écolage qui est la même que l'alimentation de ma radio ....

j'ai aussi ça : http://www.linkedin.com/groups/Ive-made ... S.94690328

avec l'exemple ppmout, mais je ne comprend rien au code et n'arrive pas à mettre 8 voies en remplaçant les potentiomètre par des valeurs fixes .

Si quelqu'un pouvait m'aider à ajuster ce code pour le tester ...

Dan,