Table des matières:

Une solution rotative Arduino complète : 5 étapes
Une solution rotative Arduino complète : 5 étapes

Vidéo: Une solution rotative Arduino complète : 5 étapes

Vidéo: Une solution rotative Arduino complète : 5 étapes
Vidéo: Amazing arduino project 2024, Juillet
Anonim
Une solution rotative Arduino complète
Une solution rotative Arduino complète

Les encodeurs rotatifs sont des boutons de commande rotatifs pour les projets électroniques, souvent utilisés avec les microcontrôleurs de la famille Arduino. Ils peuvent être utilisés pour affiner les paramètres, naviguer dans les menus, déplacer des objets à l'écran, définir des valeurs de toute nature. Ils remplacent couramment les potentiomètres, car ils peuvent être tournés plus précisément et à l'infini, ils incrémentent ou décrémentent une valeur discrète à la fois, et sont souvent intégrés à un interrupteur poussable pour les fonctions de type sélection. Ils sont de toutes formes et tailles, mais la gamme de prix la plus basse est difficile à interagir comme expliqué ci-dessous.

Il existe d'innombrables articles sur les détails de fonctionnement et les modes d'utilisation des encodeurs rotatifs, ainsi que de nombreux exemples de codes et de bibliothèques sur la façon de les utiliser. Le seul problème est qu'aucun d'entre eux ne fonctionne avec une précision à 100% avec les modules rotatifs chinois les plus bas de gamme.

Étape 1: Encodeurs rotatifs à l'intérieur

Encodeurs rotatifs à l'intérieur
Encodeurs rotatifs à l'intérieur
Encodeurs rotatifs à l'intérieur
Encodeurs rotatifs à l'intérieur
Encodeurs rotatifs à l'intérieur
Encodeurs rotatifs à l'intérieur

La partie rotative de l'encodeur a trois broches (et deux de plus pour la partie interrupteur optionnelle). L'un est un terrain d'entente (GND noir), les deux autres servent à déterminer la direction lorsque le bouton est tourné (ils sont souvent appelés CLK bleu et DT rouge). Les deux sont attachés à une broche d'entrée PULLUP du microcontrôleur, faisant du niveau HAUT leur lecture par défaut. Lorsque le bouton est tourné vers l'avant (ou dans le sens des aiguilles d'une montre), le CLK bleu tombe d'abord au niveau BAS, puis le DT rouge suit. En tournant plus loin, le bleu CLK remonte à HIGH, puis à mesure que le patch GND commun quitte les deux broches de connexion, le rouge DT remonte également à HIGH. Complétant ainsi un tick complet FWD (ou dans le sens des aiguilles d'une montre). Il en va de même dans l'autre sens BWD (ou dans le sens inverse des aiguilles d'une montre), mais maintenant le rouge tombe en premier et le bleu remonte en dernier, comme indiqué respectivement dans les deux images de niveau.

Étape 2: Une misère qui cause une réelle douleur à beaucoup

Une misère qui cause une réelle douleur à beaucoup
Une misère qui cause une réelle douleur à beaucoup
Une misère qui cause une réelle douleur à beaucoup
Une misère qui cause une réelle douleur à beaucoup
Une misère qui cause une réelle douleur à beaucoup
Une misère qui cause une réelle douleur à beaucoup

Problème courant pour les amateurs d'Arduino, les modules d'encodeur rotatif bon marché font rebondir des changements supplémentaires dans les niveaux de sortie, provoquant des lectures de comptage supplémentaires et erronées. Cela empêche un comptage parfait et rend impossible l'intégration de ces modules dans des projets rotatifs précis. Ces rebonds supplémentaires sont causés par les mouvements mécaniques des patchs sur les broches de connexion, et même l'application de condensateurs supplémentaires ne peut pas les éliminer complètement. Les rebonds peuvent apparaître n'importe où dans les cycles de tick complets et sont illustrés par des scénarios de la vie réelle sur les images.

Étape 3: Solution de machine à états finis (FSM)

Solution de machine à états finis (FSM)
Solution de machine à états finis (FSM)

L'image montre l'espace d'état complet des changements de niveau possibles pour les deux broches (bleu CLK et rouge DT), à la fois pour les rebonds corrects et faux. Sur la base de cette machine d'état, une solution complète peut être programmée qui fonctionne toujours avec une précision à 100%. Parce qu'aucun délai de filtrage n'est nécessaire dans cette solution, elle est également la plus rapide possible. Un autre avantage de séparer l'espace d'état des broches du mode de travail est que l'on peut appliquer à la fois des modes d'interrogation ou d'interruption à son gré. L'interrogation ou les interruptions peuvent détecter les changements de niveau sur les broches et une routine distincte calculera le nouvel état en fonction de l'état actuel et des événements réels des changements de niveau.

Étape 4: Code Arduino

Code Arduino
Code Arduino

Le code ci-dessous compte les ticks FWD et BWD sur le moniteur série et intègre également la fonction de commutateur en option.

// Peter Csurgy 2019-04-10

// Broches du rotatif mappées sur les ports Arduino

#définir SW 21 #définir CLK 22 #définir DT 23

// Valeur actuelle et précédente du compteur accordé par le rotatif

int curVal = 0; int prevVal = 0;

// Sept états de FSM (machine à états finis)

#define IDLE_11 0 #define SCLK_01 1 #define SCLK_00 2 #define SCLK_10 3 #define SDT_10 4 #define SDT_00 5 #define SDT_01 6 int state = IDLE_11;

void setup() {

Serial.begin (250000); Serial.println("Démarrer…"); // Le niveau HAUT sera par défaut pour toutes les broches pinMode(SW, INPUT_PULLUP); pinMode(CLK, INPUT_PULLUP); pinMode(DT, INPUT_PULLUP); // CLK et DT déclencheront des interruptions pour tous les changements de niveau attachInterrupt(digitalPinToInterrupt(CLK), RotaryCLK, CHANGE); attachInterrupt(digitalPinToInterrupt(DT),rotatingDT, CHANGE); }

boucle vide() {

// Gestion du switch optionnel intégré à certains encodeurs rotatifs if (digitalRead(SW)==LOW) { Serial.println("Pressed"); while(!digitalRead(SW)); } // Tout changement dans la valeur du compteur est affiché dans Serial Monitor if (curVal != prevVal) { Serial.println(curVal); prevVal = curVal; } }

// Transitions State Machine pour les changements de niveau CLK

void RotaryCLK() { if (digitalRead(CLK)==LOW) { if (state==IDLE_11) state = SCLK_01; sinon si (état==SCLK_10) état = SCLK_00; sinon si (état==SDT_10) état = SDT_00; } else { si (état==SCLK_01) état = IDLE_11; sinon si (état==SCLK_00) état = SCLK_10; sinon si (état==SDT_00) état = SDT_10; else if (état==SDT_01) { état = IDLE_11; curVal--; } } }

// Transitions State Machine pour les changements de niveau DT

void RotaryDT() { if (digitalRead(DT)==LOW) { if (state==IDLE_11) state = SDT_10; sinon si (état==SDT_01) état = SDT_00; sinon si (état==SCLK_01) état = SCLK_00; } else { si (état==SDT_10) état = IDLE_11; sinon si (état==SDT_00) état = SDT_01; sinon si (état==SCLK_00) état = SCLK_01; else if (state==SCLK_10) { state = IDLE_11; curVal++; } } }

Étape 5: Intégration sans faille

Vous pouvez vérifier dans la vidéo ci-jointe que la solution FSM fonctionne avec précision et rapidité, même en cas d'encodeurs rotatifs à faible portée avec divers effets de rebond sporadiques.

Conseillé: