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


コメント