- Encodeur rotatif et ses types
- Brochage et description du codeur rotatif KY-040
- Comment fonctionne le codeur rotatif
- Composants requis
- Schéma du circuit d'interfaçage du codeur rotatif PIC16F877A
- Explication du code
Un encodeur rotatif est un périphérique d'entrée qui aide l'utilisateur à interagir avec un système. Il ressemble plus à un potentiomètre Radio mais il émet un train d'impulsions qui rend son application unique. Lorsque le bouton de l'encodeur est tourné, il tourne sous forme de petites étapes, ce qui l'aide à être utilisé pour le contrôle du moteur pas à pas / servomoteur, la navigation dans une séquence du menu et l'augmentation / la diminution de la valeur d'un nombre et bien plus encore.
Dans cet article, nous découvrirons les différents types d'encodeurs rotatifs et leur fonctionnement. Nous allons également l' interfacer avec le microcontrôleur PIC PIC16F877A et contrôler la valeur d'un entier en faisant tourner le codeur et afficher sa valeur sur un écran LCD 16 * 2. À la fin de ce didacticiel, vous serez à l'aise avec l'utilisation d'un encodeur rotatif pour vos projets. Alors, commençons…
Encodeur rotatif et ses types
Codeur rotatif souvent appelé codeur d'arbre. C'est un transducteur électromécanique, c'est-à-dire qu'il convertit les mouvements mécaniques en impulsions électroniques ou en d'autres termes, il convertit la position angulaire ou le mouvement ou la position de l'arbre en un signal numérique ou analogique. Il se compose d'un bouton qui, lorsqu'il tourne, se déplacera pas à pas et produira une séquence de trains d'impulsions avec une largeur prédéfinie pour chaque pas.
Il existe de nombreux types d'encodeur rotatif sur le marché, le concepteur peut en choisir un en fonction de son application. Les types les plus courants sont listés ci-dessous
- Codeur incrémental
- Codeur absolu
- Encodeur magnétique
- Encodeur optique
- Encodeur laser
Ces codeurs sont classés en fonction du signal de sortie et de la technologie de détection, le codeur incrémental et les codeurs absolus sont classés en fonction du signal de sortie et les codeurs magnétique, optique et laser sont classés en fonction de la technologie de détection. Le codeur utilisé ici est un codeur de type incrémental.
L'encodeur absolu stocke les informations de position même après la coupure de l'alimentation, et les informations de position seront disponibles lorsque nous lui appliquerons à nouveau l'alimentation.
L'autre type de base, le codeur incrémental fournit des données lorsque le codeur change de position. Il n'a pas pu stocker les informations de position.
Brochage et description du codeur rotatif KY-040
Les broches du codeur rotatif incrémental KY-040 sont illustrées ci-dessous. Dans ce projet, nous allons interfacer cet encodeur rotatif avec le microcontrôleur populaire PIC16F877A de microchip.
Les deux premières broches (Terre et Vcc) sont utilisées pour alimenter le codeur, généralement une alimentation + 5V est utilisée. En plus de tourner le bouton dans le sens des aiguilles d'une montre et dans le sens anti-horaire, l'encodeur dispose également d'un interrupteur (actif bas) qui peut être enfoncé en appuyant sur le bouton à l'intérieur. Le signal de ce commutateur est obtenu via la broche 3 (SW). Enfin, il a les deux broches de sortie (DT et CLK) qui produisent les formes d'onde comme déjà discuté ci-dessous. Nous avons précédemment interfacé cet encodeur rotatif avec Arduino.
Comment fonctionne le codeur rotatif
La sortie dépend entièrement des plots de cuivre internes qui assurent la connexion avec GND et VCC avec l'arbre.
Il y a deux parties de l'encodeur rotatif. Roue d'arbre qui est reliée à l'arbre et tourne dans le sens horaire ou anti-horaire en fonction de la rotation de l'arbre et de la base où la connexion électrique est effectuée. La base a des ports ou des points qui sont connectés à DT ou CLK de telle manière que lorsque la roue d'arbre tourne, elle connecte les points de base et fournit une onde carrée sur les ports DT et CLK.
La sortie sera comme lorsque l'arbre tourne-
Deux ports fournissent l'onde carrée mais il y a une légère différence dans la synchronisation. Pour cette raison, si nous acceptons la sortie comme 1 et 0, il ne peut y avoir que quatre états, 0 0, 1 0, 1 1, 0 1. La séquence de la sortie binaire détermine le tour dans le sens horaire ou anti-horaire. Comme, par exemple, si le codeur rotatif fournit 1 0 au repos et fournit 1 1 après cela, cela signifie que le codeur change sa position d'un seul pas dans le sens des aiguilles d'une montre, mais s'il fournit 0 0 après le ralenti 1 0, signifie que l'arbre change ses positions dans le sens anti-horaire d'un pas.
Composants requis
Il est temps d'identifier ce dont nous avons besoin pour interfacer le codeur rotatif avec le microcontrôleur PIC,
- PIC16F877A
- Résistance 4,7k
- Résistance 1k
- Pot de 10k
- Condensateur à disque céramique 33pF - 2pcs
- Cristal 20Mhz
- Affichage 16x2
- Codeur rotatif
- Adaptateur 5V.
- Planche à pain
- Fils de branchement.
Schéma du circuit d'interfaçage du codeur rotatif PIC16F877A
Ci-dessous, l'image de la configuration finale après avoir connecté les composants selon le schéma de circuit:
Nous avons utilisé une seule résistance 1K pour le contraste de l'écran LCD au lieu d'utiliser un potentiomètre. Vérifiez également la vidéo de travail complète donnée à la fin.
Explication du code
Le code PIC complet est donné à la fin de ce projet avec une vidéo de démonstration, ici nous expliquons quelques parties importantes du code. Si vous êtes nouveau avec PIC Microcontroller, suivez nos tutoriels PIC depuis le début.
Comme nous l'avons vu précédemment, nous devons vérifier la sortie et différencier la sortie binaire pour DT et CLK, nous avons donc créé une partie if-else pour l'opération.
if (Encoder_CLK! = position) { if (Encoder_DT! = position) { // lcd_com (0x01); counter ++; // Augmente le compteur qui sera imprimé sur le lcd lcd_com (0xC0); lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, compteur); } else { // lcd_com (0x01); lcd_com (0xC0); compteur--; // diminue le compteur lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, compteur); // lcd_puts ("Gauche"); } }
Nous devons également stocker la position à chaque étape. Pour ce faire, nous avons utilisé une variable «position» qui stocke la position actuelle.
position = Encoder_CLK; // C'est pour stocker la position de l'horloge de l'encodeur sur la variable. Peut être 0 ou 1.
En dehors de cela, une option est fournie pour informer de la pression de l'interrupteur sur l'écran LCD.
if (Encoder_SW == 0) { sw_delayms (20); // délai anti- rebond if (Encoder_SW == 0) { // lcd_com (1); // lcd_com (0xC0); lcd_puts ("interrupteur enfoncé"); // itoa (compteur, valeur, 10); // lcd_puts (valeur);
La fonction system_init est utilisée pour initialiser l'opération d'E / S des broches, l'écran LCD et pour stocker la position du codeur rotatif.
void system_init () { TRISB = 0x00; // PORT B comme sortie, ce port est utilisé pour LCD TRISDbits.TRISD2 = 1; TRISDbits.TRISD3 = 1; TRISCbits.TRISC4 = 1; lcd_init (); // Ceci initialisera la position LCD = Encoder_CLK; // Sotred la position CLK sur l'initialisation du système, avant le démarrage de la boucle while. }
La fonction LCD est écrite sur la bibliothèque lcd.c et lcd.h où les lcd_puts (), lcd_cmd () sont déclarés.
Pour la déclaration de variable, les bits de configuration et d'autres extraits de code, veuillez trouver le code complet ci-dessous.