obs
Novembre 1, 2019, 11:27
1
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 n’hésitez pas
EDIT, montage fonctionnel (voir plus bas)
mais ai-je besoin dans le montage de Résistance ?
merci
jelopo
Novembre 1, 2019, 4:40
2
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+
obs
Novembre 1, 2019, 4:54
3
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 »)
jelopo
Novembre 2, 2019, 8:09
4
Bonjour,
Non a priori pas besoin de résistances car tu as activé les pull-up internes.
A+
obs
Novembre 2, 2019, 8:27
5
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
jelopo
Novembre 2, 2019, 8:33
6
Bonjour,
Pour éviter les rebonds, tu peux mettre un condensateur de 10nF environ entre la masse et les entrées GPIO.
A+
obs
Novembre 2, 2019, 8:35
7
Merci je vais test cela de suite
EDIT
Euuh désoler de cette question bete mais une condensateur de 10nf c’est ça ?
jelopo
Novembre 2, 2019, 1:44
8
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+
obs
Novembre 2, 2019, 4:29
9
Merci pour la précision
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
Merci pour l’aide
stef-k
Novembre 2, 2019, 10:05
10
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…)
stef-k
Novembre 2, 2019, 10:07
11
Un condensateur de 10 nano Farad
1 « J'aime »
jelopo
Novembre 3, 2019, 3:53
12
Bonjour,
@stef-k
Merci de la précision, je m’étais trompé entre résistance et condensateur, j’ai corrigé le post.
A+