
Multiwii avec PS2 controller (manette).
#1
Posté 17 août 2012 - 03:01
J’espère trouver ici des conseils et des critiques qui feront avancer mon projet.
Mon projet est le suivant :
Faire un multiWii commandé par une manette de PS2 au lieu de la traditionnelle radio-commande.
La manette PS2 est prête à fonctionner, c'est à dire que j'ai récupéré toutes les info des joystick et des boutons qui la compose.
En effet grâce à un couple de XBEE pro et deux arduino UNO, ainsi que l'aide d'une bibliothèque réalisée par Billporterj'ai pu parvenir à ce résultat.
Le multiWii reste à construire, avant de me lancer j'aimerai jauger la faisabilité entre la manette PS2 et le multiwii.
Dans son fonctionnement normal, le multiWii embarque un récepteur qui permet de récupérer les ordres de la radio-commande.
En effet le récepteur est connecté a l'arduino, qui traite les ordres.
Dans le cas de mon projet l'arduino "récepteur" reçoit les ordres de la part de la manette PS2 et les stock dans des variables.
l'arduino récepteur reçoit les infos par liaisons séries.
Pour plus de clarté : la manette PS2 est couplé à un arduino+xbee "émetteur". Le multiWii aura ses coté l'arduino+xbee récepteur, cet arduino servira aussi a gerer les moteurs, PID...
Au vu du programme du multiWii pensez vous que c'est réalisable?
N'hesitez pas a me poser des questions pour avoir plus de details.
merci de votre aide.
#2
Posté 17 août 2012 - 03:28
#3
Posté 17 août 2012 - 03:41
Ta réponse me rassure.C'est faisable. Cela dépend de tes capacités en programmation mais il n'y a rien qui t’empêche de créer une fonction pour que le multiwii comprenne les commandes reçu de ta manette.
En programmation je comprend le langage simplifier de l'arduino. Mais le c++ c'est très dur pour moi, alors faire ou retoucher un programme c'est encore plus difficile.
Je pensais remplacer les variables qui donnent l'ordre d'avancer, reculer, gauche , droite, monter et descente par des variables acquise par le xbee.
Mais malheureusement je n'arrive pas a mettre la main dessus, dans le programme du multiWii.
Peux tu m'aider?
merci de l’intérêt que tu as porter a mon topic.
#4
Posté 17 août 2012 - 03:49
En faite il faut juste trouver les bonnes informations à envoyer.
Par exemple voilà un projet ou le joystick servait à commande le quad en passant par un XBee :
http://diydrones.com/profiles/blogs/multiwii-joystick-control-via-xbee
https://github.com/m...ino-RC-Receiver
Je vais regarder ça de plus près.
#5
Posté 17 août 2012 - 04:24
Je viens de parcourir le fichier config.h et a la ligne 319 il est question de RCserial.Je ne pense pas qu'on est besoin de modifier le code du multiwii, à mon souvenir on peut piloter le quad de 2 manière : Soit par une radio, soit par liaison série (quand il est directement branché à l'ordinateur par exemple). Or si tu branche le XBee sur les pins RX et TX de l'arduino du multiwii, ça doit être possible de le contrôler.
En faite il faut juste trouver les bonnes informations à envoyer.
Par exemple voilà un projet ou le joystick servait à commande le quad en passant par un XBee :
http://diydrones.com/profiles/blogs/multiwii-joystick-control-via-xbee
https://github.com/m...ino-RC-Receiver
Je vais regarder ça de plus près.
Il suffit donc de dé-commenter pour passer par ce mode, mais moi avec mon xbee j'ai des variable qui contiennent les ordres venant de la manette. variable qui contiennent soit des 0 et 1 soit un nombre entre 0 et 254.
je sais pas comment substituer les variables du multiwii par les miennes?
merci encore, je sens que les choses avance

