Rotary Encoders What looks like a potentiometer, but isn’t a potentiometer? It’s a Rotary Encoder. Think of a rotary switch with an unlimited number of switch positions. It really isn’t, but it sort of acts like that. While there are many different models of rotary encoders, the particular encoder we will be using in this project is a KY-040. You can get them from many places on the Internet starting for about $3.00 USD. Some come in packs of 5 for $10.00. I borrowed this image from https://opencircuit.shop/product/rotary-encoder-module-ky-40 . There is a pretty good PDF on how the KY-040 works at https://www.epitran.it/ebayDrive/datasheet/25.pdf . The actual encoder has three pins, but the breakout board has 5. One extra feature of the KY-040 is that the shaft can be pressed to provide a momentary Normally Open switch.
Encodeurs rotatifs
Qu'est-ce qui ressemble à un potentiomètre, mais qui n'en est pas un ? C'est un encodeur rotatif.
Imaginez un commutateur rotatif avec un nombre illimité de positions. Ce n'est pas vraiment le cas, mais c'est un peu comme ça qu'il se comporte.
Bien qu'il existe de nombreux modèles différents d'encodeurs rotatifs, l'encodeur particulier que nous utiliserons dans ce projet est un KY-040. Il est possible de s'en procurer à de nombreux endroits sur Internet, à partir de 3,00 $ US. Certains sont vendus par paquets de 5 pour 10,00 $ US. J'ai emprunté cette image à https://opencircuit.shop/product/rotary-encoder-module-ky-40 .
Un bon PDF sur le fonctionnement du KY-040 est disponible à l'adresse suivante : https://www.epitran.it/ebayDrive/datasheet/25.pdf .
L'encodeur proprement dit a trois broches, mais la carte de connexion en a cinq. Une caractéristique supplémentaire du KY-040 est que l'arbre peut être pressé pour fournir un interrupteur momentané normalement ouvert.
The drivers that we’ll need for this project can be found at https://github.com/MikeTeachman/micropython-rotary . Go ahead and download the driver, because we’ll need some of the files in a few minutes. For now, let’s start wiring the breadboard. Now for the code. You need to copy from the rotary encoder driver zip the rotary.py and rotary_irq_rp2.py files to your RPi Pico. Then you need to copy the example_simple.py file from the Examples folder and save it as example_simple_rotary.py onto your Pico as well. This is the file we need to modify (top right). Now we need to add the driver for the SSD1306 (below). Now we need to define all the pins for the rotary encoder. Note that these are the GPIO pins, not the physical pins. I’ve included the GPIO pin numbers to the Physical pin numbers in the table above.
Les pilotes dont nous aurons besoin pour ce projet se trouvent à l'adresse suivante : https://github.com/MikeTeachman/micropython-rotary . Allez-y et téléchargez le pilote, car nous aurons besoin de certains fichiers dans quelques minutes.
Pour l'instant, commençons à câbler la plaque d'essai.
Passons maintenant au code. Vous devez copier les fichiers rotary.py et rotary_irq_rp2.py dans votre RPi Pico à partir du fichier zip du pilote de l'encodeur rotatif. Ensuite, vous devez copier également le fichier example_simple.py du dossier Examples et l'enregistrer sous example_simple_rotary.py sur votre Pico. C'est ce fichier que nous devons modifier (en haut à droite).
Nous devons maintenant ajouter le pilote pour le SSD1306 (ci-dessous).
Puis nous devons définir toutes les broches de l'encodeur rotatif. Notez qu'il s'agit des broches GPIO, et non des broches physiques. J'ai inclus les numéros des broches GPIO aux numéros des broches physiques dans le tableau de la page précédente.
The first line sets the switch for the shaft push momentary switch. The next lines handle the IRQ set ups. We use max_val to define the max number of positions. By setting reverse=True means that turning the shaft clockwise the counter increments and anti-clockwise decrements the counter. Finally range_mode=RANGE_WRAP causes the counter to go from max_val to min_val (bottom right). We keep two values to determine the current value of the encoder. Val_old is set to make sure that we don’t report the same value each time the loop is run. We’ve used the SSD1306 fill, text and show methods before, so I won’t go into depth on those (next page, top right). If you want to use the shaft switch to exit the loop, change the while loop from while True:
La première ligne définit le commutateur pour l'interrupteur momentané de poussée de l'axe. Les lignes suivantes gèrent la configuration des IRQ. Nous utilisons max_val pour définir le nombre maximum de positions. En réglant reverse=True, cela signifie qu'en tournant l'arbre dans le sens des aiguilles d'une montre, le compteur s'incrémente et dans le sens inverse des aiguilles d'une montre, le compteur se décrémente. Enfin, range_mode=RANGE_WRAP fait passer le compteur de max_val à min_val (en bas à droite).
Nous conservons deux valeurs pour déterminer la valeur actuelle du codeur. Val_old est définie pour s'assurer que nous ne reportons pas la même valeur à chaque fois que la boucle est exécutée. Nous avons déjà utilisé les méthodes fill, text et show du SSD1306, je n'entrerai donc pas dans les détails (page suivante, en haut à droite).
Si vous voulez utiliser le commutateur de l'axe pour sortir de la boucle, changez la boucle while de
while True:
To doloop = True while doloop: And then in the if button.value check, add the line doloop = False When you run the program each time you turn the shaft of the encoder the value printout on the OLED should change (and the REPL should show the value). I’ve set up a repository for the project at https://github.com/gregwa1953/MTMT_201 . That’s it for this month. Until next time, HAPPY NEW YEAR and, as always; stay safe, healthy, positive and creative!
en
doloop = True
while doloop:
Et ensuite, dans la vérification if button.value, ajoutez la ligne :
doloop = False
Lorsque vous exécutez le programme, chaque fois que vous tournez l'arbre de l'encodeur, la valeur imprimée sur l'OLED devrait changer (et le REPL devrait afficher la valeur).
J'ai mis en place un dépôt pour le projet à https://github.com/gregwa1953/MTMT_201.
C'est tout pour ce mois-ci.
Jusqu'à la prochaine fois, HEUREUSE NOUVELLE ANNÉE et, comme toujours, restez en sécurité, en bonne santé, positifs et créatifs !