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 :

Afficher des lettres de l'alphabet à l'aide d'un encodeur rotatif


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    985
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 985
    Par défaut Afficher des lettres de l'alphabet à l'aide d'un encodeur rotatif
    Bonjour à tous ,

    pour afficher un mot complet de plusieurs lettres sur un affichage LCD ou OLED à l'aide d'un arduino
    je souhaiterai pouvoir choisir en partant de la gauche vers la droite, une lettre de l'alphabet à l'aide d'un encodeur rotatif (KY-040)
    puis la valider à l'aide du bouton poussoir, ensuite effectuer un décalage, je sélectionnerai alors la seconde lettre et ainsi de suite ..

    Je recherche donc un exemple de programme
    ou une aide pour le faire pour l'élaborer

    merci mille fois
    pascal

  2. #2
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    pour simplifier le code, prenez des bibliothèques pour vos composants:

    • la bibliothèque encoder pour l'encodeur rotatif
    • N'importe quelle bibliothèque bouton (OneButton, SimpleBouton, Bounce2, EasyRun, ...)


    il vous faut quelques variables:
    un tableau de caractères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char message[30]; // de la bonne taille, prévoir 1 case de plus à la fin
    la position en cours dans le tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte position = 0; // initialisée à 0
    un booléen pour dire si le message est prêt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool messageDisponible = false;
    un booléen éventuellement pour dire si vous êtes en mode édition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool editionEnCours = false;
    ----

    Ensuite le code est assez simple sous forme de machine a état avec 2 évènements:
    si l'édition est en cours, on suppose que le curseur est au bon endroit sur l'écran et vous testez s'il y a eu:
    - une action sur l'encodeur rotatif, vous affichez à la position courante la lettre correspondant à l'ancienne lettre + ou - le nombre de clicks de l'encodeur
    - une action sur le bouton de l'encodeur et vous validez la lettre puis déplacez la position courante et affichez un A par exemple qui devient la lettre en cours
    - un double click sur le bouton (géré aussi par pas mal de bibliothèques) pourrait servir de validation. Dans ce cas vous validez la lettre en cours et rajoutez un caractère nul '\0' à la fin et passez messageDisponible à vrai.

    Attention à ne pas dépasser la taille du tableau.

  3. #3
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    985
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 985
    Par défaut
    Bien merci Jay M

    pour votre réponse , je vais essayer de mettre tout çà en pratique

    actuellement le projet est sur ESP32 TTGO display
    le mot à entrer est par liaison série ce qui oblige d'avoir un PC
    l'idée est donc de mettre soit :
    - comme ma demande passer par un KY-040
    - ou autre solution , un clavier 5 touches HAUT/BAS , DROITE/GAUCHE et VALIDE

    je pense qu'un KY-040 me semble plus adapter

    pascal

  4. #4
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    Ok sur esp32 il faut prendre une autre bibliothèque pour l’encodeur, par exemple celle ci

    https://github.com/madhephaestus/ESP32Encoder

  5. #5
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    985
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 985
    Par défaut
    Bonjour à tous,

    Je reviens sur mon petit problème
    pour ce faire , j'ai essayé ce croquis "test" avec ESP32 & Encodeur
    et là je galère déjà car il affiche 2 sauts au lieu d'un seul par cran
    indifféremment à droite ou à gauche
    et je ne sais pas pourquoi

    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
    76
    77
     
    #define PIN_A      2
    #define PIN_B      4
    #define PIN_BUTTON 5
     
    #define DEBONCE_TO 200
     
    volatile bool turnedCW = false;
    volatile bool turnedCCW = false;
     
    unsigned long debounceTime = 0;
     
    bool lastWasCW = false;
    bool lastWasCCW = false;
     
    void checkEncoder() {
      if ((!turnedCW)&&(!turnedCCW)) {
        int pinA = digitalRead(PIN_A);
        delayMicroseconds(2000);
        int pinB = digitalRead(PIN_B);
        if (pinA == pinB){
          if (lastWasCW) {
            turnedCW = true;
          } else {
            turnedCCW = true;
          }      
        } else {
          if (lastWasCCW) {
            turnedCCW = true;
          } else {
            turnedCW = true;
          }
        }    
      }
    }
     
    void setup() {
      Serial.begin(115200);
      pinMode(PIN_A, INPUT_PULLUP);
      pinMode(PIN_B, INPUT_PULLUP);
      pinMode(PIN_BUTTON, INPUT_PULLUP);
      attachInterrupt(PIN_B, checkEncoder, CHANGE);
      Serial.println("Lecture de l'encodeur : ");
    }
     
    void loop() {
      static int value = 0;
     
      if (!digitalRead(PIN_BUTTON)) {
        value = 0;
        Serial.print("Reset: ");
        Serial.println(value);
      }
     
      if (turnedCW) {
        value++;
        Serial.print("Droite : ");
        Serial.println(value);
        turnedCW = false;
        lastWasCW = true;
        debounceTime = millis();
      }
     
      if (turnedCCW) {
        value--;
        Serial.print("Gauche : ");
        Serial.println(value);
        turnedCCW = false;
        lastWasCCW = true;
        debounceTime = millis();
      }
     
      if ((millis()-debounceTime) > DEBONCE_TO) {
        lastWasCW = false;
        lastWasCCW = false;
      }
    }

    pascal

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 205
    Billets dans le blog
    48
    Par défaut
    Salut à tous,

    Citation Envoyé par cobra38 Voir le message
    là je galère déjà car il affiche 2 sauts au lieu d'un seul par cran indifféremment à droite ou à gauche et je ne sais pas pourquoi ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
      attachInterrupt(PIN_B, checkEncoder, CHANGE);
    ...
    Il me semble que c'est le fonctionnement normal de ce genre d'encodeurs incrémentaux...
    En ne considérant qu'une seule voie, il y a un front montant et un front descendant du signal par période (entre deux "crans") et l'interruption sur CHANGE détecte les deux événements.

    Si on prend en compte les deux voies, la deuxième étant décalée d'1/4 de période par rapport à la première, il y aura même 4 événements "par cran".

    Si tu ne veux prendre en compte qu'un seul événement par cran, tu peux rechercher la détection sur les fronts montants du signal uniquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
      attachInterrupt(PIN_B, checkEncoder, RISING); // FALLING pour les fronts descendants
    ...

  7. #7
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    Les encodeurs rotatifs peuvent avoir 1, 2 ou 4 ticks par click.

    Si votre bibliothèque compte les ticks et qu’elle «*voit double*» alors il faut diviser par 2 la valeur lue

  8. #8
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    985
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 985
    Par défaut
    Bonjour Jay M

    Je n'utilise pourtant aucune bibliothèque particulière
    où dois-je diviser par 2 ?

    pascal

  9. #9
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    Vous devez avoir 2 ticks (2 interruptions) par click d'où le compte double.Si vous divisez votre valeur par 2 avant de l'utiliser vous aurez le nombre de clicks. faire une attente dans l'ISR n'est pas forcément une bonne idée...

    Le plus simple est de prendre une bibliothèque du genre https://www.arduino.cc/reference/en/.../esp32encoder/ qui utilise le hardware spécifique de l'ESP32 pour gérer l'encodeur. ce sera plus efficace que votre approche

  10. #10
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    985
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 985
    Par défaut
    merci Jay M

    j'ai voulu préalablement utiliser comme vous l'indiquiez la librairie
    https://github.com/madhephaestus/ESP32Encoder
    mais aucun des exemples ne fonctionnait sans que je puisse trouver l'anomalie
    c'est pourquoi je me suis rabattu sur ce croquis

    pascal

  11. #11
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    Citation Envoyé par cobra38 Voir le message
    mais aucun des exemples ne fonctionnait sans que je puisse trouver l'anomalie
    comment aviez vous connecté l'encodeur?

  12. #12
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    985
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 985
    Par défaut
    Citation Envoyé par Jay M Voir le message
    comment aviez vous connecté l'encodeur?
    Mille pardons mais quand je dis "aucun des exemples ne fonctionnait"
    il s'agissait au moment de la compilation , je n'ai pas réussi à compiler les croquis

    pascal

  13. #13
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    985
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 985
    Par défaut
    RE...

    pour f-leb
    oui je confirme qu'avec "RISING" çà va nettement mieux, des sauts un peu aléatoires dus aux rebonds je présume mais çà a l'air de fonctionner
    merci


    pour jpbbricole
    merci pour le test , je vais donc réessayer car comme je l'ai à Jay M je n'ai même pas réussi à compiler le prg en exemple
    par contre ai-je vraiment besoin d'une bibliothèque particulière ?

    maintenant que l'encodeur donne des chiffres il me faut traduire cela en lettre de A à Z
    à partir d'une table je suppose

    pascal

  14. #14
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour pascal
    Citation Envoyé par cobra38 Voir le message
    https://github.com/madhephaestus/ESP32Encoder
    ... mais aucun des exemples ne fonctionnait sans que je puisse trouver l'anomalie...
    c'est pourquoi je me suis rabattu sur ce croquis
    l
    Surement une erreur de programme et ou connexion. j'ai testé cette librairie avec un ESP32, et ça fonctionne bien.
    Il y a 3 modes de lecture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	encoder.attachSingleEdge(portA, portB);     // Incrémente de 1 par cran du codeur
    	encoder.attachHalfQuad(portA, portB);     // Incrémente de 2 par cran du codeur
    	encoder.attachFullQuad(portA, portB);     // Incrémente de 4 par cran du codeur
    Cordialement
    jpbbricole

Discussions similaires

  1. Afficher 3 lettres de l'alphabet aléatoirement en PHP
    Par Blue_Marion dans le forum Langage
    Réponses: 10
    Dernier message: 23/04/2016, 14h10
  2. Réponses: 8
    Dernier message: 30/07/2015, 13h40
  3. Réponses: 9
    Dernier message: 20/07/2012, 16h15
  4. Réponses: 1
    Dernier message: 17/07/2007, 14h01
  5. Besoin d'aide pour afficher des resultats proprement
    Par zx10 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 27/11/2006, 16h34

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