- Mous aime ceci
#6
Posté 17 août 2012 - 04:35
/******************* RC signal from the serial port via Multiwii Serial Protocol *********/ //#define RCSERIALIl ne reste plus qu'à savoir ce que ton Arduino+xbee brancher à la manette est censé envoyer à l'autre xbee+multiwii pour que celle ci comprenne les instructions de pilotage. Une fois que l'on saura cela il nous restera plus qu'à transcrire les commande de la PS2 en commandes pour multiwii.
Bon, tu m'a devancé. Mon connexion à des ralentissement et je n'arrive pas à accéder au site de multiwii pour regarder la documentation.
#7
Posté 17 août 2012 - 04:49
Fais juste attention car c'est un programme qui comporte plusieurs codes imbriqués. Tu dois ouvrir le programme principale et lui ouvrira les autres. À part ça les Lib sont la.
Si tu le gardes ainsi pas de modification nécessaire.
#8
Posté 17 août 2012 - 04:58
//all new Special RX's must be added here //this is to avoid confusion <img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/smile.gif' class='bbc_emoticon' alt=':)' /> #if !defined(SERIAL_SUM_PPM) && !defined(SPEKTRUM) && !defined(SBUS) && !defined(RCSERIALERIAL) #define STANDARD_RX #endifEnsuite j'ai trouvé la partie qui s'occupe de traiter les commande RC par la pin RX (Serial.ino, ligne 157) :
case MSP_SET_RAW_RC: for(uint8_t i=0;i<8;i++) { rcData[i] = read16(); } headSerialReply(0); break;
Voici quelques informations supplémentaires sur ce topic :
http://www.multiwii.com/forum/viewtopic.php?f=8&t=1516 (topic New Multiwii Serial Protocol du forum, je ne peut pas tester le lien sur cette ordi, je l'ai consulté en 3G sur mon tel)
Je peut pas lire maintenant mais tout y est dans ce lien il me semble.
Je reviens plus tard dans la soirée.
#9
Posté 17 août 2012 - 05:01
merci pour toutes ces précieuses infos. je vais m y plonger tout de suiteBon déjà j'ai trouvé une erreur dans leur code (def.h ligne 1040), faudrait leur faire parvenir mais là ma connexion est vraiment limite (remplacer RCSERIALERIAL par RCSERIAL) :
//all new Special RX's must be added here //this is to avoid confusion <img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/smile.gif' class='bbc_emoticon' alt=':)' /> #if !defined(SERIAL_SUM_PPM) && !defined(SPEKTRUM) && !defined(SBUS) && !defined(RCSERIALERIAL) #define STANDARD_RX #endifEnsuite j'ai trouvé la partie qui s'occupe de traiter les commande RC par la pin RX (Serial.ino, ligne 157) :case MSP_SET_RAW_RC: for(uint8_t i=0;i<8;i++) { rcData[i] = read16(); } headSerialReply(0); break;
Voici quelques informations supplémentaires sur ce topic :
http://www.multiwii.com/forum/viewtopic.php?f=8&t=1516 (topic New Multiwii Serial Protocol du forum, je ne peut pas tester le lien sur cette ordi, je l'ai consulté en 3G sur mon tel)
Je peut pas lire maintenant mais tout y est dans ce lien il me semble.
Je reviens plus tard dans la soirée.
a tout a l'heure
#10
Posté 17 août 2012 - 05:17
C'est une bonne nouvelle qu'il n'y ai pas de grosse modification, par contre les petites modification reste a trouver et a tester dans le cas de la manette ps2Tout est la. Pas besoin de grosses modifications.
Fais juste attention car c'est un programme qui comporte plusieurs codes imbriqués. Tu dois ouvrir le programme principale et lui ouvrira les autres. À part ça les Lib sont la.
Si tu le gardes ainsi pas de modification nécessaire.

