Aller au contenu


Mous

Inscrit(e) (le) 17 août 2012
Déconnecté Dernière activité oct. 24 2013 12:54
-----

Messages que j'ai postés

Dans le sujet : Multiwii avec PS2 controller (manette).

19 août 2012 - 11:04

Tu as mal lu mon dernier post, la commande doit reçevoir les 8 channels en même temps et tu n'as absolument rien à modifier du code de la multiwii. De plus, si t'envoie un retour à la ligne à chaque fois ça ne risque pas de fonctionner, tu as encore des lacunes en programmations.
Donc :
1) Utiliser println qu'à la fin
2) Eviter d'en aligner pleins à la suite ça ne fera que ralentir pour rien.
3) Documente toi beaucoup plus sur la fréquence à la quel les messages doivent être envoyés.

Serial.print("$M<32200");
Serial.print("chan1"); // valeur de commande de 0 a 255 +1000
Serial.print("chan2"); // valeur de commande de 0 a 255 +1000
Serial.print("chan3"); // valeur de commande de 0 a 255 +1000
Serial.print("chan4"); // valeur de commande de 0 a 255 +1000
Serial.print("chan5"); // valeur de commande de 0 a 255 +1000
Serial.print("chan6"); // valeur de commande de 0 a 255 +1000
Serial.print("chan7"); // valeur de commande de 0 a 255 +1000
Serial.print("chan8"); // valeur de commande de 0 a 255 +1000
Serial.println("random"); //chiffre aléatoire en 0 et 9

Ce qui te reste à faire c'est d'envoyer dans le bon ordre.
Il faut donc que tu saches quel channel correspond à quel voie (Roll, Pitch, Throt, Yaw, aux1, aux2, aux3, aux4).

Et ça normalement c'est toi qui le configure, soit par le fichier config.h (dans la section 3), soit par le programme GUI (voir cette page : http://www.multiwii.com/software).

Effectivement le monde de la programmation je viens à peine d y mettre les pieds. C'est pour cette raison que je compte sur votre aide qui m'a été précieuse jus'que maintenant.

Cela dit, dans le lien que tu m'a passer il est question de :


$M>[data length][code][data][checksum]
1 octet '$'
1 octet 'M'
1 octet '<'
1 octet [data length]
1 octet [code]
several octets [data]
1 octet [checksum]

ce qui veut dire que je doit envoyer l'un après l'autre les symboles.

Ps: pour que je comprenne mieu mon erreur peux tu me dire pourquoi il ne faut pas de retour a la ligne langage arduino?

merci pour ton aide

Dans le sujet : Multiwii avec PS2 controller (manette).

19 août 2012 - 03:59

J'en sais rien si c'est cohérent ou pas. Je ne sais pas de quel programme tu parles, ni ce que signifient les lignes que tu me montres, ni à quoi elles servent.

Bref, à toi de fouiller.
Bon courage, et tiens nous au courant.

Leon.

Pas de problème, je test et je reviens donner des news.

Dans le sujet : Multiwii avec PS2 controller (manette).

19 août 2012 - 02:55

Tu l'as dit toi même un peu plus haut! Dans le code de Multi-Wii, tu as les paramètres "pich, Roll", etc... Chacun correspond au signal qui sort de ta radiocommande. Et il y en a bien évidemment au moins 4 qui correspondent aux 4 voies d'une radiocommande d'hélico de base :Roll, Pitch, Throt, Yaw.

Il n'y a pas d'ordre particulier, ce sont 4 variables qu'il faut mettre à jour, en fonction de la position (X-Y) de chacun de tes 2 joysticks (droite et gauche) de ta manette PS2.

J'avoue que je ne comprends pas là où tu bloques.

Leon.

Ton commentaire m'a donné une idée, qui peut être me débloquera:

Serial.println("$");
Serial.println("M");
Serial.println("<");
Serial.println("32");
Serial.println("200");
Serial.println("dataRoll"); // valeur de commande de 0 a 255 +1000
Serial.println("random"); //chiffre aléatoire en 0 et 9

Ce code on va supposer que c'est la commande de "Roll"

Serial.println("$");
Serial.println("M");
Serial.println("<");
Serial.println("32");
Serial.println("200");
Serial.println("dataPitch"); // valeur de commande de 0 a 255 +1000
Serial.println("random"); //chiffre aléatoire en 0 et 9

Celui-ci, la commande de Pitch

Serial.println("$");
Serial.println("M");
Serial.println("<");
Serial.println("32");
Serial.println("200");
Serial.println("dataThrot"); // valeur de commande de 0 a 255 +1000
Serial.println("random"); //chiffre aléatoire en 0 et 9

