KY-040 Module encodeur rotatif
Lorsque le commutateur rotatif est déplacé, le sens du mouvement et la position actuelle du commutateur rotatif sont codés et émis via les sorties.
- Arduino
- Raspberry Pi
- Raspberry Pi Pico
- Micro:Bit
Le commutateur rotatif codé (Rotary Encoder) émet le sens du mouvement et la position actuelle du commutateur via ses sorties lorsqu'il est tourné.
À chaque étape, l'état des deux sorties change, ce qui permet de déterminer le sens de rotation. Le sens de rotation est déterminé par l'ordre des changements d'état des sorties : Selon la sortie qui change d'état en premier, il est possible de savoir si le commutateur est tourné dans le sens des aiguilles d'une montre ou dans le sens inverse.
Ce commutateur rotatif est idéal pour les applications qui nécessitent des informations précises sur la position et le mouvement, comme les interfaces utilisateur pour les appareils électroniques, les commandes de machines ou les systèmes de mesure de rotation. Il permet une saisie précise et fiable et constitue un composant polyvalent pour de nombreux projets.
Affectation des broches
Arduino | Capteur |
---|---|
5V | +V |
GND | GND |
Pin 3 | CLK |
Pin 4 | DT |
Pin 5 | SW |
Exemple de code
Si un changement d'état de la broche s'est produit, le programme vérifie laquelle des deux broches a changé en premier, ce qui indique le sens de rotation. Cette information est obtenue en comparant l'une des deux valeurs de la broche d'une manche précédente avec la valeur de la manche actuelle.
Une fois la direction déterminée, les pas depuis la position de départ sont comptés et édités. Appuyer sur le bouton de l'encodeur réinitialise la position actuelle.
Pour charger l'exemple de code suivant sur votre Arduino, nous vous recommandons d'utiliser l'IDE Arduino. Dans l'IDE, vous pouvez choisir le port et la carte qui conviennent à votre appareil.
Copiez le code ci-dessous dans votre IDE. Pour télécharger le code sur votre Arduino, il vous suffit de cliquer sur le bouton " Upload ".
// Initialisation des variables nécessaires
int counter = 0;
boolean direction;
int pin_clk_last;
int pin_clk_current;
// Définition des broches d'entrée
int pin_clk = 3;
int pin_dt = 4;
int button_pin = 5;
void setup() {
// Les broches d'entrée sont initialisées
pinMode(pin_clk,INPUT);
pinMode(pin_dt,INPUT);
pinMode(button_pin,INPUT);
// ...et leurs résistances Pull-Up activées
digitalWrite(pin_clk, true);
digitalWrite(pin_dt, true);
digitalWrite(button_pin, true);
// Lecture initiale du Pin_CLK
pin_clk_last = digitalRead(pin_clk);
Serial.begin (9600);
Serial.println("KY-040 Test du commutateur rotatif");
}
// Le programme vérifie, si un changement d'état des broches s'est produit, laquelle des deux broches a été la première.
// la première broche à avoir changé, ce qui permet de déduire le sens de rotation.
// On obtient cette information en comparant l'une des deux valeurs de broche d'un passage précédent.
// avec la valeur du passage actuel.
// Une fois le sens déterminé, les pas sont comptés et édités à partir de la position de départ.
// Une pression sur le bouton de l'encodeur réinitialise la position actuelle.
void loop() {
// Lecture de l'état actuel
pin_clk_current = digitalRead(pin_clk);
// Vérification de la modification
if (pin_clk_current != pin_clk_last) {
if (digitalRead(pin_dt) != pin_clk_current) {
// Pin_CLK a changé en premier
counter ++;
direction = true;
}
else {
// Sinon, Pin_DT a changé en premier
direction = false;
counter--;
}
delay(300);
Serial.println("Rotation détectée");
Serial.print("Sens de rotation: ");
if (direction) Serial.println ("Dans le sens des aiguilles d'une montre");
else Serial.println("Dans le sens inverse des aiguilles d'une montre");
Serial.print("Position actuelle: ");
Serial.println(counter);
Serial.println("------------------------------");
}
// Préparation pour le passage suivant :
// La valeur du passage actuel est la valeur précédente lors du passage suivant
pin_clk_last = pin_clk_current;
// Fonction de réinitialisation pour enregistrer la position actuelle
if (!digitalRead(button_pin) && counter!=0) {
counter = 0;
Serial.println("Position réinitialisée");
}
}
Le commutateur rotatif codé (Rotary Encoder) émet le sens du mouvement et la position actuelle du commutateur via ses sorties lorsqu'il est tourné.
À chaque étape, l'état des deux sorties change, ce qui permet de déterminer le sens de rotation. Le sens de rotation est déterminé par l'ordre des changements d'état des sorties : Selon la sortie qui change d'état en premier, il est possible de savoir si le commutateur est tourné dans le sens des aiguilles d'une montre ou dans le sens inverse.
Ce commutateur rotatif est idéal pour les applications qui nécessitent des informations précises sur la position et le mouvement, comme les interfaces utilisateur pour les appareils électroniques, les commandes de machines ou les systèmes de mesure de rotation. Il permet une saisie précise et fiable et constitue un composant polyvalent pour de nombreux projets.
Affectation des broches
Raspberry Pi | Capteur |
---|---|
GPIO 14 [Pin 8] | Bouton |
3,3V [Pin 1] | +V |
GND [Pin 6] | GND |
GPIO 16 [Pin 36] | CLK |
GPIO 15 [Pin 10] | DT |
Exemple de code
Si un changement d'état de la broche s'est produit, le programme vérifie laquelle des deux broches a changé en premier, ce qui indique le sens de rotation. Cette information est obtenue en comparant l'une des deux valeurs de la broche d'une manche précédente avec la valeur de la manche actuelle.
Une fois la direction déterminée, les pas depuis la position de départ sont comptés et édités. Appuyer sur le bouton de l'encodeur réinitialise la position actuelle.
import time
from gpiozero import Button
# Initialisation des broches du codeur rotatif
clk = Button(16, pull_up=True)
dt = Button(15, pull_up=True)
reset_button = Button(14, pull_up=True) # Bouton de remise à zéro du compteur
last_clk_state = clk.is_pressed # Sauvegarde le dernier état de CLK
# Initialiser le compteur
counter = 0
def read_encoder():
global last_clk_state, counter
while True:
current_clk_state = clk.is_pressed
if current_clk_state != last_clk_state: # Reconnaître un changement d'état
if current_clk_state:
if dt.is_pressed != current_clk_state:
counter += 1 # Rotation dans le sens des aiguilles d'une montre
direction = "Dans le sens des aiguilles d'une montre"
else:
counter -= 1 # Rotation dans le sens inverse des aiguilles d'une montre
direction = "Dans le sens inverse des aiguilles d'une montre"
print(f"Sens de rotation: {direction}")
print(f"Position actuelle: {counter}")
print("------------------------------")
last_clk_state = current_clk_state
time.sleep(0.001) # courte pause pour économiser le temps de l'unité centrale
def reset_counter():
global counter
counter = 0
print("Contre-réinitialisation !")
print("------------------------------")
# Ajouter un gestionnaire d'événement pour le bouton de réinitialisation
reset_button.when_pressed = reset_counter
print("Test du capteur [appuyez sur CTRL+C pour terminer le test]")
try:
read_encoder() # Lancer la fonction de lecture du codeur
except KeyboardInterrupt:
print("Le programme a été interrompu par l'utilisateur")
Le commutateur rotatif codé (Rotary Encoder) émet le sens du mouvement et la position actuelle du commutateur via ses sorties lorsqu'il est tourné.
À chaque étape, l'état des deux sorties change, ce qui permet de déterminer le sens de rotation. Le sens de rotation est déterminé par l'ordre des changements d'état des sorties : Selon la sortie qui change d'état en premier, il est possible de savoir si le commutateur est tourné dans le sens des aiguilles d'une montre ou dans le sens inverse.
Ce commutateur rotatif est idéal pour les applications qui nécessitent des informations précises sur la position et le mouvement, comme les interfaces utilisateur pour les appareils électroniques, les commandes de machines ou les systèmes de mesure de rotation. Il permet une saisie précise et fiable et constitue un composant polyvalent pour de nombreux projets.
Affectation des broches
Micro:Bit | Capteur |
---|---|
3V | +V |
GND | GND |
Pin 1 | CLK |
Pin 2 | DT |
Pin 0 | Bouton |
Exemple de code
C'est un exemple MakeCode pour Micro:Bit qui fait essentiellement la même chose que les exemples pour les deux autres variantes. Cependant, cet exemple est plus proche de celui du Raspberry Pi que de celui de l'Arduino.
function RotaryEncoder () {
CLKAKTUELL = pins.digitalReadPin(DigitalPin.P1)
if (CLKAKTUELL != CLKLETZTE) {
if (pins.digitalReadPin(DigitalPin.P2) != CLKAKTUELL) {
Richtung = 1
} else {
Richtung = 0
}
serial.writeLine("Drehung Erkannt: ")
if (Richtung == 1) {
POS += -1
POSLETZTE = POS
serial.writeLine("Drehrichtung: Gegen den Uhrzeigersinn")
} else {
POS += 1
POSLETZTE = POS
serial.writeLine("Drehrichtung: Im Uhrzeigersinn")
}
serial.writeLine("Aktuelle Position: ")
serial.writeLine("" + (POS))
}
if (POS != VORHERIGEPOS) {
serial.writeLine("" + (POS))
VORHERIGEPOS = POS
}
}
pins.onPulsed(DigitalPin.P2, PulseValue.High, function () {
RotaryEncoder()
})
pins.onPulsed(DigitalPin.P2, PulseValue.Low, function () {
RotaryEncoder()
})
pins.onPulsed(DigitalPin.P0, PulseValue.Low, function () {
Reset()
})
function Reset () {
basic.pause(100)
CLKLETZTE = CLKAKTUELL
POS = 0
}
let VORHERIGEPOS = 0
let POSLETZTE = 0
let POS = 0
let Richtung = 0
let CLKAKTUELL = 0
let CLKLETZTE = 0
CLKLETZTE = 0
CLKAKTUELL = 0
Richtung = 1
CLKLETZTE = pins.digitalReadPin(DigitalPin.P1)
POS = 0
POSLETZTE = 0
pins.setPull(DigitalPin.P0, PinPullMode.PullUp)
pins.setPull(DigitalPin.P1, PinPullMode.PullUp)
pins.setPull(DigitalPin.P2, PinPullMode.PullUp)
Téléchargement d'un exemple de programme
Le commutateur rotatif codé (Rotary Encoder) émet le sens du mouvement et la position actuelle du commutateur via ses sorties lorsqu'il est tourné.
À chaque étape, l'état des deux sorties change, ce qui permet de déterminer le sens de rotation. Le sens de rotation est déterminé par l'ordre des changements d'état des sorties : Selon la sortie qui change d'état en premier, il est possible de savoir si le commutateur est tourné dans le sens des aiguilles d'une montre ou dans le sens inverse.
Ce commutateur rotatif est idéal pour les applications qui nécessitent des informations précises sur la position et le mouvement, comme les interfaces utilisateur pour les appareils électroniques, les commandes de machines ou les systèmes de mesure de rotation. Il permet une saisie précise et fiable et constitue un composant polyvalent pour de nombreux projets.
Affectation des broches
Raspberry Pi Pico | Capteur |
---|---|
5 V | +V |
GND | GND |
GPIO16 | CLK |
GPIO17 | DT |
GPIO18 | SW |
Exemple de code
Le programme type vérifie le changement d'état des broches et détermine le sens de rotation dès qu'une rotation a été détectée. Une fois le sens déterminé, les pas depuis la position de départ sont comptés et émis. Une pression sur le bouton remet le comptage à zéro.
Pour charger l'exemple de code suivant sur votre Pico, nous vous recommandons d'utiliser l'IDE Thonny. Il vous suffit de commencer par sélectionner Run > Configure interpreter ... > Interpreter > Which kind of interpreter should Thonny use for running your code? > MicroPython (Raspberry Pi Pico).
Copiez maintenant le code ci-dessous dans votre IDE et cliquez sur Run.
# Charger des bibliothèques
from machine import Pin
from time import sleep
# Initialisation de GPIO16, GPIO17 et GPIO18 comme entrée
CLK = Pin(16,Pin.IN, Pin.PULL_DOWN)
DT = Pin(17,Pin.IN, Pin.PULL_DOWN)
SW = Pin(18,Pin.IN, Pin.PULL_UP)
# Définition des variables
counter = 0
clk_last = CLK.value()
clk_current = 0
direction = True
print("KY-040 Test du codeur rotatif")
print("-------------------------------------------")
def output():
global clk_current, counter, direction
# Lecture de l'état actuel
clk_current = CLK.value()
# Vérification de la modification
if clk_current != clk_last:
# Pin_CLK a changé en premier
if DT.value() != clk_current:
counter = counter + 1
direction = True
# Sinon, Pin_DT a changé en premier
else:
direction = False
counter = counter - 1
print("rotation détectée : ")
if direction:
print("Sens de rotation : dans le sens des aiguilles d'une montre")
else:
print("Sens de rotation : sens inverse des aiguilles d'une montre")
print("Position actuelle : " + str(counter))
print("-------------------------------------------")
# Fonction : La variable compteur est remise à zéro lorsque le bouton est pressé.
def counterReset():
global counter
if SW.value() == 0:
print("Position réinitialisée !")
print("-----------------------")
counter = 0
sleep(0.5)
# Boucle sans fin pour une lecture constante du capteur
while True:
output()
clk_last = clk_current
counterReset()