1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ラズパイでロータリエンコーダ

Posted at

なんかハマったのでメモ。

(最近はまたメインで使うおもちゃはラズパイ 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()
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?