Annonce

Réduire
Aucune annonce.

Complément Cockpit Saitek avec Arduino

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Complément Cockpit Saitek avec Arduino

    Bonjour.
    Je possède un joystick thrustmaster (je me sers de la manette de gaz comme collective), un palonnier et un throttle quadrant saitek.
    J'aimerais avoir un matériel plus sérieux; je pensais acheter un bloc PA et un switch panel chez saitek.
    Ah oui, je suis sur mac, j'ai téléchargé un plugin-driver mais ça on verra plus tard.
    Il y a, je trouve, des lacunes dans les fonctions de ces deux blocs de commandes :
    • L'absence d'un bouton pour les freins
    • Les volets sont conrôlés par deux boutons, la position de ceux-ci ne sera pas absolue.

    Adepte de la programmation, je pensais utiliser ma UNO.
    J'ai donc téléchargé une bibliothèque pour faire communiquer mon Arduino et X-Plane par UDP, et j'en suis très content.
    J'ai donc une série de 6 leds vertes indiquant la position de la commande de volets; cette valeur est adaptée à tous les avions d'X-Plane : 3 crans de 2 leds, 2 crans de 3 leds ou 6 crans d'une led.
    Une led rouge au dessus de cette série verticale m'indique que les volets sont en mouvements lorsqu'elle est allumée fixe et qu'ils sont bloqués rentrés lorsqu'elle clignote.
    D'autres part, j'ai un bouton et un voyant pour les freins.
    Seul "problème" (disons inconvénient), la fonction cmd_in pour serrer/déserrer les freins envoie certes une commande (TX du Shield Ethernet s'allume), mais X-Plane semble ne pas la reconnaître…
    J'ai donc utilisé la fonction dref_in pour mettre la variable du frein avant à 1.
    Je demande donc votre aide pour faire fonctionner correctement la fonction cmd_in.

    Pour le plugin, j'ai téléchargé un certain "XplanePanelsPlugin.zip" dont je n'ai plus l'origine (j'essaierai de la retrouver, mais rien n'est urgent…).

    Merci de votre aide, je peux poster mon programme à la demande
    Contrôleur à Saint-Ex (LFLL) exclusivement, sur IVAO. FS2 - AS3

    iMac 21,5 " Mac OSX 10.9.5 Mavericks — 2,9Ghz Intel Core i5 quadricœur — 8 Go RAM 1600 Mhz DDR3 — NVIDIA GeForce GT 750M 1024 Mo
    X-Plane 9.70, FA7X — Thrustmaster T-Flight Hotas X — Saitek : Palonnier PZ35, Gaz PZ45, Switch PZ55, Multi PZ70

  • #1
    Envoyé par numero_744 Voir le message
    Merci de votre aide, je peux poster mon programme à la demande
    Effectivement, sans cela il est difficile de répondre.
    XP11.41 - WIN 7 - i7 - GTX970

    Commentaire


    • #1
      Voici mon œuvre :

      Code:
      #include <SPI.h>
      #include <Ethernet.h>
      #include <XPlaneData.h>
      byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
      int XPR = 49001;
      int XPW = 49000;
      int IPx[] = {169, 254, 99, 87};
      
      XPlaneData XPData(XPR, XPW, IPx, mac);
      
      float flaps;//position volets
      float flaps_pre;//position volet loop precedent
      boolean flapsStt;//volets positionnes ?
      float brakes;//frein parkign serre ?
      boolean flapsFail;//volets bloques sur 0
      float battery;//batterie allumee ?
      float flapsCmd;//position souhaitee volets
      boolean btBrkPrsd_pre;//bouton frein parking presse loop precedent ?
      
      void setup()  {
        XPData.begin();
        XPData.cmd_in("sim/none/none");
        pinMode(2, OUTPUT);
        pinMode(7, OUTPUT);
        pinMode(8, INPUT_PULLUP);
        digitalWrite(8, HIGH);
        pinMode(14, OUTPUT);
        pinMode(15, OUTPUT);
        pinMode(16, OUTPUT);
        pinMode(17, OUTPUT);
        pinMode(18, OUTPUT);
        pinMode(19, OUTPUT);
      }
      
      void loop() {
        if(!digitalRead(8)) {
          if(!btBrkPrsd_pre) {
            XPData.dref_in("sim/cockpit2/controls/parking_brake_ratio[0]", 1); //C'est ici que j'aimerais pouvoir utiliser cmd_in
            btBrkPrsd_pre = true;
          }
        } else if(btBrkPrsd_pre) btBrkPrsd_pre = false;
        
        
        if (XPData.udpin()) {
          flaps = XPData.Dget(13, 5);
          brakes = XPData.Dget(14, 2);
          battery = XPData.Dget(57, 1);
          flapsCmd = XPData.Dget(13, 4);
          
          if(battery) digitalWrite(7, brakes ? HIGH : LOW);
          
          if(battery) {
            digitalWrite(14, flapsCmd >= 0.09 ? HIGH : LOW);
            digitalWrite(15, flapsCmd >= 0.25 ? HIGH : LOW);
            digitalWrite(16, flapsCmd >= 0.42 ? HIGH : LOW);
            digitalWrite(17, flapsCmd >= 0.59 ? HIGH : LOW);
            digitalWrite(18, flapsCmd >= 0.75 ? HIGH : LOW);
            digitalWrite(19, flapsCmd >= 0.95 ? HIGH : LOW);
          }
          if(flaps_pre != flaps) {
            flaps_pre = flaps; 
            flapsStt = false;
          } else {
            flapsStt = true;
          }
          if(flapsCmd != 0 && flaps == 0) flapsFail = true;
          else flapsFail = false;
        }
        
        if(flapsFail && battery) {
          if(millis() % 1000 > 500)
            digitalWrite(2, HIGH);
          else
            digitalWrite(2, LOW);
        }
        
        if((!flapsStt) && battery) digitalWrite(2, HIGH);
        if((!flapsFail) && flapsStt) digitalWrite(2, LOW);
        if(battery == 0) {
          digitalWrite(2, LOW);
          digitalWrite(7, LOW);
          for(int i = 14; i < 20; i++) {
            digitalWrite(i, LOW);
          }
        }
      }
      J'aimerais pouvoir utiliser cmd_in au début du loop(), à l'endroit indiqué.

      Merci de vos réponses.
      Contrôleur à Saint-Ex (LFLL) exclusivement, sur IVAO. FS2 - AS3

      iMac 21,5 " Mac OSX 10.9.5 Mavericks — 2,9Ghz Intel Core i5 quadricœur — 8 Go RAM 1600 Mhz DDR3 — NVIDIA GeForce GT 750M 1024 Mo
      X-Plane 9.70, FA7X — Thrustmaster T-Flight Hotas X — Saitek : Palonnier PZ35, Gaz PZ45, Switch PZ55, Multi PZ70

      Commentaire


      • #1
        Voici mes propositions par rapport à la méthode proposée (méthode actuelle).

        Méthode actuelle

        if(!digitalRead(8)) {
        if(!btBrkPrsd_pre) {
        XPData.dref_in("sim/cockpit2/controls/parking_brake_ratio[0]", 1); //C'est ici que j'aimerais pouvoir utiliser cmd_in

        btBrkPrsd_pre = true;
        }
        } else if(btBrkPrsd_pre) btBrkPrsd_pre = false;

        Méthode 1a

        if(!digitalRead(8)) XPData.cmd_in(«flight_controls/brakes_toggle_regular») ;

        Méthode 1b (si méthode 1a ne fonctionne pas)

        if(!digitalRead(8))
        { if(!btBrkPrsd_pre)
        { XPData.cmd_in(«flight_controls/brakes_toggle_regular»);
        btBrkPrsd_pre = true;
        }
        }
        else btBrkPrsd_pre = false;

        Méthode 2

        if(!digitalRead(8)) XPData.key_in(‘b’) ;

        Méthode 3

        XPData.Button_Key(8, «b») ;

        Méthode 4

        XPData.Button_Cmd(8, «flight_controls/brakes_toggle_regular») ;


        Il ne faut pas écrire "sim/" dans la fonction à appeler car la bibliothèque l'insère automatiquement pour gagner de la place (selon site 'svglobe.com').
        Le freinage se commande par une bascule. Cela simplifie les tests à faire dans le programme puisque la fonction est à activer si la touche est enfoncée quel que soit son état précédent.

        Je n'ai pas essayé ces méthodes mais elles devraient fonctionner.
        Ces fonctions ne sont pas toutes complètement documentées (exemple 'key_in' et 'Button_Key' répétitives ou non?).
        Il faudra peut-être réintroduire un test le cas échéant.
        Dernière modification par FlyingBaldy, 30 septembre 2014, 17h47.
        XP11.41 - WIN 7 - i7 - GTX970

        Commentaire


        • #1
          Merci FlyingBaldy pour votre réponse.
          Lorsque je remplace la ligne
          Code:
          XPData.dref_in("sim/cockpit2/controls/parking_brake_ratio[0]", 1);
          par
          Code:
          XPData.cmd_in("flight_controls/brakes_toggle_max");
          Rien ne se passe dans le simulateur. Il me dit pourtant bien qu'il reçoit une commande mais n'arrive apparemment pas à l'utiliser.
          J'ai essayé de remplacer par
          Code:
          XPData.cmd_in(«flight_controls/brakes_toggle_regular»);
          Et ça ne fonctionne pas non-plus. Les key_in fonctionnent mais mon but est de désattribuer les touches du clavier. (Et puis je trouve ça moins propre…)

          Pour les méthodes 3 et 4, j'ai dû louper une info car je n'arrive pas à compiler. Je ne comprends pas où placer la ligne.
          Pour le "sim/" merci de me l'avoir indiqué, j'avais zappé l'info…

          Question un peu à côté, pourquoi "regular" plutôt que "max" ? (Je ne connais pas bien toute la technique des avions…)

          En tous cas encore merci pour votre réponse, vous n'imaginez pas à quel point je rêvais de mêler X-Plane et Arduino donc ça me fait très plaisir d'avoir votre aide.
          Contrôleur à Saint-Ex (LFLL) exclusivement, sur IVAO. FS2 - AS3

          iMac 21,5 " Mac OSX 10.9.5 Mavericks — 2,9Ghz Intel Core i5 quadricœur — 8 Go RAM 1600 Mhz DDR3 — NVIDIA GeForce GT 750M 1024 Mo
          X-Plane 9.70, FA7X — Thrustmaster T-Flight Hotas X — Saitek : Palonnier PZ35, Gaz PZ45, Switch PZ55, Multi PZ70

          Commentaire


          • #1
            Bonjour,
            Ton sketch Arduino ne fonctionne pas avec ‘cmd_in’ mais fonctionne-t-il avec ‘dref_in’ ?
            Je pense à plusieurs causes possibles de non fonctionnement :
            • X-Plane a-t-il été mis à jour (menu ‘Settings’ puis ‘Net Connections’ puis onglet ‘Advanced’ puis zone ‘IP for Data Output’) avec :
              • la bonne adresse mac de la carte Arduino
              • le bon numéro de port (49001 au lieu de 49000 comme indiqué par défaut par X-Plane)

            • la librairie ‘XPlaneData’ a-t-elle bien été ajoutée au programme Arduino (IDE)? Si ce n’est pas le cas, il faut (faire ce qui suit est plus facile et plus rapide que l’expliquer):
              • aller sur la page http://arduino.svglobe.com/xplib.html
              • trouver et cliquer le lien « Download XPlaneData library (à droite, ou en bas de la page) puis enregistrer ce fichier ZIP sur l’ordinateur
              • Ouvrir l’application Arduino
              • Ouvrir le menu ‘sketch’ ou ‘croquis’
              • Sélectionner ‘import library’ ou ‘importer bibliothèque’ puis ‘Add library‘
              • Dans la boîte de dialogue, sélectionner le ZIP de la librairie XPlaneData (ne pas dézipper, Arduino s’en charge)

            • la librairie ‘XplaneData’ est-elle bien celle du 28/9 ?
              • éventuellement recharger la librairie



            La méthode la plus facile devrait être la méthode 4.
            Pour l’utiliser, il suffit de remplacer toutes les lignes suivantes :
            if(!digitalRead(8)) {
            if(!btBrkPrsd_pre) {
            XPData.dref_in("sim/cockpit2/controls/parking_brake_ratio[0]", 1); //C'est ici que j'aimerais pouvoir utiliser cmd_in
            btBrkPrsd_pre = true;
            }
            } else if(btBrkPrsd_pre) btBrkPrsd_pre = false;
            par celle-ci :
            XPData.Button_Cmd(8, «flight_controls/brakes_toggle_regular») ;
            Que fait cette fonction ‘Button_Cmd’ ? lorsque le signal lu sur la broche 8 devient actif (lorsqu’il passe à la masse), alors la commande entre les guillemets est envoyée à X-Plane.
            En effet, la lecture de la librairie utilise les instructions suivantes pour la fonction ‘Button_Cmd’ :
            void XPlaneData::Button_Cmd(int in, char* D_com) { //button "toggle", button "set"
            if((A_range == in && state ==1 ) || (D_read(in) == 1 && state ==0))
            { cmd_in(D_com); delay(2); }
            int XPlaneData::D_read(int in) { //read one input (pin #), fix in mem, return status
            if (in>100) { return Bus_read(in);} //-- if BUS
            boolean rd = !digitalRead(in);
            if (rd != In_mem[in]) { In_mem[in] = rd; return rd; } // return pin changed
            if (rd) return 2; else return 3; }
            En pratique :
            • Lecture du signal de la broche numéro ‘in’ (‘in’=8 dans notre cas) par la fonction ‘D_read(in)’.
            • Si cette fonction retourne la valeur 1 et que ‘state’=0 (ce qui est la cas) alors envoi de la commande spécifiée comme deuxième paramètre (texte entre guillemets).
            • Comment fonctionne la fonction ‘D_read(in)’ ?
              • inversion du signal (rd = ! (broche ‘in’) ) : ‘rd’ est actif lorsque la broche est à la masse puisque nous avons défini la broche 8 en entrée PULLUP (inactive par défaut et active lorsque la broche est mise à la masse, ce qui simplifie le câblage puisqu’il suffit de relier l’interrupteur à la masse).
              • Selon la valeur de rd et de son état au passage précédent :
                • Si rd = 1 et qu’il était à 0, nous avons un signal de déclenchement de l’action, quelle que soit la durée d’actionnement de l’interrupteur. Dans ce cas, sortie de la routine avec la valeur 1.
                • Si rd=0 et qu’il était à 1, on arrête d’activer l’interrupteur, dans ce cas, sortie de la routine avec la valeur 0.
                • Si rd=1 et qu’il était à 1, pas de changement d’état de l’interrupteur, dans ce cas, pas sortie de la routine avec la valeur 2.
                • Si rd=0 et qu’il était à 0, pas de changement d’état de l’interrupteur, dans ce cas, sortie de la routine avec la valeur 3.




            En résumé, la fonction ‘Button_Cmd(8, « texte de la commande »)’ lit, à chaque passage dans la boucle, la valeur de la broche digitale numéro 8 et envoie la commande « texte de la commande » uniquement lorsque l’on bascule l’interrupteur vers la masse. Il ne faut donc plus aucun test pour les freins dans ton sketch Arduino.
            XP11.41 - WIN 7 - i7 - GTX970

            Commentaire


            • #1
              Le programme entier que j'ai posté est fonctionnel.
              X-Plane est en 9.70 (à jour)
              Le numéro de port a bien été modifié en 49001
              J'ai bien la librairie dans l'IDE (je les ajoutes toujours manuellement)
              J'ai téléchargé la librairie récemment, mais peut-être avant le 28/09.
              Code:
              XPData.Button_Cmd(8, «flight_controls/brakes_toggle_regular»);
              Il ne compile pas (Button_Cmd absent dans la librairie).

              J'ai re-téléchargé la librairie (celle que j'avais était manifestement obsolète…)
              IDE Arduino version 1.0.5
              Je télécharge la version 1.5 bêta. (svglobe dit pour version 1.5.x sur le fichier à télécharger de droite).
              En attendant j'essaie quand-même avec ma version actuelle de l'IDE et la nouvelle version de la librairie…
              C'EST UN CAUCHEMARD !!!
              dref_in n'est plus traité par x-plane (mais reçu…)
              Je remplace le tout par Button_Cmd. Même résultat !
              Je dézippe la bêta de l'IDE Arduino…
              Je l'utilise… Ça compile pas à cause d'un certain fichier Wire.h absent !

              Je m'arrête là pour ce soir. À demain pour de nouvelles aventures !

              P.S. : Les smileys sont un bon défouloir !
              Contrôleur à Saint-Ex (LFLL) exclusivement, sur IVAO. FS2 - AS3

              iMac 21,5 " Mac OSX 10.9.5 Mavericks — 2,9Ghz Intel Core i5 quadricœur — 8 Go RAM 1600 Mhz DDR3 — NVIDIA GeForce GT 750M 1024 Mo
              X-Plane 9.70, FA7X — Thrustmaster T-Flight Hotas X — Saitek : Palonnier PZ35, Gaz PZ45, Switch PZ55, Multi PZ70

              Commentaire


              • #1
                Envoyé par numero_744 Voir le message
                ...Ça compile pas à cause d'un certain fichier Wire.h absent ! ...
                Dans libraries\Wire ?

                PhM
                X-Plane 9.70 & 11.5r1 / W10 / AMD Ryzen 7 2700 / 8Go RAM / Sapphire R9 390 Nitro 8Go / Sapphire HD7870 GHz 2Go / Samsung LN40C530 / Oculus DK2 / LeapMotion / Saitek X56 / Thrustmaster Pendular Rudder

                Commentaire


                • #1
                  Effectivement, il est absent ! Pourquoi ?
                  Contrôleur à Saint-Ex (LFLL) exclusivement, sur IVAO. FS2 - AS3

                  iMac 21,5 " Mac OSX 10.9.5 Mavericks — 2,9Ghz Intel Core i5 quadricœur — 8 Go RAM 1600 Mhz DDR3 — NVIDIA GeForce GT 750M 1024 Mo
                  X-Plane 9.70, FA7X — Thrustmaster T-Flight Hotas X — Saitek : Palonnier PZ35, Gaz PZ45, Switch PZ55, Multi PZ70

                  Commentaire


                  • #1
                    La librairie Wire ne se trouve dans le répertoire 'Arduino/libraries' mais dans le répertoire 'Arduino/hardware/arduino/avr/libraries' (peut-être parce qu'il s'agit d'une bibliothèque de l'équipe de base d'Arduino).
                    Cliquez sur l'image pour la voir en taille réelle 

Nom : 		Arduino Libraries.JPG 
Affichages :	1 
Taille :		37,5 Ko 
ID : 			458054
                    Désolé de ne pas pouvoir être plus complet sur le problème posé (je voulais tout tester pour confirmer la solution proposée) mais l'utilisation de la librairie XPlaneData requiert l'installation de Arduino 1.5 (beta).
                    Après installation de la dernière version (1.5.8) plus rien ne fonctionne, même ce qui fonctionnait sous Arduino 1.05.
                    Je n'arrive plus à faire communiquer le PC avec la carte (timeout).
                    Dès que j'aurai résolu ce problème je referai signe.
                    XP11.41 - WIN 7 - i7 - GTX970

                    Commentaire


                    • #1
                      Envoyé par FlyingBaldy Voir le message
                      La librairie Wire ne se trouve dans le répertoire 'Arduino/libraries' mais dans le répertoire 'Arduino/hardware/arduino/avr/libraries' ...
                      J'ai la version 1.0.5-r2 et Wire.h se trouve où je l'ai mentionné. Il y en a un autre dans Robot_Control ce qui ouvre la porte à tout un tas de problème de ça marche ça marche pas suivant si l'on utilise l'un ou l'autre.

                      PhM
                      X-Plane 9.70 & 11.5r1 / W10 / AMD Ryzen 7 2700 / 8Go RAM / Sapphire R9 390 Nitro 8Go / Sapphire HD7870 GHz 2Go / Samsung LN40C530 / Oculus DK2 / LeapMotion / Saitek X56 / Thrustmaster Pendular Rudder

                      Commentaire


                      • #1
                        Dans la 1.5 il ne la trouve pas. Dans la 1.0.5 tout fonctionnait. Avec les mises à jour la dref_in ne fonctionne plus. Je n'arrive pas à re télécharger l'ancienne version de X-PlaneData librairy (Wrong address). Actuellement, avec IDE 1.0.5 et la library de la 1.5.x je reçois mais n'émet pas.
                        Contrôleur à Saint-Ex (LFLL) exclusivement, sur IVAO. FS2 - AS3

                        iMac 21,5 " Mac OSX 10.9.5 Mavericks — 2,9Ghz Intel Core i5 quadricœur — 8 Go RAM 1600 Mhz DDR3 — NVIDIA GeForce GT 750M 1024 Mo
                        X-Plane 9.70, FA7X — Thrustmaster T-Flight Hotas X — Saitek : Palonnier PZ35, Gaz PZ45, Switch PZ55, Multi PZ70

                        Commentaire


                        • #1
                          Point de la situation.
                          J'ai supprimé tout Arduino (IDE 1.5.8) qui ne m'a apporté que des ennuis, notamment de pilote (driver) de la carte qui a chaque fois empêché la liaison.
                          J'ai réinstallé Arduino IDE 1.0.6 (évolution récente de 1.0.5).
                          J'ai rechargé la bibliothèque XPlaneData (le 1/10).

                          Tout refonctionne :
                          Mes anciens sketches.
                          Le sketch de numero_744 fonctionne (je ne teste que la partie "frein" de parking), c'est-à-dire que si le frein de parking n'est pas mis, alors relier la broche 8 de l'Arduino à la masse fait serrer le frein dans X-Plane.
                          Il faut toutefois appuyer sur "B" dans X-Plane pour déserrer le frein (il faudrait changer l'ordre des tests dans le sketch : d'abord tester si il y a un changement de la broche 8, si oui, alors dref=0 si broche 8 à la masse, dref=1 sinon).
                          Note : Pour utiliser la bibliothèque XPlaneData, il ne faut pas de "sim/" au début de la dataref/commande/...

                          Je n'arrive toutefois pas à exécuter une commande (cmd_in ou Button_Cmd), mais je n'ai jamais réussi à envoyer une commande avec UDP.
                          Dernière modification par FlyingBaldy, 06 octobre 2014, 11h43.
                          XP11.41 - WIN 7 - i7 - GTX970

                          Commentaire


                          • #1
                            Nous avons le même problème. Le défaut viendrait de la librairie. Je vais mettre l'IDE à jour vers 1.0.6. Malheureusement, dref ne fonctionnait plus à cause du sim/, que j'ai retiré et qui dorénavant fonctionne.
                            Merci de m'avoir prêté votre temps et votre attention.
                            Dernière modification par numero_744, 06 octobre 2014, 21h17. Motif: Orthographe
                            Contrôleur à Saint-Ex (LFLL) exclusivement, sur IVAO. FS2 - AS3

                            iMac 21,5 " Mac OSX 10.9.5 Mavericks — 2,9Ghz Intel Core i5 quadricœur — 8 Go RAM 1600 Mhz DDR3 — NVIDIA GeForce GT 750M 1024 Mo
                            X-Plane 9.70, FA7X — Thrustmaster T-Flight Hotas X — Saitek : Palonnier PZ35, Gaz PZ45, Switch PZ55, Multi PZ70

                            Commentaire

                            Chargement...
                            X