概要
前回は RaspberryPi + C 言語でロータリエンコーダを制御してみました
今回は Python スクリプトで制御してみました
配線やバージョン情報は前回と同じです
環境
- RaspberryPi Zero rev1.3
- Raspbian 8.0 (Jessie, 4.4.11+ #888)
- LED 付きロータリエンコーダ (EC12PLRVF-D-24K-24-24C-02/06-6)
- ロータリーエンコーダ DIP 化基板
- wiringPi 2.32
- Python 2.7.9
スクリプト
- vim enc_test.py
#!/usr/bin/env python
import RPi.GPIO as GPIO
import time
RoAPin = 11
RoBPin = 12
globalCounter = 0
preGlobalCounter = 0
flag = 0
Last_RoB_Status = 0
Current_RoB_Status = 0
def setup():
GPIO.setmode(GPIO.BOARD)
GPIO.setup(RoAPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(RoBPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
def rotaryDeal():
global globalCounter
global flag
global Last_RoB_Status
global Current_RoB_Status
Last_RoB_Status = GPIO.input(RoBPin)
while (not GPIO.input(RoAPin)):
Current_RoB_Status = GPIO.input(RoBPin)
flag = 1
if flag == 1:
flag = 0
if (Last_RoB_Status == 0) and (Current_RoB_Status == 1):
globalCounter = globalCounter + 1
if (Last_RoB_Status == 1) and (Current_RoB_Status == 0):
globalCounter = globalCounter -1
def loop():
global globalCounter
while True:
preGlobalCounter = globalCounter
rotaryDeal()
if (preGlobalCounter != globalCounter):
print 'globalCounter = %d' % globalCounter
def destroy():
GPIO.cleanup()
if __name__ == '__main__':
setup()
try:
loop()
except KeyboardInterrupt:
destroy()
- python enc_test.py
で実行してロータリエンコーダを回すと以下のようにカウンタの値が表示されると思います
globalCounter = -1
globalCounter = -2
globalCounter = -3
globalCounter = -2
globalCounter = -1
globalCounter = 0
globalCounter = 1
最後に
前回のソースと比べると前回は GPIO の変化のイベントによって割り込み用の関数をコールしていたのですが、今回はループ方式で常に GPIO の値を監視してロータリエンコーダを制御しています
おそらく Python でも GPIO の変化を監視できるので前回と同じような実装は可能だと思います
とりあえず今回は Python でも動かしてみるのが目的だったのでループで実装しました
プログラム初心者です。スクリプトを使用させて頂いたのですが、そこから値を表示させる方法がイマイチ分からないです。enc-test.pyの使用方法を教えて頂けないでしょうか?
返信削除すいません…勘違いでした。ごめんなさい
返信削除あ、自己解決しましたか。よかったです。
返信削除出力は loop 内で print 'globalCounter = %d' % globalCounter しているだけなので、そこに入っていなかっただけかなと思います。