M5Stackの設定
- M5Stack Gray(Core)
- UIFlow_Fire v1.7.5
- UIFlow-Desktop-IDE v1.7.4(Deviceで「Fire」を選択)
※この構成じゃないと、M5Stack Grayで「BLE UART」が使えない。
回転検知とチャタリング対応
プログラムはPythonを利用。参考サイトに倣えば、割と簡単に回転検知はできたが、回転が速くなるとチャタリングが発生して値が不安定になってしまう...この対策が一番の苦労ポイント。
最終的に、一時的に回転方向値(1、-1)をリストに代入。要素数が3つになった時点で配列の合計値の正負を判定し、最終値を決める...という方法で、かなり数値が安定した。 要素数を増やせば精度は上がるが、反応が鈍くなるのが難点。(自分の環境では要素数=3が妥当だった。)
スクリプト(抜粋)
pLastPinA = 1
pLastPinB = 1
pCounter = 0
pValList = []
pLastWay = 0
#ホイール検知処理
def dfRotationAct(p):
global pLastPinA,pLastPinB
global pCounter,pLastWay,pValList
xListLength = 3 #要素数
xStateA = pin1.value()
xStateB = pin2.value()
if xStateA == 1 and pLastPinA == 0:
#回転方向値を一時的にリストに入れる
if pLastPinB == 0 or xStateB == 0:
pValList.append(1)
elif pLastPinB == 1 and xStateB == 1:
pValList.append(-1)
pLastPinB = xStateB
#リストの合計値で最終方向を設定
if len(pValList) == xListLength:
pLastWay = 1
if sum(pValList) < 0:
pLastWay = -1
pValList.clear()
pCounter = pCounter + pLastWay
pLastPinA = xStateA
pass
# 入力ピン設定 #########################
pin1 = machine.Pin(19, mode=machine.Pin.IN, pull=machine.Pin.PULL_UP)
pin2 = machine.Pin(22, mode=machine.Pin.IN, pull=machine.Pin.PULL_UP)
pin1.irq(trigger=machine.Pin.IRQ_FALLING|machine.Pin.IRQ_RISING,handler=dfRotationAct)
pin2.irq(trigger=machine.Pin.IRQ_FALLING|machine.Pin.IRQ_RISING,handler=dfRotationAct)
クランクパーツの作成
エンコーダーの六角形の穴にドンピシャでハマるような都合良い素材も3Dプリンタもないので、1.5mm径のアルミワイヤーを使ってみた。 アルミワイヤーはペンチで簡単に潰せるので、接続部の太さ調整が簡単。これで、とりあえず使えるクランクができた。