RaspberryPi ZeroでソフトウェアPWM

ラズパイにはハードウェアでPWM(Pulse Width Modulation)がありますが、
試しにPWMをソフトウェアで構築してみました。
先に言います。ダメです。
色々と調整はしてみましたがシビアなタイミング。ラズパイの苦手なトコロですね。
動画とソース置いておきます。

import RPi.GPIO as GPIO
import time

pcnt = [  0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
bar  = [ 31,33,35,37,26,40,38,36,24,32 ]    # BAR-LED : Use GPIO(PIN.#)
########################################################################
# GPIO INIT.
GPIO.setmode(GPIO.BOARD)
GPIO.setup (bar,GPIO.OUT)
GPIO.output(bar,GPIO.LOW)  
########################################################################
def ctrlLED():
    for lp in range(len(bar)):
        if pcnt[lp]:
            pcnt[lp] -= 3
            if pcnt[lp] < 0:
                pcnt[lp] = 0
########################################################################
def onLED(no):
    pcnt[no] = 30
########################################################################
def dutyLED():
    num = len(bar)
    for j in range(num):
        sf = 0
        for i in range(30):
            if pcnt[j] == 0:
                GPIO.output(bar[j],GPIO.LOW)
                break
            elif sf == 0:
                GPIO.output(bar[j],GPIO.HIGH)
                sf = 1
            elif (pcnt[j] < i) and (sf == 1):
                GPIO.output(bar[j],GPIO.LOW)
                sf = 2
            time.sleep(0.00001)
########################################################################

LedNum = 0
LRFlag = 0
try:
    for i in range(300):
        onLED(LedNum)
        ctrlLED()
        dutyLED()

        if i % 3 == 0:
            if LRFlag == 0:
                LedNum += 1;
                if LedNum == 9:
                    LRFlag = 1
            else:
                LedNum -= 1;
                if LedNum == 0:
                    LRFlag = 0

except KeyboardInterrupt:
    pass

GPIO.cleanup()
print("End.")
# EOF

コメント

タイトルとURLをコピーしました