IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Problème encodeur rotatif


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    pompier
    Inscrit en
    Janvier 2020
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : pompier

    Informations forums :
    Inscription : Janvier 2020
    Messages : 86
    Par défaut Problème encodeur rotatif
    bonjour,

    je suis en train de réaliser une boite à bouton pour mapper des touches pour un simulateur de vol (DCS).

    Je travail à partir d'une Arduino Mega

    Je l'ai flashée et j'utilise un code déjà fourni qui fonctionne bien pour des switch 2 ou 3 positions.

    Ce que je voudrai, c'est mettre des encodeurs rotatifs.

    Pour le moment, quand je tourne dans un sens ou dans l'autre, comme les 2 boutons s'activent l'un après l'autre, l'effet s'annule et je n'ai pas de rotation ou c'est très aléatoire.
    Auriez-vous une idée de comment faire?

    Voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    // This version of MegaJoy sketch was created originally
    // by Alan Chatham and the UnoJoy team.
    //
    // Modified by Deusimar Rodrigues dos Santos Junior,
    // also known as Shadow Nightmares, in Christmas 2018.
    //
    // Using parts of a code created by Matthew Heironimus,
    // written in 20-11-2015
    //--------------------------------------------------------------------
     
    #include "MegaJoy.h"
    #include <Encoder.h>
    Encoder myEnc(30, 31);
     
     
    void setup(){
      setupPins();
      setupMegaJoy();
    }
     
    void loop(){
      // Always be getting fresh data
      megaJoyControllerData_t controllerData = getControllerData();
      setControllerData(controllerData);
    }
     
    void setupPins(void){
      // Set all the digital pins as inputs
      // with the pull-up enabled, except for the 
      // two serial line pins
      for (int i = 4; i <= 54; i++){
        pinMode(i, INPUT);
        digitalWrite(i, HIGH);
      }
    }
     
    megaJoyControllerData_t getControllerData(void){
     
      // Set up a place for our controller data
      //  Use the getBlankDataForController() function, since
      //  just declaring a fresh dataForController_t tends
      //  to get you one filled with junk from other, random
      //  values that were in those memory locations before
      megaJoyControllerData_t controllerData = getBlankDataForMegaController();
      // Since our buttons are all held high and
      //  pulled low when pressed, we use the "!"
      //  operator to invert the readings from the pins
      for (int i = 4; i < 54; i++){
        controllerData.buttonArray[(i - 4) / 8] |= (!digitalRead(i)) << ((i - 4) % 8);
      }
     
      // Set the analog sticks
      //  Since analogRead(pin) returns a 10 bit value,
      //  we need to perform a bit shift operation to
      //  lose the 2 least significant bits and get an
      //  8 bit number that we can use
      long newPosition = myEnc.read();
      long oldPosition  = -999;
      if (newPosition != oldPosition) {
        oldPosition = newPosition; }
      controllerData.analogAxisArray[0] = map(newPosition, -1500, 1500, 0, 1023);
      controllerData.analogAxisArray[1] = 512;
      controllerData.analogAxisArray[2] = map(analogRead(A0), 536, 480, 0, 1023);
      controllerData.analogAxisArray[3] = map(analogRead(A1), 1003, 670, 0, 1023); 
      controllerData.analogAxisArray[4] = map(analogRead(A2), 462, 340, 0, 1023);
      controllerData.analogAxisArray[5] = 0; 
      controllerData.analogAxisArray[6] = 0; 
      controllerData.analogAxisArray[7] = 0; 
      controllerData.analogAxisArray[8] = 0; 
      controllerData.analogAxisArray[9] = 0; 
      controllerData.analogAxisArray[10] = 0; 
      controllerData.analogAxisArray[11] = 0;
      // And return the data!
      return controllerData;
    }

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    vous déclarez un encodeur rotatif sur les pins 30 et 31
    mais ces pins sont considérées comme des boutons et mis en INPUT_PULLUP par le code ensuite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      for (int i = 4; i <= 54; i++){
        pinMode(i, INPUT);
        digitalWrite(i, HIGH);
      }
    ==> toutes les broches de 4 à 54 sont considérées comme des boutons et servent à mettre à jour l'état des bits de controllerData.buttonArray
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      for (int i = 4; i < 54; i++){
        controllerData.buttonArray[(i - 4) / 8] |= (!digitalRead(i)) << ((i - 4) % 8);
      }

  3. #3
    Membre confirmé
    Homme Profil pro
    pompier
    Inscrit en
    Janvier 2020
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : pompier

    Informations forums :
    Inscription : Janvier 2020
    Messages : 86
    Par défaut
    Jay M merci pur ce retour, donc si je comprends bien,

    je déclare les pin pour les boutons du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (int i = 4; i <= 30 ; i++){
        pinMode(i, INPUT);
        digitalWrite(i, HIGH);
      }

    et après je déclare mon encodeur

    mais mon problème en fait c'est en fonction du sens de rotation; de l'action à réaliser ou de son interprétation

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    si votre encodeur est sur 30 et 31 il faut utiliser < 30 dans la boucle for pour ne pas prendre la pin 30 aussi.

    Je ne connais pas MegaJoy et donc je ne sais pas comment il traite un encodeur rotatif.

    j'ai vu dans la bibliothèque qu'il pouvait traiter des boutons ou un joystick

    https://github.com/AlanChatham/UnoJo...aJoy.h#L42-L44

    ==> il faudrait sans doute transformer la position de l'encodeur en valeur de joystick ?

Discussions similaires

  1. Réponses: 17
    Dernier message: 25/03/2022, 16h45
  2. Encodeur rotatif absolu
    Par Guesset dans le forum Embarqué
    Réponses: 21
    Dernier message: 26/01/2022, 17h27
  3. Réponses: 17
    Dernier message: 21/01/2019, 17h47
  4. [TP]Portage d'un encodeur MP3 Fortran en pur Pascal...
    Par Christophe Fantoni dans le forum Turbo Pascal
    Réponses: 11
    Dernier message: 04/07/2003, 17h34
  5. encodeur url en PERL
    Par stefcreator dans le forum Modules
    Réponses: 2
    Dernier message: 17/04/2003, 16h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo