Raspberry Pi - Encodeur Rotatif

Ce didacticiel vous explique comment utiliser le codeur rotatif incrémental avec Raspberry Pi. Voici ce que nous allons couvrir :

Préparation du matériel

1×Raspberry Pi 4 Model B
1×Rotary Encoder
1×Jumper Wires
1×(Optional) Screw Terminal Block Shield for Raspberry Pi
1×(Optional) USB-C Power Cable with On/Off Switch for Raspberry Pi 4B
1×(Optional) Plastic Case and Cooling Fan for Raspberry Pi 4B
1×(Optional) HDMI Touch Screen Monitor for Raspberry Pi

Or you can buy the following sensor kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgation : Certains des liens fournis dans cette section sont des liens affiliés Amazon. Nous pouvons recevoir une commission pour tout achat effectué via ces liens, sans coût supplémentaire pour vous. Nous vous remercions de votre soutien.

À propos du codeur rotatif

Un bouton rotatif qui transforme le mouvement en signal est appelé un encodeur rotatif. Il vous indique de combien quelque chose a tourné et où il est placé. Il en existe deux principaux types :

  • Encodeur incrémental : Cela utilise des signaux rapides pour mesurer combien quelque chose a changé.
  • Encodeur absolu : Ce type fournit un code unique pour chaque position, afin que vous sachiez exactement où se trouve quelque chose, même si le courant est coupé.

Ce guide se concentre sur l'encodeur incrémental.

Brochage du module encodeur rotatif

brochage d'encodeur rotatif

Un module encodeur rotatif possède 4 broches :

  • Broche CLK (Sortie A) : est l'impulsion principale qui nous indique la quantité de rotation effectuée. Chaque fois que vous tournez le bouton d'un cran (clic) dans un sens ou dans l'autre, la broche CLK émet un signal qui complète un cycle complet (BAS → HAUT → BAS).
  • Broche DT (Sortie B) : fonctionne comme la broche CLK, mais émet un signal décalé de 90 degrés par rapport au signal CLK. Cela nous aide à déterminer le sens de rotation (dans le sens des aiguilles d'une montre ou dans le sens inverse).
  • Broche SW : est la sortie du bouton-poussoir à l'intérieur de l'encodeur. Elle est normalement ouverte. Si nous utilisons une résistance de pull-up sur cette broche, la broche SW sera HAUTE lorsque le bouton n'est pas pressé, et BASSE lorsqu'il est pressé.
  • Broche VCC (+) : doit être connectée à VCC (entre 3,3 et 5 volts)
  • Broche GND : doit être connectée au GND (0V)

Codeur rotatif vs Potentiomètre

Vous pouvez confondre le codeur rotatif avec le Raspberry Pi - Potentiomètre., mais ce sont des composants distincts. Voici une comparaison entre eux :

  • Un encodeur rotatif est comme la version moderne d'un potentiomètre, mais il peut faire plus de choses.
  • Un encodeur rotatif peut tourner en cercle complet sans s'arrêter, tandis qu'un potentiomètre ne peut tourner qu'environ les trois quarts du cercle.
  • Un encodeur rotatif produit des impulsions, tandis qu'un potentiomètre produit une tension analogique.
  • Un encodeur rotatif est pratique lorsque vous avez juste besoin de savoir à quelle distance le bouton a été déplacé, pas exactement où il se trouve. Un potentiomètre est utile lorsque vous avez vraiment besoin de savoir exactement où se trouve un bouton.

Comment fonctionne un encodeur rotatif

sortie d'encodeur rotatif

À l'intérieur de l'encodeur, il y a un disque avec des fentes relié à une broche appelée C, qui est comme une masse commune. Il y a deux autres broches, A et B.

  • Lorsque vous tournez le bouton, les broches A et B touchent la broche de masse partagée C, mais dans un certain ordre selon la direction dans laquelle vous tournez le bouton (dans le sens horaire ou antihoraire).
  • Ces contacts créent deux signaux. Ils sont un peu différents en termes de synchronisation car une broche touche la masse avant l'autre. Deux signaux ont un décalage de 90 degrés l'un par rapport à l'autre. Cela s'appelle le codage en quadrature.
  • Lorsque vous tournez le bouton dans le sens horaire, la broche A touche la masse avant la broche B. Lorsque vous tournez le bouton dans le sens antihoraire, la broche B touche la masse avant la broche A.
  • En surveillant quand chaque broche touche ou quitte la masse, nous pouvons déterminer dans quelle direction tourne le bouton. Nous effectuons cela en vérifiant ce qui se passe avec la broche B lorsque la broche A change.
Comment fonctionne un encodeur rotatif

Lorsque A change d'état de BAS à HAUT :

  • Si B est BAS, le bouton est tourné dans le sens des aiguilles d'une montre.
  • Si B est HAUT, le bouton est tourné dans le sens inverse des aiguilles d'une montre.

※ Note:

Les broches A et B sont connectées aux broches CLK et DT. Cependant, selon les fabricants, l'ordre peut être différent. Les codes fournis ci-dessous ont été testés avec l'encodeur rotatif de DIYables.

Comment programmer un encodeur rotatif

  • Vérifiez le signal de la broche CLK
  • Si l'état change de BAS à HAUT, vérifiez l'état de la broche DT.
    • Si l'état de la broche DT est HAUT, le bouton est tourné dans le sens anti-horaire, augmentez le compteur de 1
    • Si l'état de la broche DT est BAS, le bouton est tourné dans le sens horaire, diminuez le compteur de 1

Diagramme de câblage

Schéma de câblage du codeur rotatif Raspberry Pi

This image is created using Fritzing. Click to enlarge image

Pour simplifier et organiser votre câblage, nous vous recommandons d'utiliser un Screw Terminal Block Shield pour Raspberry Pi. Ce shield garantit des connexions plus sûres et plus faciles à gérer, comme illustré ci-dessous :

Raspberry Pi Screw Terminal Block Shield

Code Raspberry Pi – Encodeur Rotatif

Le code Raspberry Pi ci-dessous fait :

  • Détecte la direction et la quantité de rotation de l'encodeur.
    • Si la détection du bouton tourné d'un cran (clic) dans le sens horaire, augmentez le compteur de un.
    • Si la détection du bouton tourné d'un cran (clic) dans le sens antihoraire, diminuez le compteur de un.
  • Détecte si le bouton est enfoncé.

Étapes rapides

  • Assurez-vous d'avoir Raspbian ou tout autre système d'exploitation compatible avec Raspberry Pi installé sur votre Pi.
  • Assurez-vous que votre Raspberry Pi est connecté au même réseau local que votre PC.
  • Assurez-vous que votre Raspberry Pi est connecté à Internet si vous avez besoin d'installer des bibliothèques.
  • Si c'est la première fois que vous utilisez Raspberry Pi, consultez Installation du logiciel - Raspberry Pi..
  • Connectez votre PC au Raspberry Pi via SSH en utilisant le client SSH intégré sur Linux et macOS ou PuTTY sur Windows. Consultez comment connecter votre PC au Raspberry Pi via SSH.
  • Assurez-vous d'avoir la bibliothèque RPi.GPIO installée. Sinon, installez-la en utilisant la commande suivante :
sudo apt-get update sudo apt-get install python3-rpi.gpio
  • Créez un fichier de script Python rotary_encoder.py et ajoutez le code suivant :
# Ce code Raspberry Pi a été développé par newbiely.fr # Ce code Raspberry Pi est mis à disposition du public sans aucune restriction. # Pour des instructions complètes et des schémas de câblage, veuillez visiter: # https://newbiely.fr/tutorials/raspberry-pi/raspberry-pi-rotary-encoder import RPi.GPIO as GPIO import time # Pin numbers on Raspberry Pi CLK_PIN = 7 # GPIO7 connected to the rotary encoder's CLK pin DT_PIN = 8 # GPIO8 connected to the rotary encoder's DT pin SW_PIN = 25 # GPIO25 connected to the rotary encoder's SW pin DIRECTION_CW = 0 DIRECTION_CCW = 1 counter = 0 direction = DIRECTION_CW CLK_state = 0 prev_CLK_state = 0 button_pressed = False prev_button_state = GPIO.HIGH # Configure GPIO pins GPIO.setmode(GPIO.BCM) GPIO.setup(CLK_PIN, GPIO.IN) GPIO.setup(DT_PIN, GPIO.IN) GPIO.setup(SW_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Read the initial state of the rotary encoder's CLK pin prev_CLK_state = GPIO.input(CLK_PIN) try: while True: # Read the current state of the rotary encoder's CLK pin CLK_state = GPIO.input(CLK_PIN) # If the state of CLK is changed, then pulse occurred # React to only the rising edge (from LOW to HIGH) to avoid double count if CLK_state != prev_CLK_state and CLK_state == GPIO.HIGH: # If the DT state is HIGH, the encoder is rotating in counter-clockwise direction # Decrease the counter if GPIO.input(DT_PIN) == GPIO.HIGH: counter -= 1 direction = DIRECTION_CCW else: # The encoder is rotating in clockwise direction => increase the counter counter += 1 direction = DIRECTION_CW print("Rotary Encoder:: direction:", "CLOCKWISE" if direction == DIRECTION_CW else "ANTICLOCKWISE", "- count:", counter) # Save last CLK state prev_CLK_state = CLK_state # State change detection for the button button_state = GPIO.input(SW_PIN) if button_state != prev_button_state: time.sleep(0.01) # Add a small delay to debounce if button_state == GPIO.LOW: print("The button is pressed") button_pressed = True else: button_pressed = False prev_button_state = button_state except KeyboardInterrupt: GPIO.cleanup() # Clean up GPIO on program exit
  • Enregistrez le fichier et exécutez le script Python en exécutant la commande suivante dans le terminal :
python3 rotary_encoder.py
  • Tournez le bouton dans le sens des aiguilles d'une montre, puis dans le sens inverse des aiguilles d'une montre
  • Appuyez sur le bouton
  • Vérifiez le résultat dans le Terminal.
PuTTY - Raspberry Pi
DIRECTION: Clockwise | COUNTER: 1 DIRECTION: Clockwise | COUNTER: 2 DIRECTION: Clockwise | COUNTER: 3 DIRECTION: Clockwise | COUNTER: 4 DIRECTION: Clockwise | COUNTER: 5 DIRECTION: Counter-clockwise | COUNTER: 4 DIRECTION: Counter-clockwise | COUNTER: 3 DIRECTION: Counter-clockwise | COUNTER: 2 DIRECTION: Counter-clockwise | COUNTER: 1 DIRECTION: Counter-clockwise | COUNTER: 0 The button is pressed

Explication du code

Consultez les commentaires ligne par ligne dans le code.

Application de codeur rotatif Raspberry Pi

Avec un encodeur rotatif, nous pouvons réaliser les applications suivantes, mais sans s'y limiter :

  • Raspberry Pi - Le codeur rotatif contrôle la position du servomoteur
  • Raspberry Pi - Le codeur rotatif contrôle la luminosité de la LED
  • Raspberry Pi - Le codeur rotatif contrôle la vitesse du moteur pas à pas

Vidéo

Tutoriels connexes

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!