ラズパイにはハードウェアで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
コメント