ラズパイpicoの ②ボリューム制御プログラム

 ボリューム制御プログラムの結線図です。

ロータリーエンコーダーは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%に設定


コメント