Problème de changement de sens avec encodeur

Bonjour,

Je sollicite un peu d'aide afin d'affiner le Petit Prg que j'ai mis au point en mixant plusieurs sources.

le but est d'utiliser une Arduino Leonardo comme joystick permettant de gérer 10 encodeurs rotatifs, chacun générant un clic dans les sens horaire sur le Btn 0 et antihoraire sur le Btn 1
Le tout sans rebond et 100% logiciel

Tout fonctionne ... hormis a chaque changement de sens qui génère un clic erroné.
Un œil nouveau étant souvent la solution, je m'en remet a vous.

ci dessous le code pour 1 encodeur,

#include <Joystick.h>
#include "RotaryEncoder.h"
Joystick_ Joystick;

RotaryEncoder encoder01(0, 1);
static int pos01 = 0;
int newPos01;
int test01;
int current_State0, current_State1;
int last_State0, last_State1;

void setup() {

  for (int i = 0; i < 14; i++) {
    pinMode(i, INPUT_PULLUP);
  }

  // Initialialisation Joystick Library
  Joystick.begin();
}

void loop() {
  

//// Read Switches 0-1
  encoder01.tick();
  newPos01 = encoder01.getPosition();

  // La console de test affiche des resultats coherents avec le sens de rotation ...

  // Test sens de rotation
  if (pos01 != newPos01) {
    if (pos01 < newPos01) {
      //Serial.println("++");
      test01 = 1;
    } else {
      //Serial.println("--");
      test01 = -1;
    }
    pos01 = newPos01;
  }

  // ... Mais ... Pb Pour les Boutons du joystick a chaque chgt de sens !
  // rotation
  // ++   ++   ++   ++   --   --   --   --   ++   ++   ++   ++   --   --   --   --
  // Btn Press 
  //  1    1   1    1    1    0    0     0    0    1    1    1    1    0    0    0

  int current_State0 = !digitalRead(0);
  if (current_State0 != last_State0) {
    if (test01 > 0) {
      Joystick.setButton(0, current_State0);
      last_State0 = current_State0;
    }
  }
  int current_State1 = !digitalRead(1);
  if (current_State1 != last_State1) {
    if (test01 < 0) {
      Joystick.setButton(1, current_State1);
      last_State1 = current_State1;
    }
  }

  Joystick.sendState();
}

Euh, je ne pense pas que Tutoriels et cours - Arduino Forum soit le bonne endroi pour poser une question. Mieux vaut la mettre dans Français - Arduino Forum ( partie principale :slightly_smiling_face: ) Avez vous lue Les bonnes pratiques du forum francophone ?

OK désolé ... oups seul un admin peu le supprimer

Ne vous en faite pas, ce n'est pas grave :slightly_smiling_face:
Mais je ne suis pas un modérateur, donc je ne peux pas le mettre ou il faut.

Bonsoir @multypass

Un bandeau est mis en évidence en tête de forum , merci de bien vouloir prendre le temps de découvrir les consignes

:fr: :warning: QUELQUES RÈGLES SIMPLES À LIRE IMPÉRATIVEMENT AVANT DE POSTER :warning:

je déplace le fil de dixussion à l'endroit approprié pour éviter de polluer la zone exclusivement dédiée à lau dépot et à la consultation de cours et tutoriels.

Merci @al1fch :wink:

Merci @al1fch et encore desolé

J'ai lu un peu vite et il y a peut-être un truc qui m'a échappé mais pourquoi les Joystick.setButton() ne sont pas fait dans le if (test01 < 0)? pourquoi passer par une variable intermédiaire?

j'ai effectivement implémenté de cette façon car la première version ( ci dessous ) ne déclenchait aucun clic, mais c'est peu être un problème de syntaxe qui m'échappe encore

#include <Joystick.h>
#include "RotaryEncoder.h"
Joystick_ Joystick;

RotaryEncoder encoder01(0, 1);
static int pos01 = 0;
int newPos01;
int test01;
int current_State0, current_State1;
int last_State0, last_State1;

void setup() {

  for (int i = 0; i < 14; i++) {
    pinMode(i, INPUT_PULLUP);
  }

  // Initialialisation Joystick Library
  Joystick.begin();
}

void loop() {  

//// Read Switches 0-1
  encoder01.tick();
  newPos01 = encoder01.getPosition();

  if (pos01 != newPos01) {
    if (pos01 < newPos01) {
      int current_State0 = !digitalRead(0); 
      if (current_State0 != last_State0) { 
          Joystick.setButton(0, current_State0); 
          last_State0 = current_State0; 
      }
    }      
    else {
      int current_State1 = !digitalRead(1); 
      if (current_State1 != last_State1) { 
          Joystick.setButton(1, current_State1); 
          last_State1 = current_State1; 
      }
    }
    pos01 = newPos01;
  }
  Joystick.sendState();
}

