Ledの点滅・調光でロボットの喜怒哀楽を表現
Led汎用制御関数を作成した。
スレッドで動作する。
パラメーター:
指定した色全部が同時に点滅調光するモード
指定した色を順番に点滅調光するモード
の2つのモードがある。
点灯するLedは、複数設定可能。
本コードでは、3つのLedを設定している。
r:赤、g:緑、b:青(GPIO番号指定、点灯しない場合は、0(ゼロ指定))
ton:点灯時間、toff:消灯時間(秒)
duc:dutyサイクル指定(1〜100指定)
v:調光有無指定、0:調光無し、1:調光有り
c:同時点灯、順番点灯指定、0:同時点灯調光、1:順番点灯調光
本関数は、複数ロボット会話システムで使用するために作成した。
ロボットは性別があり、男性ロボット、女性ロボットを識別し、Ledの制御で性別の表情を実現する。
ロボットの会話の内容は喜怒哀楽を有しているので、「喜怒哀楽」をLedの制御で表現する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
#!/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() |
群馬プログラミングカレッジでは、複数ロボット会話システムを開発しています。
参加するロボットの数は制限がありません。
1台からn台のロボットが会話します。
ロボットが会話中に各々のロボットの喜怒哀楽をLedで表現するための関数です。
会話中にスレッドを立上げて、Ledを点滅・調光することで、ロボットの喜怒哀楽を表現します。
このシステムの利用シーンは、
ロボットで案内するあらゆるシーンで利用できます。
施設の案内
観光地の案内
店の案内
作品の案内
など
案内する内容は、サーバーに格納しておき、会話時にサーバーからダウンロードして、各々のロボットが会話します。
各ロボットの会話はシステムで同期をとりながら会話をします。
n台のロボットが同時に同じ内容を発話することもできます。
複数ロボット会話システムに興味ある方はご連絡ください。