KY-040 Module encodeur rotatif

De SensorKit X40 Wiki

Aller à : navigation, rechercher

Photo

ky-040.jpg

Données techniques / Description sommaire

La sortie codée de l'encodeur donne la position de celui-ci.

Codage

Un encodeur rotatif délivre deux signaux décalés de 90°. Ceci permet de connaître de sens de rotation en comparant les mouvements des 2 signaux. Si on fait bouger l'encodeur d'un seul cran, un seul des 2 signaux sera modifié. 

Sens des aiguilles d'une montre [A change en premier] -> Pin_CLK

A B
0 0
1 0
1 1
0 1
0 0


Sens contraire des aiguilles d'une montre [B change en premier] -> Pin_DT

A B
0 0
0 1
1 1
1 0
0 0

Brochage

5 CLK DT SW V G.png

Exemple de code pour Arduino

Le programme vérifie si un changement des états des broches a eu lieu, et selon la broche qui est modifiée en premier, détermine le sens de rotation.

Cette information est obtenue par la comparaison des signaux présents sur les 2 sorties.

Une fois que la direction a été déterminée, on compte les mouvements depuis la position de départ et on les envoie vers la sortie série.

Une pression sur le bouton de l'encodeur réinitialise la position actuelle.

Pour la sortie série: Baudrate= 115200

// Initialisation des variables nécessaires
int Compteur = 0; 
boolean Direction;
int Pin_clk_Letzter;  
int Pin_clk_Aktuell;

// Définition des broches d'entrées
int pin_clk = 3;  
int pin_dt = 4; 
int button_pin = 5;
 
 
void setup() 
{ 
   // Initialisation des broches d'entrées...
   pinMode (pin_clk,INPUT);
   pinMode (pin_dt,INPUT);
   pinMode (button_pin,INPUT);
   
   // ...et activation de leurs résistances de PULL-UP
   digitalWrite(pin_clk, true);
   digitalWrite(pin_dt, true);
   digitalWrite(button_pin, true);
   
   // Lecture initiale de Pin_CLK
   Pin_clk_Letzter = digitalRead(pin_clk);   
   Serial.begin (115200);
 } 

// Le programme vérifie si un changement des états des broches a eu lieu, 
// et selon la broche qui est modifiée en premier, détermine le sens de rotation.
// Cette information est obtenue par la comparaison des signaux présents sur les 2 sorties.
// Une fois que la direction a été déterminée, on compte les mouvements depuis la position
// de départ et on les envoie vers la sortie série.
// Une pression sur le bouton de l'encodeur réinitialise la position actuelle.

void loop()
{ 
   // Lecture des statuts actuels
   Pin_clk_Aktuell = digitalRead(pin_clk);
   
   // Vérification de changement
   if (Pin_clk_Aktuell != Pin_clk_Letzter)
   { 
		 
		if (digitalRead(pin_dt) != Pin_clk_Aktuell) 
		{  
			// Pin_CLK a changé en premier
			Compteur ++;
			Direction = true;
		} 
		 
		else 
		{       // Sinon Pin_DT achangé en premier
			Direction = false;
			Compteur--;
		}
		Serial.println ("Rotation detectee: ");
		Serial.print ("Sens de rotation: ");
		
		if (Direction)
		{
		   Serial.println ("dans le sens des aiguilles d'une montre");
		}
		else
		{
		   Serial.println("dans le sens contraire des aiguilles d'une montre");
		}
		
		Serial.print("Position actuelle: ");
		Serial.println(Compteur);
		Serial.println("------------------------------");
		 
   } 
   
   // Préparation de la prochaine exécution:
   Pin_clk_Letzter = Pin_clk_Aktuell;
   
   // fonction Reset remise à la position actuelle
   if (!digitalRead(button_pin) && Compteur!=0)
     {
       Compteur = 0;
       Serial.println("Position reset");
     }
     
 } 

Affectation des broches Arduino:

CLK = [Pin 3]
DT = [Pin 4]
SW = Boutton = [Pin 5]
+ = [Pin 5V]
GND = [Pin GND]

Exemple de programme à télécharger

KY-040.zip

Exemple de code pour Raspberry Pi

Le programme vérifie si un changement des états des broches a eu lieu, et selon la broche qui est modifiée en premier, détermine le sens de rotation.

Cette information est obtenue par la comparaison des signaux présents sur les 2 sorties.

Une fois que la direction a été déterminée, on compte les mouvements depuis la position de départ et on les envoie vers la sortie série.

Une pression sur le bouton de l'encodeur réinitialise la position actuelle.

#!/usr/bin/python
# coding=utf-8

# Les modules nécessaires sont importés et mis en place
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

# Déclaration des broches d'entrée auxquelles est raccordé le capteur
PIN_CLK = 16
PIN_DT = 15
BUTTON_PIN = 14

GPIO.setup(PIN_CLK, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(PIN_DT, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down = GPIO.PUD_UP)

# Les variables nécessaires sont initialisées
Counter = 0
Direction = True
PIN_CLK_LETZTER = 0
PIN_CLK_AKTUELL = 0
delayTime = 0.01

# Lecture initiale de Pin_CLK
PIN_CLK_LETZTER = GPIO.input(PIN_CLK)

# Cette fonction de sortie est exécutée par détection d'un signal
def ausgabeFunktion(null):
    global Counter

    PIN_CLK_AKTUELL = GPIO.input(PIN_CLK)

    if PIN_CLK_AKTUELL != PIN_CLK_LETZTER:

        if GPIO.input(PIN_DT) != PIN_CLK_AKTUELL:
            Counter += 1
            Direction = True;
        else:
            Direction = False
            Counter = Counter - 1

        print "Rotation détectée: "

        if Direction:
            print "Sens de rotation: sens des aiguilles d'une montre"
        else:
            print "Sens de rotation: sens contraire des aiguilles d'une montre"

        print "Position actuelle: ", Counter
        print "------------------------------"

def CounterReset(null):
    global Counter

    print "Position remise à 0!"
    print "------------------------------"
    Counter = 0

# Pour intégrer directement un temps de stabilisation, on initialise
# les GPIO au moyen de l'option CallBack
GPIO.add_event_detect(PIN_CLK, GPIO.BOTH, callback=ausgabeFunktion, bouncetime=50)
GPIO.add_event_detect(BUTTON_PIN, GPIO.FALLING, callback=CounterReset, bouncetime=50)


print "Sensor-Test [Appuyez sur Ctrl + C pour terminer le test]"

# Boucle de programme principale
try:
        while True:
            time.sleep(delayTime)

# réinitialisation de tous les GPIO en entrées
except KeyboardInterrupt:
        GPIO.cleanup()


Brochage Raspberry Pi:

CLK = GPIO16 [Pin 36]
DT = GPIO15 [Pin 10]
SW = GPIO14 [Pin 8]
+ = 3,3V [Pin 1]
GND = Masse [Pin 6]

Exemple de programme à télécharger

KY-040_RPi_RotaryEncoder.zip

Commande pour lancer le programme:

sudo python KY-040_RPi_RotaryEncoder.py