Ce n'est pas plutôt ça que tu veux faire?

#include <Joystick.h>
#include "RotaryEncoder.h"
Joystick_ Joystick;

RotaryEncoder encoder01(0, 1);
static int pos01 = 0;
int newPos01;
int test01;
int current_State0, current_State1;
int last_State0, last_State1;

void setup() {

  for (int i = 0; i < 14; i++) {
    pinMode(i, INPUT_PULLUP);
  }

  // Initialialisation Joystick Library
  Joystick.begin();
}

void loop() {  

//// Read Switches 0-1
  encoder01.tick();
  newPos01 = encoder01.getPosition();

  if (pos01 != newPos01) {
    if (pos01 < newPos01) {
      Joystick.setButton(0, current_State0); 
      last_State0 = current_State0; 
    }      
    else {
      Joystick.setButton(1, current_State1); 
      last_State1 = current_State1; 
    }
    pos01 = newPos01;
  }
  Joystick.sendState();
}

c'est clair qu'on peu rationnaliser le code.
J'ai pas mal tester les différentes solutions d'implémentations et, sur le papier, ca parait correct, ...

mais dans la réalité, aussi bien dans la version du post précèdent que dans ta version, ...
pas de Joystick.setButton déclenché dans le périphérique de jeu.

Pour l'instant seule la première version que j'ai posté déclenche un Joystick.setButton.

Au temps pour moi, les current_Statex n'était pas initialisés.
Là, cela devrait envoyer une impulsion sur l'un des "boutons" à chaque pas du codeur, enfin je suppose je n'ai rien pour tester..

#include <Joystick.h>
#include "RotaryEncoder.h"
Joystick_ Joystick;

RotaryEncoder encoder01(0, 1);
static int pos01 = 0;
int newPos01;
int test01;
int current_State0, current_State1;
int last_State0, last_State1;

void setup() {

  for (int i = 0; i < 14; i++) {
    pinMode(i, INPUT_PULLUP);
  }

  // Initialialisation Joystick Library
  Joystick.begin();
}

void loop() {  

//// Read Switches 0-1
  encoder01.tick();
  newPos01 = encoder01.getPosition();

  if (pos01 != newPos01) {
    if (pos01 < newPos01) {
      Joystick.setButton(0, 1); 
      Joystick.setButton(1, 0); 
      Joystick.sendState(); 
    }      
    else {
      Joystick.setButton(0, 0); 
      Joystick.setButton(1, 1); 
      Joystick.sendState();
    }
  }  
}

Merci pour ce retour mais ce n'est pas fonctionnel, trop de perte de Clic il faut tourner l'encodeur extrêmement lentement.

ceci dit avec ton approche il apparait un "non clic" au changement de sens.

je pense chercher du coté de la Biblio RotaryEncoder.h car de nombreux post
révèlent des Problèmes similaires sur l'utilisation conjointe avec Joystick.h.

A suivre ....

Problème réglé,

Passage sur la biblio MD_REncoder.h

Pour les intéressés, un sketch pour une Arduino Leonardo en joystick avec 10 encodeurs rotatif.

/*Install the Libraries first*/
#include <Joystick.h>
#include <MD_REncoder.h>

MD_REncoder ROTARY1 = MD_REncoder(A0, A1);
MD_REncoder ROTARY2 = MD_REncoder(A2, A3);
MD_REncoder ROTARY3 = MD_REncoder(A4, A5);
MD_REncoder ROTARY4 = MD_REncoder(0, 1);
MD_REncoder ROTARY5 = MD_REncoder(2, 3);
MD_REncoder ROTARY6 = MD_REncoder(4, 5);
MD_REncoder ROTARY7 = MD_REncoder(6, 7);
MD_REncoder ROTARY8 = MD_REncoder(8, 9);
MD_REncoder ROTARY9 = MD_REncoder(10, 11);
MD_REncoder ROTARY10 = MD_REncoder(12, 13);

Joystick_ Joystick;

void setup() {

  Joystick.begin();
  ROTARY1.begin();
  ROTARY2.begin();
  ROTARY3.begin();
  ROTARY4.begin();
  ROTARY5.begin();
  ROTARY6.begin();
  ROTARY7.begin();
  ROTARY8.begin();    
  ROTARY9.begin();
  ROTARY10.begin();   
}

