ボリューム制御プログラムの結線図です。
ロータリーエンコーダーは1回転20パルスのものを使用しました。ロータリーエンコーダーとラズパイの接続はチャタリング対策で抵抗やらコンデンサーが必要ですが、無くても反応に問題なかったので対策してません。
参考にさせて頂いたJH7UBCさんのページです。
Raspberry Pi Pico Micro Python ロータリーエンコーダ テスト - JH7UBCブログ (goo.ne.jp)
以下、プログラムサンプルです。
---------------------------------------------------------------------------------------
# ロータリーエンコーダーのPWMボリュームテスト
import utime
from machine import Pin, PWM
# Switch
sw_ena = Pin(13,Pin.IN,Pin.PULL_DOWN)#モーター電源ENA
sw_dir_cw = Pin(14,Pin.IN,Pin.PULL_DOWN)#回転方向DIR cw
sw_dir_ccw = Pin(15,Pin.IN,Pin.PULL_DOWN)#回転方向DIR ccw
#ロータリーエンコーダーのA,B端子 プルアップ
pinA = Pin(16, Pin.IN, Pin.PULL_UP)
pinB = Pin(17, Pin.IN, Pin.PULL_UP)
#ステッピングモーターの信号
tHz=10#pwm周波数の初期設定(0Hzはエラーになるので10で設定して0に初期化する)
M1_pul =PWM(Pin(2))#PUL パルス信号 PWM機能に設定
M1_pul.freq(tHz)#PWM周波数を設定
M1_pul.duty_u16(32768)#duty比を50%に設定
M1_dir = Pin(3,Pin.OUT)#DIR 方向信号
M1_enr = Pin(4,Pin.OUT)#ENR モーター電源信号
tHz_setnum=50#周波数の増減単位数(?Hz毎に増減)
tHz_U=2000#周波数の上限値
tHz_L=0#周波数の下限値
#回転方向判定初期値
befDat = 0x11
curDat = 0
count = 0
D = 0
#回転方向判定
def watchRotation_Hz(p):
global curDat
global befDat
global count
global tHz_unit
curDat = pinA.value() + (pinB.value()<<1)
if curDat != befDat:
D = ((befDat<<1)^curDat) & 3
if D < 2:
count = count + 1
else:
count = count -1
befDat = curDat
if count >= 3:
print('ASC')
tHz_unit = tHz_setnum
count = 0
elif count <= -3:
print('DESC')
tHz_unit = -tHz_setnum
count = 0
#tHz_unitからPWM周波数の上限,下限を設定する
def getHz(tempHz, d):
tempHz += d
if tempHz > tHz_U:
tempHz = tHz_U
elif tempHz < tHz_L:
tempHz = tHz_L
return tempHz
pinA.irq(trigger=Pin.IRQ_FALLING | Pin.IRQ_RISING, handler = watchRotation_Hz)
pinB.irq(trigger=Pin.IRQ_FALLING | Pin.IRQ_RISING, handler = watchRotation_Hz)
tHz_unit=0#パルス周波数増減値を初期化
tHz=0#pwm周波数を初期化
while True:
#モーター電源のON,OFFを取得
# P3(1)
# P2(1)
#周波数を取得
if tHz_unit != 0:
tHz= getHz(tHz, tHz_unit)
print('tHz =' + str(tHz))
tHz_unit = 0 #dirctionのクリア
#回転方向を取得
if sw_dir_cw()==1:
M1_enr(1)
M1_dir(0)
if sw_dir_ccw()==1:
M1_enr(1)
M1_dir(1)
if sw_dir_cw()==0 and sw_dir_ccw()==0:
M1_enr(0)
#モーターを駆動
if tHz >= 10:
#10Hz以上はduty比50%で動作
M1_pul.duty_u16(32768)#duty比を50%に設定
M1_pul.freq(tHz)#PWM周波数を設定
elif tHz <10:
#7Hz以下は動作しないのでduty比0%にして停止
M1_pul.duty_u16(0)#duty比を0%に設定
コメント
コメントを投稿