#11
Posté 17 août 2012 - 08:14
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][code=auto:0][data][checksum]
- [code=auto:0] 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.
#12
Posté 18 août 2012 - 03:14
Voici ce que j'envisage de faire :Bon déjà j'ai trouvé une erreur dans leur code (def.h ligne 1040), faudrait leur faire parvenir mais là ma connexion est vraiment limite (remplacer RCSERIALERIAL par RCSERIAL) :
//all new Special RX's must be added here //this is to avoid confusion <img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/smile.gif' class='bbc_emoticon' alt=':)' /> #if !defined(SERIAL_SUM_PPM) && !defined(SPEKTRUM) && !defined(SBUS) && !defined(RCSERIALERIAL) #define STANDARD_RX #endifEnsuite j'ai trouvé la partie qui s'occupe de traiter les commande RC par la pin RX (Serial.ino, ligne 157) :case MSP_SET_RAW_RC: for(uint8_t i=0;i<8;i++) { rcData[i] = read16(); } headSerialReply(0); break;
Voici quelques informations supplémentaires sur ce topic :
http://www.multiwii.com/forum/viewtopic.php?f=8&t=1516 (topic New Multiwii Serial Protocol du forum, je ne peut pas tester le lien sur cette ordi, je l'ai consulté en 3G sur mon tel)
Je peut pas lire maintenant mais tout y est dans ce lien il me semble.
Je reviens plus tard dans la soirée.
[code] case MSP_SET_RAW_RC: for(uint8_t i=0;i<8;i++) { rcData[0] = variableXG // joystick gauche axe x état entre 0 et 254. le point mort du joystick vaut 254/2 environ. rcData[1] = variableXD rcData[2] = variableYG rcData[3] = variableYD rcData[4] = variableBt1 // bouton état 0 ou 1 rcData[5] = variableBt2 rcData[6] = variableBt3 rcData[7] = variableBt4 } headSerialReply(0); break;[/code]
J'ai essayé d'introduire mon code d'acquisition de données par liaisons serie dans le fichier multiwii, mais malheuresement j'ai ce défaut qui apparaît :
SoftwareSerial\SoftwareSerial.cpp.o: In function `__vector_5': C:\Users\multi\Dropbox\arduino-1.0.1\libraries\SoftwareSerial/SoftwareSerial.cpp:316: multiple definition of `__vector_5' MultiWii_2_1.cpp.o:C:\Users\multi\AppData\Local\Temp\build4935098758099262038.tmp/MultiWii_2_1.cpp:6158: first defined here core.a(HardwareSerial.cpp.o): In function `__vector_18': C:\Users\multi\Dropbox\arduino-1.0.1\hardware\arduino\cores\arduino/HardwareSerial.cpp:100: multiple definition of `__vector_18' MultiWii_2_1.cpp.o:C:\Users\multi\AppData\Local\Temp\build4935098758099262038.tmp/MultiWii_2_1.cpp:8800: first defined here core.a(HardwareSerial.cpp.o): In function `__vector_19': C:\Users\multi\Dropbox\arduino-1.0.1\hardware\arduino\cores\arduino/HardwareSerial.cpp:192: multiple definition of `__vector_19' MultiWii_2_1.cpp.o:C:\Users\multi\AppData\Local\Temp\build4935098758099262038.tmp/MultiWii_2_1.cpp:8728: first defined here
Rien ne se passe comme on veut, il y a toujours des choses qui vont pas dans la programation

Et voici le code d'acquisition de donnée par liaison série :
#include <SoftEasyTransfer.h> #include <PS2X_lib.h> #include <SoftwareSerial.h> SoftwareSerial mySerial(2, 3); SoftEasyTransfer ET; struct RECEIVE_DATA_STRUCTURE{ int variableXG ; int variableXD ; int variableYG ; int variableYG ; int variableBt1 ; int variableBt2 ; int variableBt3 ; int variableBt4 ; }; RECEIVE_DATA_STRUCTURE mydata; void setup(){ mySerial.begin(9600); ET.begin(details(mydata), &mySerial); } void loop(){ //check and see if a data packet has come in. if(ET.receiveData()){ Serial.print(mydata.variableXG); Serial.print(","); Serial.print(mydata.variableXD); Serial.print(","); Serial.print(mydata.variableYG); Serial.print(","); Serial.print(mydata.variableYG); } delay(5); }(ce code marche bien, mais des que je l'introduit dans le fichier multiwii j'ai l'erreur présenté plus haut.
Help.
#13
Posté 18 août 2012 - 09:51
Attention à la fréquence de raffraichissement et au temps de transfert des infos issues de la manettes. 100ms, comme période de raffraichissement, ça n'est pas assez. A toi de voir comment le code du MultiWii est fichu, et à quelle fréquence il raffraichi les infos. Sur BOB4, c'est 50ms, donc 20 fois par secondes, et pourtant BOB4 est un drone plutôt stable et lent. Les radiocommandes modernes tournent à 100 raffraichissements par seconde, il me semble. Mais le standard, c'est 50 fois par seconde.
Attention aux modules Xbee, je ne sais pas du tout s'ils savent garantir un temps de transfert d'info suffisamment court. J'avoue que je n'ai pas l'info, à toi de fouiller.
Sur BOB4 (voir ma signature), j'utilise une transmission Bluetooth pour transmettre les infos des joysticks. J'ai du régler les 2 modules bluetooth pour avoir une garantie de temps de transmission. Je crois que ça garantit moins de 5ms de temps de transfert dans ce mode.
Tiens nous au courant de ce que tu réussis à faire.
Leon.
BOB4, mon drone hélicoptère autonome d'intérieur http://heli.bot.free.fr/
BOB3, mon robot autonome d'intérieur avec WiFi + Foxboard Linux http://ze.bot.free.fr/
BOB5, robot bipède simulé, puis tentative de réalisation (fail)
#14
Posté 18 août 2012 - 10:47
Le code est rafraîchit toutes les 10ms dans le cas du xbee. Je pense pouvoir le baisser encore.
Cela dit, je suis confronté un problème de compatibilité entre la bibliothèque qui gère la liaisons série et le programme MultiWii. Donc je suis au point mort pour l'instant.

#15
Posté 19 août 2012 - 06:08
Pourquoi utilises-tu "soft-Serial" comme bibliothèque. C'est une gestion de port série par soft, donc ça prends de la ressource. Ca risque de polluer, ralentir le soft d'asservissement de l'hélicoptère. Est-ce qu'il ne te reste pas des ports série gérés en hardware sur ton arduino? Il faut absolument privilégier ces ports hardware pour les liaisons séries. Surtout dans une applcation "temps réel" comme l'asservissement d'un drone!
Auquel cas tu utilises directement "Serial".
Leon.
BOB4, mon drone hélicoptère autonome d'intérieur http://heli.bot.free.fr/
BOB3, mon robot autonome d'intérieur avec WiFi + Foxboard Linux http://ze.bot.free.fr/
BOB5, robot bipède simulé, puis tentative de réalisation (fail)
#16
Posté 19 août 2012 - 12:33
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.
#17
Posté 19 août 2012 - 12:43
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.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.
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
#18
Posté 19 août 2012 - 01:54
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.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?
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.
BOB4, mon drone hélicoptère autonome d'intérieur http://heli.bot.free.fr/
BOB3, mon robot autonome d'intérieur avec WiFi + Foxboard Linux http://ze.bot.free.fr/
BOB5, robot bipède simulé, puis tentative de réalisation (fail)
#19
Posté 19 août 2012 - 02:55
Ton commentaire m'a donné une idée, qui peut être me débloquera: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.
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%
#20
Posté 19 août 2012 - 03:52
Bref, à toi de fouiller.
Bon courage, et tiens nous au courant.
Leon.
BOB4, mon drone hélicoptère autonome d'intérieur http://heli.bot.free.fr/
BOB3, mon robot autonome d'intérieur avec WiFi + Foxboard Linux http://ze.bot.free.fr/
BOB5, robot bipède simulé, puis tentative de réalisation (fail)
1 utilisateur(s) li(sen)t ce sujet
0 members, 1 guests, 0 anonymous users