Celui-ci, la commande de Throt

Serial.println("$");
Serial.println("M");
Serial.println("<")
Serial.println("32");
Serial.println("200");
Serial.println("dataYam"); // valeur de commande de 0 a 255 +1000
Serial.println("random"); //chiffre aléatoire en 0 et 9

Celui-ci, la commande de Yaw

Et donc j'envoi cette série, continuellement. Le programme du MultiWii les récupère un par un et les traitent.


Tu me dis si cela te semble cohérent? car je suis ne suis pas sur a 100%

Dans le sujet : Multiwii avec PS2 controller (manette).

19 août 2012 - 12:43

Bon j'ai regarder un peu et voilà ce que j'ai compris :

Voici déjà un topic sur lequel je suis tombé et que j'aimerais partager, quelqu'un a eu exactement le même problème que toi.
http://www.multiwii.com/forum/viewtopic.php?f=15&t=1613

Je pense qu'à intervalle régulier (100ms ?) tu devrait envoyer la valeur de tes commandes RC.
Pour cela un petit serial.write() avec un message du type $M<[data length][coode][data][checksum]

  • [coode] correspond à la commande que tu veux envoyer, ici : MSP_SET_RAW_RC qui correspond à 200
  • [data] est la valeur des paramètres de la commande. Nous on veut envoyer à la suite la valeur des 8 channel RC. Ces valeurs sont comme on peut le voir dans le dernier topic que j'ai partagé comprissent entre 1000 et 2000. Donc pour transformer tes valeurs de la manette c'est très simple. Les valeurs des joystick vont de 0 à 256 donc il faut que tu les envoies en appliquant cette formule : (joystick * 4) + 1000. Pour les boutons tu envoie 1000 si relâché et 2000 si appuyé. Maintenant que tu sais comment imiter une télécommande RC il faut savoir une chose, comment vas tu gérer la manette des gaz par exemple, parce que sur une manette de Playstation c'est pas simple de faire quelque chose de précis. En revanche pour tourner je ne pense pas que tu aura un soucis. Ensuite tu peut aussi te passer des joystick pour certaines manœuvres. Exemple pour tourner le drone vers la droite sans le faire bouger (tourner sur lui même), tu pourra utiliser les touches L1 et R1 à condition de bien imiter une télécommande RC et là c'est toi qui voit, soit tu définie une vitesse prédéfinie à laquelle il tournera, soit tu t'arrange pour qu'il tourne de plus en plus rapidement selon la durée d'appuie. Bref, le code ne sera pas si difficile, la plus grosse difficulté résidera dans la manière dont ta la manette va piloter ton engin.
  • [data lengt] correspond à la taille des données envoyer qui sera de (nombre de channel RC * 4 chiffres) donc 8*4 = 32
  • [checksum] peut être n'importe quoi, c'est juste une sécurité. Sa taille n'est pas préciser, donc si tu génère un chiffre de 0 à 9 à chaque envoie ça devrait aller.

Voilà tout est dit, plus qu'à confirmer, j'aimerais bien me faire un code pour tester mais j'ai pas le matériel nécessaire sur moi.

Comme j'arrive pas a faire marcher la bibliothèque "softserial" avec mes données de commande et xbee, je vais passer par cette méthode en espérant qu'elle fonctionne.


Alors je résume :

Je récupère les commandes de la manette par un arduino UNO.
Je transfère à l'arduino du multiwii les commandes par le biais d'un coupe de xbee.

[Manette=>Arduino=>Xbee] (_liaisons série tx/rx_) [Xbee=>Arduino=>multiwii]

Donc dans le cas de ce système réalisé par Tommie, j'applique cette "formule":



$M<[data length][coode][data][checksum]

ce qui donne en langage arduino :
Serial.println("$");
Serial.println("M");
Serial.println("<");
Serial.println("32");
Serial.println("200");
Serial.println("data"); // valeur de commande de 0 a 255 +1000
Serial.println("random"); //chiffre aléatoire en 0 et 9

Ce qui m’échappe c'est quel code utiliser pour dire au multiwii d'avancer, monter etc....

Quel est le code pour chaque commande de mouvement?


merci

Dans le sujet : Multiwii avec PS2 controller (manette).

19 août 2012 - 12:33

@Leon:

Tu as raison, je sais pas pourquoi je m’entête a utiliser cette lib.
je vais utiliser la méthode normal préconiser par SRWieZ.