2017年1月6日金曜日

LED 付きのロータリエンコーダを Python で制御してみた

概要

前回 Python でロータリエンコーダを制御しました
せっかく LED 付きのロータリエンコーダなので LED も制御してみました

環境

LED 部分の配線

ロータリエンコーダの配線は前回と同様です
今回は LED を制御する配線も追加したのでそこを紹介します

rpi_renc_with_led_circuit.jpg

写真奥の白いジャンパケーブルを GPIO23 (16 番ピン) に接続し、紫のケーブルを抵抗 470kΩを挟んで GND に接続します

スクリプト

前回の Python でロータリエンコーダを制御したスクリプトを拡張しています
ロータリエンコーダ用のカウンタが 10 で割り切れる値になったときに別スレッドで LED を点滅させます

元のスクリプトがループ実装なので LED の点滅は別スレッドで実行したほうがいいです
ちょっとソースが長いですが、ソースの全容は以下の通りです

#!/usr/bin/env python
import RPi.GPIO as GPIO
import time
import threading

RoAPin = 11
RoBPin = 12
led = 16

globalCounter = 0
preGlobalCounter = 0
flag = 0
Last_RoB_Status = 0
Current_RoB_Status = 0

class LedThread(threading.Thread):

  def __init__(self):
    super(LedThread, self).__init__()

  def run(self):
    print "Turn on the led"
    GPIO.output(led, True)
    time.sleep(0.5)
    GPIO.output(led, False)

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)
  GPIO.setup(led, GPIO.OUT, initial=GPIO.LOW)

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
      if (globalCounter % 10 == 0):
        th = LedThread()
        th.start()

def destroy():
  GPIO.cleanup()

if __name__ == '__main__':
  setup()
  try:
    loop()
  except KeyboardInterrupt:
    destroy()

これで実行してロータリエンコーダを回すと 10, 20 や -10 のときに LED が点滅するはずです

最後に

3 回に渡ってロータリエンコーダの紹介をしてきました
正直、今のところ実ケースでロータリエンコーダを使う場面に出くわしていません
オーディオ機器のボリュームコントロール等によく使われるみたいですが、現状自分の回りのハックではそのようなケースがない状態です

まぁいろいろと便利そうなデバイスではあるので、とりあえず検証できたことは良かったと思います

0 件のコメント:

コメントを投稿