#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pigpio
from time import sleep
import sys
import threading
# Led制御
"""
指定した色全部が同時に点滅調光するモード
指定した色を順番に点滅調光するモード
r:赤、g:緑、b:青(GPIO番号指定、点灯しない場合は、0(ゼロ指定))
ton:点灯時間、toff:消灯時間(秒)
duc:dutyサイクル指定(1〜100指定)
v:調光有無指定、0:調光無し、1:調光有り
c:同時点灯、順番点灯指定、0:同時点灯調光、1:順番点灯調光
"""
class LedThread(threading.Thread): # スレッドを立ち上げてサーボを駆動
def __init__(self,r,g,b,ton,toff,duc,v,c):
super(LedThread, self).__init__()
self.r = r # 赤
self.g = g # 緑
self.b = b # 青
self.ton = ton # 点灯時間
self.toff = toff # 消灯時間
self.duc = duc # dutyサイクル(1~100指定)
self.v = v # 調光有無指定、0:調光無し、1:調光有り
self.c = c # 同時点灯、順番点灯指定、0:同時点灯調光、1:順番点灯調光
self.stop_event = threading.Event()
self.setDaemon(True)
self.pi = pigpio.pi()
self.list = [self.r,self.g,self.b]
self.rgblist = []
for p in self.list:
if p != 0:
self.rgblist.append(p)
def stop(self):
self.stop_event.set()
for p in self.rgblist:
self.pi.set_mode(p, pigpio.INPUT)
self.pi.stop()
def run(self):
if not ((4 <= self.r <= 27) or (self.r == 0)):
return False
if not ((4 <= self.g <= 27) or (self.g == 0)):
return False
if not ((4 <= self.b <= 27) or (self.b == 0)):
return False
FREQ = 200 # PWM周波数 200Hz
RANGE = 100 # PWM最大値 100
for p in self.rgblist:
self.pi.set_mode(p, pigpio.OUTPUT)
for p in self.rgblist:
self.pi.set_PWM_frequency(p, FREQ)
for p in self.rgblist:
self.pi.set_PWM_range(p, RANGE)
d = 0
dc = self.duc
if self.v == 0: # 調光無しか?
dc = RANGE # dc=RANGEの時は調光なしの点滅
if self.c == 0: # 同時点滅調光モード
while not self.stop_event.is_set():
for p in self.rgblist:
self.pi.set_PWM_dutycycle(p, d)
sleep(self.ton)
for p in self.rgblist:
self.pi.set_PWM_dutycycle(p, 0)
sleep(self.toff)
d += dc
if d >= RANGE or d <= 0:
dc *= -1
if d > RANGE:
d = RANGE
if d < 0:
d = 0
elif self.c == 1: # 順番点滅調光モード
while not self.stop_event.is_set():
for p in range(len(self.rgblist)):
self.pi.set_PWM_dutycycle(self.rgblist[p], d)
sleep(self.ton)
self.pi.set_PWM_dutycycle(self.rgblist[p], 0)
sleep(self.toff)
d += dc
if d >= RANGE or d <= 0:
dc *= -1
if d > RANGE:
d = RANGE
if d < 0:
d = 0
if __name__ == '__main__':
Led = LedThread(r=25,g=21,b=19,ton=0.8,toff=0.3,duc=5,v=1,c=1) # Led制御スレッドインスタンス
#Led = LedThread(r=25,g=21,b=19,ton=0.8,toff=0.3,duc=5,v=0,c=0) # Led制御スレッドインスタンス
Led.start() # Led制御開始
sleep(9) # ロボットの何らかの動作。例えば、「会話」中にLedで表情を表現する。
Led.stop() # Led制御停止
sys.exit()