なんかハマったのでメモ。
(最近はまたメインで使うおもちゃはラズパイ zero に戻ってます。
USB-OTGで一本でつながるの便利だし、OSのアップデートもちゃんとあるし、そこそこ安いし、ノウハウもネットに転がりすぎ...)
さて、本題。あるオモチャにロータリエンコーダをつけてみようと思ってブレッドボードで組んでみた。
イチから書くのもめんどくさいのでネットにあるやつをコピペして試してみたけど、全然うまくいかない。チャタってるのかと思ってコンデンサやらガード定数を変えてもうまく行かない。コードを見てみるとA,Bの波形が50%の方形で均等に出て、しかもABの両方の両エッジでカウントするようになっていた。つまり1デテントごとに4カウント。この想定は私の使ってるエンコーダとはあってなかった。私の買ったのは、BournsのPEC11シリーズのもので、1デテントごとにA,Bにパルスがちょっと出て、その位相がずれているというものだった。
というわけで書き直し。Aのライジングエッジのみで割り込みがかかり、その割り込み時にBの信号を読み、0だったら左回転、1だったら右回転とみなせばいいだけだった。
enc.py
#!/usr/bin/python
import time
import RPi.GPIO as GPIO
# GPIO pin assign
REa= 17
REb= 27
re=0
def callback(callback):
global re
if (GPIO.input(REa) == 1) :
if (GPIO.input(REb) ==1 ):
re=re+1
else:
re=re-1
print(re)
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(REa, GPIO.IN)
GPIO.setup(REb, GPIO.IN)
GPIO.add_event_detect(REa, GPIO.RISING, callback=callback, bouncetime=5)
try:
while(True):
time.sleep(0.1)
except KeyboardInterrupt:
print("break")
GPIO.cleanup()