void loop() {

  uint8_t ROTARY1_IN = ROTARY1.read();
  if (ROTARY1_IN) { if (ROTARY1_IN == DIR_CW) { Joystick.setButton(A0,1); delay(150); Joystick.setButton(A0,0); } if (ROTARY1_IN == DIR_CCW) { Joystick.setButton(A1,1); delay(150); Joystick.setButton(A1,0); } }
  uint8_t ROTARY2_IN = ROTARY2.read();
  if (ROTARY2_IN) { if (ROTARY2_IN == DIR_CW) { Joystick.setButton(A2,1); delay(150); Joystick.setButton(A2,0); } if (ROTARY2_IN == DIR_CCW) { Joystick.setButton(A3,1); delay(150); Joystick.setButton(A3,0); } }  
  uint8_t ROTARY3_IN = ROTARY3.read();
  if (ROTARY3_IN) { if (ROTARY3_IN == DIR_CW) { Joystick.setButton(A4,1); delay(150); Joystick.setButton(A4,0); } if (ROTARY3_IN == DIR_CCW) { Joystick.setButton(A5,1); delay(150); Joystick.setButton(A5,0); } }
  uint8_t ROTARY4_IN = ROTARY4.read();
  if (ROTARY4_IN) { if (ROTARY4_IN == DIR_CW) { Joystick.setButton(0,1); delay(150); Joystick.setButton(0,0); } if (ROTARY4_IN == DIR_CCW) { Joystick.setButton(1,1); delay(150); Joystick.setButton(1,0); } }  
  uint8_t ROTARY5_IN = ROTARY5.read();
  if (ROTARY5_IN) { if (ROTARY5_IN == DIR_CW) { Joystick.setButton(2,1); delay(150); Joystick.setButton(2,0); } if (ROTARY5_IN == DIR_CCW) { Joystick.setButton(3,1); delay(150); Joystick.setButton(3,0); } }
  uint8_t ROTARY6_IN = ROTARY6.read();
  if (ROTARY6_IN) { if (ROTARY6_IN == DIR_CW) { Joystick.setButton(4,1); delay(150); Joystick.setButton(4,0); } if (ROTARY6_IN == DIR_CCW) { Joystick.setButton(5,1); delay(150); Joystick.setButton(5,0); } }  
  uint8_t ROTARY7_IN = ROTARY7.read();
  if (ROTARY7_IN) { if (ROTARY7_IN == DIR_CW) { Joystick.setButton(6,1); delay(150); Joystick.setButton(6,0); } if (ROTARY7_IN == DIR_CCW) { Joystick.setButton(7,1); delay(150); Joystick.setButton(7,0); } }  
  uint8_t ROTARY8_IN = ROTARY8.read();
  if (ROTARY8_IN) { if (ROTARY8_IN == DIR_CW) { Joystick.setButton(8,1); delay(150); Joystick.setButton(8,0); } if (ROTARY8_IN == DIR_CCW) { Joystick.setButton(9,1); delay(150); Joystick.setButton(9,0); } }  
  uint8_t ROTARY9_IN = ROTARY9.read();
  if (ROTARY9_IN) { if (ROTARY9_IN == DIR_CW) { Joystick.setButton(10,1); delay(150); Joystick.setButton(10,0); } if (ROTARY9_IN == DIR_CCW) { Joystick.setButton(11,1); delay(150); Joystick.setButton(11,0); } }  
  uint8_t ROTARY10_IN = ROTARY10.read();
  if (ROTARY10_IN) { if (ROTARY10_IN == DIR_CW) { Joystick.setButton(12,1); delay(150); Joystick.setButton(12,0); } if (ROTARY10_IN == DIR_CCW) { Joystick.setButton(13,1); delay(150); Joystick.setButton(13,0); } }    
}

Et voici la version optimisé du code

#include <Joystick.h>
#include <MD_REncoder.h>

MD_REncoder rotary[] = { MD_REncoder(A0, A1), MD_REncoder(A2, A3), MD_REncoder(A4, A5), MD_REncoder(0, 1), MD_REncoder(2, 3), 
                         MD_REncoder(4, 5), MD_REncoder(6, 7), MD_REncoder(8, 9), MD_REncoder(10, 11), MD_REncoder(12, 13) };
                         
Joystick_ joystick;

void setup() {
  joystick.begin();
  for (int i=0; i<10; i++) {
    rotary[i].begin();
  }
}

void loop() {
  for (int i=0; i<10; i++) {
    uint8_t rotary_in = rotary[i].read();
    if (rotary_in == DIR_CW) {
      joystick.setButton(i*2, 1);
      delay(150);
      joystick.setButton(i*2, 0);
    }
    else if (rotary_in == DIR_CCW) {
      joystick.setButton(i*2+1, 1);
      delay(150);
      joystick.setButton(i*2+1, 0);
    }
  }
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.