Annonce

Réduire
Aucune annonce.

Construction cockpit cessna 172 (Work In Progress)

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

  • #1
    Envoyé par Lami Voir le message
    thierryhl,

    Comme je ne suis pas anglophone, je ne voudrais pas me planter sur ce point important, avant de faire mes expériences de conversion d'une carte Arduino Nano pour qu'elle soit reconnue dans X-Plane comme une manette de jeu.

    Pour ce qui est du « Hacker en mode DFU », tu aurais une précision pour le microprogramme à utiliser ?
    Je ne sais pas si ça fonctionne pour le "NANO"
    Je n'ai qu'un UNO, et voilà la marche que j'ai suivi sur ce lien.
    et la librairie
    X-Plane 10
    En attente d'un ordinateur...

    Commentaire


    • #1
      Bien, je viens juste de faire un log de sortie pour voir et voici le résultat....
      Fichier joint et le code commenté.
      En fait les pas du moteur saute d'une valeur à une autre du genre de 100 à 110 sans passer les étapes 101, 102, 103, etc...
      Si vous avez une idée de comment régler ce problème, je suis preneur

      Fichier texte joint : log.txt.zip

      et le code utilisé pour test.
      Code:
      #include <Bounce.h>
      #include <AccelStepper.h>
      
      // Branchement du moteur
      #define motorPin1  7 
      #define motorPin2  8 
      #define motorPin3  9
      #define motorPin4  11
      
      AccelStepper stepper(AccelStepper::FULL4WIRE, motorPin1, motorPin3, motorPin2, motorPin4);
      
      FlightSimFloat KNOTS;
       
      void setup() {
        stepper.setMaxSpeed(700.00);
        stepper.setAcceleration(300.00);
        stepper.setSpeed(700.00);
        
        KNOTS = XPlaneRef("sim/cockpit2/gauges/indicators/airspeed_kts_pilot");
        KNOTS.onChange(viewKNOTS);
        //Bounce kval = Bounce(KNOTS, 10);
      }
       
      void loop() {
        FlightSim.update();
            if (stepper.distanceToGo() == 0) {
            stepper.moveTo(0.00);
             }
          stepper.run();
      }
      
      
      void viewKNOTS(float kval){
        if ((KNOTS >= 0) and (KNOTS <40))
        {
          kval = map(KNOTS, 0, 40, 0, 185);
        }
          else if ((KNOTS >= 40) and (KNOTS <100))
        {
          kval = map(KNOTS, 40, 100.00, 185.00, 935.00);
        }
          else if ((KNOTS >= 100.00) and (KNOTS <120.00))
        {
          kval = map(KNOTS, 100.00, 120.00, 935.00, 1180.00);
        }
          else if ((KNOTS >= 120.00) and (KNOTS <200.00))
        {
          kval = map(KNOTS, 120.00, 200.00, 1180.00, 1800.00);
        }
        else if ((KNOTS >= 200.00))
        {
          kval = 1800.00;
        }
          //DEBUG
          Serial.print("kval : ");
          Serial.print(kval);       //Valeur de pas du moteur
          Serial.print("\t");
          Serial.print("KNOTS : "); //Valeurs d'X-Plane
          Serial.print(KNOTS);
          Serial.println();
          
          stepper.moveTo(kval);
          stepper.runSpeedToPosition();
        }
      X-Plane 10
      En attente d'un ordinateur...

      Commentaire


      • #1
        Bonjour thierryhl,

        Un grand merci pour l'hyperlien !

        Pour ce qui est de ton problème de saccade, il y a bien des solutions :

        1) L'instrument réel à bien aussi une vitesse de réaction, alors calque la vitesse de ton moteur à cette vitesse.

        2) Limite la vitesse à ce qui te convient à toi.

        3) Utilise comme le suggère PhM un « asservissement de position. » sous l'une des formes suivantes avant ta ligne « stepper.moveTo(kval); » :

        stepper.setAcceleration (float (abs (kval - stepper.currentPosition ())));
        stepper.setAcceleration (float (abs (kval - stepper.currentPosition ()) * Ratio));
        stepper.setAcceleration (mapFloat (float (abs (kval - stepper.currentPosition ())), 0, kvalMaxSpeed, 0, moteurMaxSpeed);

        Évidemment tu crées la constante « kvalMaxSpeed » et « moteurMaxSpeed » avec leur valeur respective.

        Et remplace la ligne « stepper.runSpeedToPosition(); » par « stepper.runToPosition (); ».

        De mon côté, je vais essayer de transformer l'exemple de UnoJoy pour l'utiliser avec une mini manette de jeu et les 21 boutons d'une mini-télécommande pour contrôler toutes les radios et pilotes automatiques...

        Cliquez sur l'image pour la voir en taille réelle 

Nom : 		sku_266570_2.jpg 
Affichages :	1 
Taille :		36,3 Ko 
ID : 			457858

        Cliquez sur l'image pour la voir en taille réelle 

Nom : 		sku_136284_5.jpg 
Affichages :	1 
Taille :		91,4 Ko 
ID : 			457859

        Encore merci pour les références.

        L'ami René
        Tous pour un et un pour tous !
        L'ami René
        Tous pour un et un pour tous !

        Ordi-1 : Intel i7-12700K 5GHz, RAM 128 Go, nVidia RTX 3080 10G, Téléviseur 55" 3840x2160, 3 écrans 1920x1080, Manettes Saitek X56.
        Linux Debian 13, X11, X-Plane 12.4.4-b2, Little NavMap v3.0.18, pilote nVidia 550.163.1.

        Ordi-2 : Intel i7-12700KF 5GHz, RAM 48 Go, Asus GeForce STRIX-GTX 1060 6G, 2 x Écran 1920x1080.
        Linux Kubuntu 26.04, XHSI 2.0 Beta 12 Alfa 5, pilote nVidia 535.309.

        Commentaire


        • #1
          Envoyé par thierryhl Voir le message
          ...En fait les pas du moteur sautent d'une valeur à une autre du genre de 100 à 110 sans passer les étapes 101, 102, 103, etc...
          Est-ce que ce que tu dit être les pas du moteur sont les valeurs affichées par viewKnots ?

          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
            Envoyé par Lami Voir le message
            Bonjour thierryhl,

            Un grand merci pour l'hyperlien !

            Pour ce qui est de ton problème de saccade, il y a bien des solutions :

            1) L'instrument réel à bien aussi une vitesse de réaction, alors calque la vitesse de ton moteur à cette vitesse.

            2) Limite la vitesse à ce qui te convient à toi.

            3) Utilise comme le suggère PhM un « asservissement de position. » sous l'une des formes suivantes avant ta ligne « stepper.moveTo(kval); » :

            stepper.setAcceleration (float (abs (kval - stepper.currentPosition ())));
            stepper.setAcceleration (float (abs (kval - stepper.currentPosition ()) * Ratio));
            stepper.setAcceleration (mapFloat (float (abs (kval - stepper.currentPosition ())), 0, kvalMaxSpeed, 0, moteurMaxSpeed);

            Évidemment tu crées la constante « kvalMaxSpeed » et « moteurMaxSpeed » avec leur valeur respective.

            Et remplace la ligne « stepper.runSpeedToPosition(); » par « stepper.runToPosition (); ».

            De mon côté, je vais essayer de transformer l'exemple de UnoJoy pour l'utiliser avec une mini manette de jeu et les 21 boutons d'une mini-télécommande pour contrôler toutes les radios et pilotes automatiques...

            [ATTACH=CONFIG]10075[/ATTACH]

            [ATTACH=CONFIG]10076[/ATTACH]

            Encore merci pour les références.

            L'ami René
            Tous pour un et un pour tous !
            Merci, je suis en pleine lecture de l'asservissement....
            Sinon, bon courage pour ton projet. hâte de voir ça.
            X-Plane 10
            En attente d'un ordinateur...

            Commentaire


            • #1
              Envoyé par PhM Voir le message
              Est-ce que ce que tu dit être les pas du moteur sont les valeurs affichées par viewKnots ?

              PhM
              viewKnots est ma fonction avec la variable kval qui correspond au pas moteur

              extrait tiré de mon Debug
              On voit bien que le pas moteur (kval) ne se déplace pas pendant un laps de temps, alors que la vitesse augmente (KNOTS)
              Code:
              kval : 129.00	KNOTS : 28.04
              kval : 129.00	KNOTS : 28.10
              kval : 129.00	KNOTS : 28.16
              kval : 129.00	KNOTS : 28.23
              kval : 129.00	KNOTS : 28.29
              kval : 129.00	KNOTS : 28.35
              kval : 129.00	KNOTS : 28.41
              kval : 129.00	KNOTS : 28.47
              kval : 129.00	KNOTS : 28.54
              kval : 129.00	KNOTS : 28.60
              kval : 129.00	KNOTS : 28.66
              kval : 129.00	KNOTS : 28.72
              kval : 129.00	KNOTS : 28.79
              kval : 129.00	KNOTS : 28.86
              kval : 129.00	KNOTS : 28.94
              kval : 134.00	KNOTS : 29.01
              kval : 134.00	KNOTS : 29.08
              kval : 134.00	KNOTS : 29.15
              kval : 134.00	KNOTS : 29.21
              kval : 134.00	KNOTS : 29.29
              kval : 134.00	KNOTS : 29.35
              kval : 134.00	KNOTS : 29.42
              kval : 134.00	KNOTS : 29.48
              kval : 134.00	KNOTS : 29.55
              kval : 134.00	KNOTS : 29.61
              kval : 134.00	KNOTS : 29.67
              kval : 134.00	KNOTS : 29.73
              kval : 134.00	KNOTS : 29.79
              kval : 134.00	KNOTS : 29.85
              kval : 134.00	KNOTS : 29.91
              kval : 134.00	KNOTS : 29.97
              X-Plane 10
              En attente d'un ordinateur...

              Commentaire


              • #1
                Envoyé par thierryhl Voir le message
                ...On voit bien que le pas moteur (kval) ne se déplace pas pendant un laps de temps, alors que la vitesse augmente (KNOTS)
                Pas étonnant. kval est donné par map, et map est définie comme :
                Code:
                long map(long x, long in_min, long in_max, long out_min, long out_max)
                Cette fonction prend des entiers en entrée, donc tout ce que tu vas lui passer va être converti en entier, et donc sans décimales.

                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
                  La fonction map avec décimale :

                  Code:
                  //*****************************************************************************
                  // FONCTION mapFloat
                  //*****************************************************************************
                  float mapFloat (float x, float in_min, float in_max, float out_min, float out_max)
                  {
                    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
                  }
                  //*****************************************************************************
                  Déjà donné plus haut...

                  L'Ami René
                  Tous pour un et un pour tous !
                  L'ami René
                  Tous pour un et un pour tous !

                  Ordi-1 : Intel i7-12700K 5GHz, RAM 128 Go, nVidia RTX 3080 10G, Téléviseur 55" 3840x2160, 3 écrans 1920x1080, Manettes Saitek X56.
                  Linux Debian 13, X11, X-Plane 12.4.4-b2, Little NavMap v3.0.18, pilote nVidia 550.163.1.

                  Ordi-2 : Intel i7-12700KF 5GHz, RAM 48 Go, Asus GeForce STRIX-GTX 1060 6G, 2 x Écran 1920x1080.
                  Linux Kubuntu 26.04, XHSI 2.0 Beta 12 Alfa 5, pilote nVidia 535.309.

                  Commentaire


                  • #1
                    D'après ce qui se cache derrière un FlightSimFloat, et conformément à l'exemple donné ici, la fonction viewKNOTS devrait être écrite comme suit :

                    Code:
                    void viewKNOTS(float in_Knots)
                    {
                      float kval;
                    
                      if ((in_Knots >= 0.0f) and (in_Knots < 40.0f))
                      {
                        kval = map(in_Knots, 0.0f, 40.0f, 0.0f, 185.0f);
                      }
                      else if ((in_Knots >= 40.0f) and (in_Knots < 100.0f))
                      {
                        kval = map(in_Knots, 40.0f, 100.0f, 185.0f, 935.0f);
                      }
                      else if ((in_Knots >= 100.0f) and (in_Knots < 120.0f))
                      {
                        kval = map(in_Knots, 100.0f, 120.0f, 935.0f, 1180.0f);
                      }
                      else if ((in_Knots >= 120.0f) and (in_Knots < 200.0f))
                      {
                        kval = map(in_Knots, 120.0f, 200.0f, 1180.0f, 1800.0f);
                      }
                      else if ((in_Knots >= 200.0f))
                      {
                        kval = 1800.0f;
                      }
                      //DEBUG
                      Serial.print("kval : ");
                      Serial.print(kval);       //Valeur de pas du moteur
                      Serial.print("\t");
                      Serial.print("KNOTS : "); //Valeurs d'X-Plane
                      Serial.print(in_Knots);
                      Serial.println();
                        
                      stepper.moveTo(kval);
                      stepper.runSpeedToPosition();
                      }
                    Le point principal est que la valeur passée à viewKnots est la valeur lue depuis X-Plane, c'est sur cette valeur que l'on doit travailler.

                    Les autres changements sont personnels :
                    • J'utilise in_NomDeVariable pour démarquer les variables d'entrées qui ne doivent pas être écrites, cela permet de repérer les erreurs plus facilement.
                    • Ne pas mélanger les écritures entières, flottantes et doubles. 2 est un entier, 2.0f est un flottant, 2.0 est un double. Dans le cas de l'arduino il n'y a pas de doubles donc 2.0 sera identique à 2.0f, mais 2 et 2.0f ne sont pas identiques et si une fonction existe sous plusieures formes, l'une prenant un entier et l'autre un flottant, le compilateur prendra celle corresponadant à la façon dont 2 est écrit. Cela peut être une cause de bugs obscurs, mieux vaut les éviter dès le début en signalant clairement au compilateur quelles sont nos intentions.


                    On peut aussi alléger, un peu, le travail de notre petit processeur 8 bits qui a déjà fort à faire avec tous ces flottants qu'il doit émuler en logiciel :

                    Code:
                    void viewKNOTS(float in_Knots)
                    {
                        float kval;
                    
                        if(in_Knots >= 200.0f)
                        {
                            kval = 1800.0f;
                        }
                        else if(in_Knots >= 120.0f)
                        {
                            kval = map(in_Knots, 120.0f, 200.0f, 1180.0f, 1800.0f);
                        }
                        else if(in_Knots >= 100.0)
                        {
                            kval = map(in_Knots, 100.0f, 120.0f, 935.0f, 1180.0f);
                        }
                        else if(in_Knots >= 40.0f)
                        {
                            kval = map(in_Knots, 40.0f, 100.0f, 185.0f, 935.0f);
                        }
                        else(in_Knots >= 0.0f)
                        {
                            kval = map(in_Knots, 0.0f, 40.0f, 0.0f, 185.0f);
                        }
                    
                        stepper.moveTo(kval);
                        stepper.runSpeedToPosition();
                    }
                    PhM
                    Dernière modification par PhM, 01 juillet 2014, 01h22.
                    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
                      Merci à vous 2 de vous pencher sur le problème.
                      J'aimerais juste tester la fonction map float.
                      Mais mes compétences ne sont pas énorme en programmation

                      Je ne vois pas trop comment intégrer ce code dans le mien, je viens d'essayer, mais rien à faire.
                      Puis-je avoir un semblant d'exemple ? merci
                      X-Plane 10
                      En attente d'un ordinateur...

                      Commentaire


                      • #1
                        Envoyé par thierryhl Voir le message
                        ...Je ne vois pas trop comment intégrer ce code dans le mien, ...
                        Copie le juste avant viewKnots, et assure toi que les valeurs sont écrites comme des flottant (avec un f à la fin) pour forcer le compilateur à utiliser cette fonction map.

                        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
                          Envoyé par thierryhl Voir le message
                          ...J'aimerais juste tester la fonction map float.
                          Mais mes compétences ne sont pas énorme en programmation

                          Je ne vois pas trop comment intégrer ce code dans le mien, je viens d'essayer, mais rien à faire.

                          Puis-je avoir un semblant d'exemple ? merci
                          Bonjour thierryhl,

                          Voici pour répondre à ta demande avec le minimum de modification de ton code source du Poste #49

                          Code:
                          #include <Bounce.h>
                          #include <AccelStepper.h>
                          
                          // Branchement du moteur
                          #define motorPin1  7 
                          #define motorPin2  8 
                          #define motorPin3  9
                          #define motorPin4  11
                          
                          AccelStepper stepper(AccelStepper::FULL4WIRE, motorPin1, motorPin3, motorPin2, motorPin4);
                          
                          FlightSimFloat KNOTS;
                           
                          void setup() {
                            stepper.setMaxSpeed(700.00);
                            stepper.setAcceleration(300.00);
                            stepper.setSpeed(700.00);
                            
                            KNOTS = XPlaneRef("sim/cockpit2/gauges/indicators/airspeed_kts_pilot");
                            KNOTS.onChange(viewKNOTS);
                            //Bounce kval = Bounce(KNOTS, 10);
                          }
                           
                          void loop() {
                            FlightSim.update();
                                if (stepper.distanceToGo() == 0) {
                                stepper.moveTo(0.00);
                                 }
                              stepper.run();
                          }
                          
                          float mapFloat (float x, float in_min, float in_max, float out_min, float out_max)
                          {
                            return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
                          }
                          
                          void viewKNOTS(float kval){
                            if ((KNOTS >= 0.0) and (KNOTS < 40.0))
                            {
                              kval = mapFloat (KNOTS, 0.0, 40.0, 0.0, 185.0);
                            }
                              else if ((KNOTS >= 40.0) and (KNOTS < 100.0))
                            {
                              kval = mapFloat (KNOTS, 40.0, 100.0, 185.0, 935.0);
                            }
                              else if ((KNOTS >= 100.0) and (KNOTS < 120.0))
                            {
                              kval = mapFloat (KNOTS, 100.0, 120.0, 935.0, 1180.0);
                            }
                              else if ((KNOTS >= 120.0) and (KNOTS < 200.0))
                            {
                              kval = mapFloat (KNOTS, 120.0, 200.0, 1180.0, 1800.0);
                            }
                            else if ((KNOTS >= 200.0))
                            {
                              kval = 1800.0;
                            }
                              //DEBUG
                              Serial.print("kval : ");
                              Serial.print(kval);       //Valeur de pas du moteur
                              Serial.print("\t");
                              Serial.print("KNOTS : "); //Valeurs d'X-Plane
                              Serial.print(KNOTS);
                              Serial.println();
                              
                              stepper.moveTo(kval);
                              stepper.runSpeedToPosition();
                            }
                          Mais dans un but pédagogique plus global, voici le même code source, mais passé à ma moulinette pour rendre le code source autonome et didactique en lui-même :

                          Code:
                          //*****************************************************************************
                          // Programme Arduino : KValeur_KNots
                          //*****************************************************************************
                          // Nom du programme pour l'afficher sur le terminal série et/ou de l'écran LCD.
                          const char NOM_DU_PROGRAMME [17] = "KValeur_KNots";
                          /*
                          Écrit par : thierryhl et L'ami René
                          
                          Date : 2014-07-01
                          
                          Ce code source est sous licence publique générale GNU (GNU General Public
                          Licence "GPL"), désignation « open source », ou « code source ouvert ».
                          Référence : http://www.fsffrance.org/index.fr.html
                          Ce programme est un logiciel libre; vous pouvez le redistribuer et / ou le 
                          modifier selon les termes de la licence GNU V2. Ce programme est distribué 
                          dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE, sans même la 
                          garantie implicite de COMMERCIALISATION ou D'ADAPTATION À UN USAGE 
                          PARTICULIER. Voir la GNU General Public License, Version 2 pour plus de 
                          détails. 
                          
                          Ce code source se veut didactique, c'est pourquoi les commentaires y prennent 
                          une très grande place. Mais cela ne doit pas vous effrayez, au contraire, cela
                          devrait vous rassurez en facilitant la compréhension du code source.
                          */
                          //*****************************************************************************
                          // Produits requis pour ce programme :
                          //*****************************************************************************
                          /*
                          Liste alphabétique des composantes d'électroniques
                          
                          1 x Arduino Nano 328 V3.0:
                          http://arduino.cc/en/Main/ArduinoBoardNano
                          http://dx.com/p/nano-v3-0-avr-atmega328-p-20au-module-board-usb-cable-for-arduino-118037
                          
                          1 x Bouton-Interrupteur "Self-Locking Switch" à 6 pattes :
                          http://www.dx.com/p/8-x-8mm-self-locking-switch-blue-white-black-20-piece-pack-119702
                          
                          1 x Connecteur à Prise Baril 2.1mm mâle :
                          http://www.robotshop.com/ca/fr/adaptateur-9v-a-prise-baril-21mm-v2.html
                          
                          1 x Connecteur à Prise Baril 2.1mm "DC Jack Adapters" femelle :
                          http://www.dx.com/p/dc-jack-adapter-with-screw-thread-10-piece-pack-122741
                          
                          1 x Planche d'expérimentation « BreadBoard » Mini (400 trous).
                          http://www.circuittest.com/mb-400-breadboard-white.html
                          
                          1 x Transformateur 110V à 9V, 1A, câble 100cm pour Arduino :
                          http://dx.com/p/Arduino-9v-1a-power-adapter-black-2-flat-pin-plug-100cm-cable-126288
                          
                          Et des petits câbles électriques et connecteurs appropriés (Réf. : MB-940,
                          MB-910, MB-900, MB-102J, LS-MMPJ-6, LS-FFPJ-6, etc.).
                          
                          Fils de raccordement pour le bricolage électronique (65 pièces) :
                          http://dx.com/p/breadboard-jumper-wires-for-electronic-diy-65-cable-pack-118826
                          Paquet de 40 fils mono brin male femelle de 20cm :
                          http://dx.com/p/male-to-female-dupont-breadboard-jumper-wires-for-arduino-40-piece-pack-20cm-length-146935
                          Paquet de 40 fils mono brin femelle femelle de 20cm :
                          http://dx.com/p/dupont-line-1p-1p-40-pack-20cm-length-121338
                          Paquet de 70 fils mono brin male male de 12 à 24cm :
                          http://dx.com/p/breadboard-jumper-wires-for-electronic-diy-70-cable-pack-80208
                          Breadboard Jumper Cord Kit pour Arduino (140 pièces) :
                          http://dx.com/p/breadboard-jumper-wire-cord-kit-for-arduino-diy-140-piece-pack-138220
                          2,54mm 1x40 Pin Breakaway tête droite (10 Pieces) :
                          http://www.dx.com/p/2-54mm-1x40-pin-breakaway-straight-male-header-10-piece-pack-144191
                          Résistance de 1/4 Watt (de 100 Ohm ~ 2.4 KOhm), Kit de 270 :
                          http://dx.com/p/jtron-1-4w-colored-ring-resistor-pack-100-ohm-2k-27-kinds-10-pcs-blue-sliver-270-pcs-288760
                          
                          Autres liens en rapport avec le sujet :
                          http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoExpertSerie2
                          http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoExpertSerieCanTerminalPC
                          */
                          //*****************************************************************************
                          
                          //*****************************************************************************
                          // Circuit à réaliser.
                          //*****************************************************************************
                          /*
                          Dans cette section, toutes les connexions des composantes du montage sont 
                          listées, qu'ils soient utilisés ou non, et cela pour éviter tout oublie et 
                          rendre le copier / coller par bloc complet pour une pièce, plus facile d'un 
                          montage à l'autre. Le plus souvent possible le libellé de la pièce précédé du 
                          nom court de la pièce est utilisé, par exemple « ARDUINO_A3 », pour la broche 
                          analogique A3 d'une carte contrôleur Arduino Uno R3.
                          
                          Plaque d'expérimentation « BreanBoard » :
                          
                          Pour identifier les broches d'une plaque d'expérimentation « BreanBoard », 
                          comme dans le jeu de bataille navale "Battle Ship", les lignes sont 
                          identifiées pas des numéros, ici, de 1 a 63 et les colonnes sont identifiées 
                          par lettre des lettres, ici, de a a j et des signes « + » et « - ». Donc 
                          (i10) indique l'intersection de la colonne « i » avec la ligne numéro « 10 ». 
                          Pour une broche des colonnes négatives ou GND, c'est (-) et pour une broche 
                          des colonnes positives ou VCC, c'est (+). Entre parenthèse « ( » et « ) », 
                          c'est pour bien spécifier une position de la planche d'expérimentation et 
                          pour éviter toutes confusions.
                          */
                          /*
                          Câblage de l'Arduino Nano R3.0 sur une plache « BreadBoard » Mini (400 trous) :
                          [ARDUINO_13_SCK_DEL dans (c2) et D12 dans (g2), etc.]
                          
                          ARDUINO_USB         : Câble USB à l'ordinateur;
                          
                          ARDUINO_13_SCK_DEL  : 
                          ARDUINO_3_3V        : 
                          ARDUINO_REF         : 
                          ARDUINO_A0          : 
                          ARDUINO_A1          : 
                          ARDUINO_A2          : 
                          ARDUINO_A3          : 
                          ARDUINO_A4_SDA      : 
                          ARDUINO_A5_SCL      : 
                          ARDUINO_A6          : 
                          ARDUINO_A7          : 
                          ARDUINO_5V          : (a13) -- (+13G); (+17G) -- (+17D)
                          ARDUINO_RST2        : 
                          ARDUINO_GND2        : 
                          ARDUINO_VIN         : 
                          
                          ARDUINO_1_TX        : 
                          ARDUINO_0_RX        : 
                          ARDUINO_RST1        : 
                          ARDUINO_GND1        : (j13) -- (-13D); (-17D) -- (-17G)
                          ARDUINO_2_INT1      : 
                          ARDUINO_3_INT2_PWM  : 
                          ARDUINO_4           : 
                          ARDUINO_5_PWM       : 
                          ARDUINO_6_PWM       : 
                          ARDUINO_7           : CONTROLE_MOTEUR_1_IN1
                          ARDUINO_8           : CONTROLE_MOTEUR_1_IN2
                          ARDUINO_9_PWM       : CONTROLE_MOTEUR_1_IN3
                          ARDUINO_10_SS_PWM   : 
                          ARDUINO_11_MOSI_PWM : CONTROLE_MOTEUR_1_IN4
                          ARDUINO_12_MISO     : 
                          
                          Câblage pour le connecteur 2.1mm sur la planche d'expérimentation et l'Arduino :
                          
                          CONNECTEUR_1_VIN   : (j30); +Pile 9V ou Transformateur 9V
                          CONNECTEUR_1_GND   : (-29D); -Pile 9V ou Transformateur 9V
                          
                          Câblage pour les deux moteurs pas à pas :
                          
                          CONTROLE_MOTEUR_1_VIN  = +5V~12V
                          CONTROLE_MOTEUR_1_GND  = -5V~12V
                          CONTROLE_MOTEUR_1_IN1  = ARDUINO_7
                          CONTROLE_MOTEUR_1_IN2  = ARDUINO_8
                          CONTROLE_MOTEUR_1_IN3  = ARDUINO_9_PWM
                          CONTROLE_MOTEUR_1_IN4  = ARDUINO_11_MOSI_PWM
                          CONTROLE_MOTEUR_1_OUT1 = MOTEUR_1_D1
                          CONTROLE_MOTEUR_1_OUT2 = MOTEUR_1_D2
                          CONTROLE_MOTEUR_1_OUT3 = MOTEUR_1_D3
                          CONTROLE_MOTEUR_1_OUT4 = MOTEUR_1_D4
                          CONTROLE_MOTEUR_1_OUT5 = MOTEUR_1_D5
                          Câblage pour le bouton 6 pattes sur la planche d'expérimentation :
                          
                          INTERRUPTEUR_1_OUT_1     : (i30); CONNECTEUR_1_VIN
                          INTERRUPTEUR_1_OUT_2     : (i29)
                          INTERRUPTEUR_1_OUT_3     : (i28)
                          INTERRUPTEUR_1_OUT_4     : (g28)
                          INTERRUPTEUR_1_OUT_5     : (g29); (f29) -- (c16); ARDUINO_VIN
                          INTERRUPTEUR_1_OUT_6     : (g30)
                          */
                          //*****************************************************************************
                          
                          //*****************************************************************************
                          // Directives de compilation pour le nombre de broches à initialiser.
                          //*****************************************************************************
                          // Pour initialiser toutes les broches de l'Arduino pour ne pas causer de faux 
                          // départ dû à une ancienne configuration du montage...
                          #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
                          #define NombreDeBroche 79
                          #elif defined(__AVR_ATmega32U4__)  
                          #define NombreDeBroche 79
                          #elif defined(__AVR_ATmega32U4__)  
                          #define NombreDeBroche 21
                          #elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
                          #define NombreDeBroche 21
                          #elif defined(__AVR_ATmega128__) ||defined(__AVR_ATmega1281__)||defined(__AVR_ATmega2561__)
                          #define NombreDeBroche 21
                          #else
                          #define NombreDeBroche 21
                          #endif
                          //*****************************************************************************
                          
                          //*****************************************************************************
                          // Inclusion des librairies utilisées.
                          //*****************************************************************************
                          #include "Bounce.h"
                          /*
                          Fichier contenant ...
                          */
                          
                          #include "AccelStepper.h"
                          /*
                          Bibliothque de contrôle des moteur pas à pas.
                          */
                          //*****************************************************************************
                          
                          //*****************************************************************************
                          // Déclaration des constantes.
                          //*****************************************************************************
                          /*
                          Par convention, pour nommer une constante, nous utiliserons des noms écrits
                          tout en majuscule, en capitale, ce qui facilitera leur repérage et rendra le
                          code plus facilement compréhensible. Le mot devant notre nom de constante
                          indique à l'Arduino l'espace mémoire à réserver pour stocker cette donnée.
                          Après le nom de notre constante, on lui attribue sa valeur.
                          */
                          //*****************************************************************************
                          
                          //*****************************************************************************
                          // Constantes des connecteurs.
                          //*****************************************************************************
                          // Branchement des broches du moteur pas à pas numéro 1 :
                          const byte CONTROLE_MOTEUR_1_IN1 = 7;
                          const byte CONTROLE_MOTEUR_1_IN2 = 8;
                          const byte CONTROLE_MOTEUR_1_IN3 = 9;
                          const byte CONTROLE_MOTEUR_1_IN4 = 11;
                          //*****************************************************************************
                          
                          //*****************************************************************************
                          // Déclaration des autres constantes de travail.
                          //*****************************************************************************
                          //*****************************************************************************
                          
                          //*****************************************************************************
                          // Déclaration des variables globales.
                          //*****************************************************************************
                          /*
                          Par convention, pour nommer une variable, nous utiliserons des noms écrits
                          avec une majuscule pour la première lettre de chaque mot composant le nom de la
                          variable, ce qui facilitera leur repérage et rendra le code plus facilement
                          compréhensible. Le mot devant notre nom de variable indique à l'Arduino l'espace
                          mémoire à réserver pour stocker cette donnée. Après le nom de notre variable, on
                          lui attribue sa valeur.
                          */
                          
                          // Creation de la structure de donnée par X-Plane :
                          FlightSimFloat KNots;
                          
                          //
                          float KValeur = 0.0;
                          //*****************************************************************************
                          
                          //*****************************************************************************
                          // Création en mémoire des objets pour les interfaces des périphériques.
                          //*****************************************************************************
                          // Création du contrôle du moteur pas à pas numéro 1 :
                          AccelStepper Moteur_1 (AccelStepper::FULL4WIRE, CONTROLE_MOTEUR_1_IN1, 
                                                                          CONTROLE_MOTEUR_1_IN3, 
                                                                          CONTROLE_MOTEUR_1_IN2, 
                                                                          CONTROLE_MOTEUR_1_IN4);
                          //*****************************************************************************
                          
                          //*****************************************************************************
                          // FONCTION InitialiserToutesLesBroches
                          //*****************************************************************************
                          void InitialiserToutesLesBroches ()
                          {
                            // Initialiser toutes les broches de l'Arduino pour ne pas causer de faux 
                            // départ dû à une ancienne configuration du montage...
                            for (int i = 0; i <= NombreDeBroche; i = i + 1)
                            {
                              pinMode      (i, OUTPUT);
                              digitalWrite (i, 0);
                            }
                          }
                          //*****************************************************************************
                          
                          //*****************************************************************************
                          // FONCTION mapFloat
                          //*****************************************************************************
                          // Fonction équivalente à « map (); », mais qui travaille avec des variables de 
                          // type à virgule flottante « float ».
                          float mapFloat (float x, float in_min, float in_max, float out_min, float out_max)
                          {
                            return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
                          }
                          //*****************************************************************************
                          
                          //*****************************************************************************
                          // FONCTION viewKNots.
                          //*****************************************************************************
                          void viewKNots (float KValeur)
                          {
                            if ((KNots >= 0.0) and (KNots < 40.0))
                            {
                              KValeur = mapFloat (KNots, 0.0, 40.0, 0.0, 185.0);
                            }
                            else if ((KNots >= 40.0) and (KNots < 100.0))
                            {
                              KValeur = mapFloat (KNots, 40.0, 100.0, 185.0, 935.0);
                            }
                            else if ((KNots >= 100.0) and (KNots < 120.0))
                            {
                              KValeur = mapFloat (KNots, 100.0, 120.0, 935.0, 1180.0);
                            }
                            else if ((KNots >= 120.0) and (KNots < 200.0))
                            {
                              KValeur = mapFloat (KNots, 120.0, 200.0, 1180.0, 1800.0);
                            }
                            else if ((KNots >= 200.0))
                            {
                              KValeur = 1800.0;
                            }
                            //DEBUG
                            Serial.print ("KValeur : ");
                            Serial.print (KValeur);   //Valeur de pas du moteur.
                            Serial.print ("\t");
                            Serial.print ("KNots : ");//Valeurs d'X-Plane.
                            Serial.print (KNots);
                            Serial.println ();
                            
                            Moteur_1.moveTo (KValeur);
                            Moteur_1.runSpeedToPosition ();
                          }
                          //*****************************************************************************
                          
                          //*****************************************************************************
                          // FONCTION SETUP = Code d'initialisation.
                          //*****************************************************************************
                          /*
                          La fonction setup () est exécutée en premier et 1 seule fois, au démarrage du
                          programme. Pour éviter de mettre des composantes sous tension avec la dernière
                          version du programme chargé dans l'Arduino, nous utilions une boucle « while »,
                          tant qu'une première action n'est pas accomplie par l'utilisateur, on ne fait
                          rien (Télécommande, bouton, etc.).
                          
                          L'activation du rappel au + interne des connecteurs en entrée si nécessaire.
                          L'instruction « digitalWrite (pin, HIGH); » écrit la valeur HIGH, qui vaux 1 
                          sur le connecteur en entrée, ce qui active la résistance de "rappel au +" 
                          (pullup) au plus de ce connecteur. L'utilisation de cette résistance interne 
                          est une protection minimale pour l'intégrité physique pour la puce principale.
                          */
                          void setup ()
                          {
                            // Ici les instructions à exécuter au démarrage.
                            // Initialiser toutes les broches de l'Arduino pour ne pas causer de faux 
                            // départ dû à une ancienne configuration du montage...
                            InitialiserToutesLesBroches ();
                            
                            // IMPORTANT : régler le terminal côté PC avec la même valeur de
                            // transmission.
                            Serial.begin (115200);
                            Serial.println ();
                            Serial.print (NOM_DU_PROGRAMME);
                            Serial.println ();
                          
                            Moteur_1.setMaxSpeed     (700.0);
                            Moteur_1.setAcceleration (300.0);
                            Moteur_1.setSpeed        (700.0);
                            
                            KNots = XPlaneRef ("sim/cockpit2/gauges/indicators/airspeed_kts_pilot");
                            KNots.onChange (viewKNots);
                            //Bounce KValeur = Bounce (KNots, 10);
                          }
                          //*****************************************************************************
                          
                          //*****************************************************************************
                          // FONCTION LOOP = Boucle sans fin = coeur du programme.
                          //*****************************************************************************
                          // La fonction loop() s'exécute sans fin en boucle aussi longtemps que
                          // l'Arduino est sous tension.
                          
                          void loop()
                          {
                            // Ici les instructions à exécuter par le programme principal.
                            FlightSim.update();
                            
                            if (Moteur_1.distanceToGo () == 0)
                            {
                              Moteur_1.moveTo (0);
                            }
                            Moteur_1.run ();
                          }
                          //*****************************************************************************
                          Je suggère d'enregistrer ces deux versions pour les comparer. Avec les commentaires à même le code source et les différences apparentes, ils est facile de comprendre chacun des changements apportés.

                          Après, il n'en tient qu'à vous d'intégrer ou pas certaines des manières de faire et de structurer le code.

                          Pour ma part, je n'ai pri que quelques minutes pour faire du copier-coller de ce que j'ai déjà dans tous mes codes source.

                          Il y a autant de manières de faire que de programmeur, les goûts son dans la nature...

                          Il y a de fortes chances que ce dernier code source contienne des erreurs ! Comme je n'ai pas tous les fichiers de code, je n'ai pu compiler chez moi.

                          Thierry, si cela est légal, pourrais-tu me fournir les sources en lien avec « Bounce.h », pour qu'éventuellement je puisse compiler ton code ?

                          L'ami René
                          Tous pour un et un pour tous !
                          Dernière modification par Lami, 01 juillet 2014, 20h12. Motif: Correction d'une erreur de type dans le code source (0.0) au lieu de (0).
                          L'ami René
                          Tous pour un et un pour tous !

                          Ordi-1 : Intel i7-12700K 5GHz, RAM 128 Go, nVidia RTX 3080 10G, Téléviseur 55" 3840x2160, 3 écrans 1920x1080, Manettes Saitek X56.
                          Linux Debian 13, X11, X-Plane 12.4.4-b2, Little NavMap v3.0.18, pilote nVidia 550.163.1.

                          Ordi-2 : Intel i7-12700KF 5GHz, RAM 48 Go, Asus GeForce STRIX-GTX 1060 6G, 2 x Écran 1920x1080.
                          Linux Kubuntu 26.04, XHSI 2.0 Beta 12 Alfa 5, pilote nVidia 535.309.

                          Commentaire


                          • #1
                            Merci PhM et Lami
                            très instructif tout ça...
                            Pour la librairie bounce, c'est ici.

                            Descendre un peu dans la page pour avoir le lien de téléchargement.

                            ps : J'ai trouvé la dataref correspondant à la vitesse de rotation de l'aiguille.
                            Je vais aussi faire des tests pour voir si ça saccade moins...
                            sim/cockpit2/gauges/indicators/airspeed_acceleration_kts_sec_pilot
                            X-Plane 10
                            En attente d'un ordinateur...

                            Commentaire


                            • #1
                              Salut ,

                              Je viens d'installer Teensyduino avec toutes les bibliothèques et Linux udev rules (49-teensy.rules) et redémarrer l'ordinateur.

                              Mais la définition du type « FlightSimFloat » et autres, ça vient de quelle bibliothèque ? En suivant l'exemple « BlinkTransponder », j'ai comme message :

                              This report would have more information with
                              "Show verbose output during compilation"
                              enabled in File > Preferences.
                              Arduino: 1.0.5 (Linux), Board: "Teensy 3.1"
                              BlinkTransponder:2: error: 'FlightSimInteger' does not name a type
                              BlinkTransponder.pde: In function 'void setup()':
                              BlinkTransponder:6: error: 'transponderLight' was not declared in this scope
                              BlinkTransponder:6: error: 'XPlaneRef' was not declared in this scope
                              BlinkTransponder.pde: In function 'void loop()':
                              BlinkTransponder:13: error: 'FlightSim' was not declared in this scope
                              Note que je n'ai pas passé la carte Nano en UnoJoy avec la technique de « Hacker en mode DFU ». C'est avec une Nano 3.0 original que je fais les test aujourd'hui.

                              L'ami René
                              Tous pour un et un pour tous !
                              L'ami René
                              Tous pour un et un pour tous !

                              Ordi-1 : Intel i7-12700K 5GHz, RAM 128 Go, nVidia RTX 3080 10G, Téléviseur 55" 3840x2160, 3 écrans 1920x1080, Manettes Saitek X56.
                              Linux Debian 13, X11, X-Plane 12.4.4-b2, Little NavMap v3.0.18, pilote nVidia 550.163.1.

                              Ordi-2 : Intel i7-12700KF 5GHz, RAM 48 Go, Asus GeForce STRIX-GTX 1060 6G, 2 x Écran 1920x1080.
                              Linux Kubuntu 26.04, XHSI 2.0 Beta 12 Alfa 5, pilote nVidia 535.309.

                              Commentaire


                              • #1
                                as-tu installé "teensycontrol" ?
                                Après je ne sais pas si ça marche avec une nano....
                                Moi j'ai ça teensy2++
                                X-Plane 10
                                En attente d'un ordinateur...

                                Commentaire

                                Chargement...
                                X