Aide montage Encodeur sur GPIO

Bonjour
j’essai de faire fonctionner un Encodeur de type EC11 à 5 broches.

dans mon montage j’ai brancher directement les broches au GPIO, je pense qu’il manque des condensateurs et/ou des résistances.

j’ai pas vraiment de notion d’électronique. Alors si vous avez des exemple ou des conseil pour faire fonctionner mon petite montage :slight_smile: n’hésitez pas

EDIT, montage fonctionnel (voir plus bas)
mais ai-je besoin dans le montage de Résistance ?

merci

Bonjour,

Visiblement, c’est un problème de câblage. Je pense qu’il faut identifier les broches du bouton poussoir avec un multimètre en position ohm-mètres d’une part et le commun et les sorties d’autre part.
Dans tous les cas au minimum une résistance pour éviter les courts-circuits et le risque de griller les ports GPIO et de ce fait le PI.

Bon courage.

A+

EDIT:
j’ai réussi à câbler mon encodeur, et à récupérer les infos via un script

voila ce que j’ai fait :

Ma question est, est-je besoin dans ce montage de résistance ?

le Script:

Résumé

from time import sleep
import RPi.GPIO as GPIO

SW = 26
DT = 20
CLK = 21

##################################
######### CLASS ##################

class Encoder:
CLOCKWISE=1
ANTICLOCKWISE=2
BUTTONDOWN=3
BUTTONUP=4

rotary_a = 0
rotary_b = 0
rotary_c = 0
last_state = 0
direction = 0

# Initialise objet encoder
def __init__(self,pinA,pinB,button,callback):
    self.pinA = pinA
    self.pinB = pinB
    self.button = button
    self.callback = callback

    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)
    GPIO.setup(self.pinA, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    GPIO.setup(self.pinB, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    GPIO.setup(self.button, GPIO.IN, pull_up_down=GPIO.PUD_UP)


    GPIO.add_event_detect(self.pinA, GPIO.FALLING, callback=self.switch_event)
    GPIO.add_event_detect(self.pinB, GPIO.FALLING, callback=self.switch_event)
    GPIO.add_event_detect(self.button, GPIO.BOTH, callback=self.button_event, bouncetime=200)
    return


def switch_event(self,switch):
    if GPIO.input(self.pinA):
        self.rotary_a = 1
    else:
        self.rotary_a = 0

    if GPIO.input(self.pinB):
        self.rotary_b = 1
    else:
        self.rotary_b = 0

    self.rotary_c = self.rotary_a ^ self.rotary_b
    new_state = self.rotary_a * 4 + self.rotary_b * 2 + self.rotary_c * 1
    delta = (new_state - self.last_state) % 4
    self.last_state = new_state
    event = 0

    if delta == 1:
        if self.direction == self.CLOCKWISE:
            event = self.direction
        else:
            self.direction = self.CLOCKWISE
    elif delta == 3:
        if self.direction == self.ANTICLOCKWISE:
            event = self.direction
        else:
            self.direction = self.ANTICLOCKWISE
    if event > 0:
        self.callback(event)
    return



def button_event(self,button):
    if GPIO.input(button): 
        event = self.BUTTONUP 
    else:
        event = self.BUTTONDOWN 
    self.callback(event)
    return


def getSwitchState(self, switch):
    return  GPIO.input(switch)

##################################
######### FONCTION ###############

def switch_event(event):
if event == Encoder.CLOCKWISE:
print(« Plus »)
sleep(.2)
elif event == Encoder.ANTICLOCKWISE:
print(« Moins »)
sleep(.2)
elif event == Encoder.BUTTONDOWN:
print(« Valider »)
return

##################################
######### PROGRAMME ##############

rswitch = Encoder(CLK,DT,SW,switch_event)

try:
print(« Le programme fonctionne. »)
sleep(120)

except KeyboardInterrupt:
print("\nInterruption par clavier.")

finally:
print(« On arrete tout »)

Bonjour,

Non a priori pas besoin de résistances car tu as activé les pull-up internes.

A+

Merci,
je me posai la question car j’ai souvent des rebond (double ou triple incrémentation) lorsque je passe 1 cran

je pensais aussi utiliser 2 encodeur dans mon projet à terme. et apres quelque test, avec 2, j’ai systématiquement des rebond

Bonjour,

Pour éviter les rebonds, tu peux mettre un condensateur de 10nF environ entre la masse et les entrées GPIO.

A+

Merci je vais test cela de suite :wink:
EDIT
Euuh désoler de cette question bete mais une condensateur de 10nf c’est ça ?

Oui, c’est ça.

103 = 10 et 3 zero = 10 000pf = 10nF

Bon après, pour cet usage c’est de l’ordre de 10nF, de 1nF à 100nF ça devrait faire l’affaire.
A+

Merci pour la précision :wink:

pour le moment mon montage (sans condensateur fonctionne avec 2 encodeur, quand le Raspberry pi zero est froid.
pas de rebond, comportement normal…lorsque je lance une 1er fois le script.

par contre une fois « chaud » disons 10mn de fonctionnement, après plusieurs relance du script (édition, test, debug…) j’ai des gros problème de rebond voir de programme qui fonctionne plus.

je pense que je ne dois pas bien finir mon script, la « fermeture » des GPIO doit pas être faite…je vais faire une recherche sur le sujet, sinon je ne vois pas pourquoi
Edit
un petit :
GPIO.cleanup()
et ça a l’aire deja mieux… test à renouveler sur la longueur, et puis mis en place des résistance :wink:

Merci pour l’aide

Salut,
Juste pour rectifier, la valeur d une résistance s’exprime en ohm et celle d’un condensateur, en farad.
Après peut importe son unité (nano, micro, entier…)

Un condensateur de 10 nano Farad

1 J'aime

Bonjour,
@stef-k
Merci de la précision, je m’étais trompé entre résistance et condensateur, j’ai corrigé le post.
A+