2017年1月9日月曜日

RaspberryPi + Python でロータリエンコーダを制御してみた

概要

前回は RaspberryPi + C 言語でロータリエンコーダを制御してみました
今回は Python スクリプトで制御してみました
配線やバージョン情報は前回と同じです

環境

スクリプト

  • 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 でも動かしてみるのが目的だったのでループで実装しました

参考サイト

3 件のコメント:

  1. プログラム初心者です。スクリプトを使用させて頂いたのですが、そこから値を表示させる方法がイマイチ分からないです。enc-test.pyの使用方法を教えて頂けないでしょうか?

    返信削除
  2. すいません…勘違いでした。ごめんなさい

    返信削除
  3. あ、自己解決しましたか。よかったです。
    出力は loop 内で print 'globalCounter = %d' % globalCounter しているだけなので、そこに入っていなかっただけかなと思います。

    返信削除