##------------------------------------------
## Traffic light Program Ver 0.01
## platform: Raspberry pico
##
## 2022.12.05 Masahiro Izutsu
##------------------------------------------
## traffic_light.py
from machine import Pin, PWM, Timer
import utime
# ハードウェア接続
dip_sw0 = machine.Pin(0, Pin.IN, Pin.PULL_UP)
dip_sw1 = machine.Pin(1, Pin.IN, Pin.PULL_UP)
speaker = PWM(Pin(2, Pin.OUT)) # スピーカーを接続しているGPIOをPWM()へ
g_led0 = Pin(6, Pin.OUT) # LED G0 車 A
y_led0 = Pin(7, Pin.OUT) # LED Y0
r_led0 = Pin(8, Pin.OUT) # LED R0
g_led1 = Pin(9, Pin.OUT) # LED G1 車 B
y_led1 = Pin(10, Pin.OUT) # LED Y1
r_led1 = Pin(11, Pin.OUT) # LED R1
g_led2 = Pin(12, Pin.OUT) # LED G2 歩行者 A
r_led2 = Pin(13, Pin.OUT) # LED R2
g_led3 = Pin(14, Pin.OUT) # LED G3 歩行者 B
r_led3 = Pin(15, Pin.OUT) # LED R3
g_led4 = Pin(17, Pin.OUT) # LED G4 歩行者 B
r_led4 = Pin(16, Pin.OUT) # LED R4
# 使用する音の周波数を宣言しておく。ピタゴラスイッチは低いラ~高いドまでの音を使う
A3 = 220
B3 = 246.942
C4 = 261.626
C4s= 277.183
D4 = 293.665
E4 = 329.628
F4 = 349.228
F4s= 369.995
G4 = 391.996
#
A4 = 440
B4 = 493.883
C5 = 523.251
C5s= 554.365
D5 = 587.330
E5 = 659.255
F5 = 698.456
F5s= 739.989
G5 = 783.991
A5 = 880
B5 = 987.767
C6 = 1046.502
#
C6s= 1108.730
D6 = 1174.660
E6 = 1318.510
F6 = 1396.912
F6s= 1479.978
G6 = 1567.982
A6 = 1760
B6 = 1975.534
C7 = 2093.004
# timmer
mspb = 156
sec_count = 13
mspb_n0 = 1
mspb_n1 = 2
# Timer生成
timer = Timer()
#melo_kakko = [C6s,0,A5,A5,0,0,0,0,0,C6s,0,A5,A5,0,0,0,0,0,C6s,0,A5,A5,0,0,0,0,0,C6s,0,A5,A5,0,0,0,0,0,C6s,0,A5,A5,0,0,0,0,0,C6s,0,A5,A5,0,0,0,0,0,C6s,0,A5,A5,0,0,0,0,0,C6s,0,A5,A5,0,0,0,0,0]
#melo_piyo = [C6s,G5,0,0,0,0,0,C6s,G5,0,0,0,0,0,C6s,G5,0,0,0,0,0,C6s,G5,0,0,0,0,0,C6s,G5,0,0,0,0,0,C6s,G5,0,0,0,0,0,C6s,G5,0,0,0,0,0,C6s,G5,0,0,0,0,0]
melo_kakko = [C6s,0,A5,A5,0,0,0,0,0,C6s,0,A5,A5,0,0,0,0,0,C6s,0,A5,A5,0,0,0,0,0]
melo_piyo = [C6s,G5,0,0,0,0,0,C6s,G5,0,0,0,0,0,C6s,G5,0,0,0,0,0,C6s,G5,0,0,0,0,0]
busy = 0
cnt = -1
counter = -1
melo_i = 0
melody0_flg = False
melody1_flg = False
g_led2_flg = False
g_led3_flg = False
g_led4_flg = False
mode0 = 0
mode1 = 0
# callback関数
def timesec(timer):
global counter, cnt
global mspb_n0, mspb_n1
global g_led2_flg, g_led3_flg, g_led4_flg
global melo_i, melody0_flg, melody1_flg
global mode0, mode1
cnt = cnt + 1
if cnt % mspb_n0 == 0:
if melody0_flg:
beat_piyo()
if melody1_flg:
beat_kakko()
if cnt % mspb_n1 == 0:
if g_led2_flg:
m = 1 if g_led2.value() == 0 else 0
g_led2.value(m)
if g_led3_flg:
m = 1 if g_led3.value() == 0 else 0
g_led3.value(m)
if g_led4_flg:
m = 1 if g_led4.value() == 0 else 0
g_led4.value(m)
if mode1 == 1:
m = 1 if y_led0.value() == 0 else 0
y_led0.value(m)
n = 1 if m == 0 else 0
r_led1.value(n)
if cnt > 13:
cnt = 0
counter = counter + 1
if counter > 11:
counter = 0
if mode0 == 1 and counter == 0:
# 車道 A (青)
g_led0.value(1)
r_led0.value(0)
# 車道 B (赤)
r_led1.value(1)
y_led1.value(0)
# 歩行者 A (青)
melody0_flg = True # メロディ ON
g_led2.value(1)
r_led2.value(0)
# 歩行者 B
r_led3.value(1)
r_led4.value(1)
if mode0 == 1 and counter == 4:
# 歩行者 A (青点滅)
speaker.deinit() # メロディ OFF
melody0_flg = False
g_led2_flg = True
if mode0 == 1 and counter == 5:
# 車道 A (黄)
y_led0.value(1)
g_led0.value(0)
# 歩行者 A (赤)
g_led2_flg = False
g_led2.value(0)
r_led2.value(1)
if mode0 == 1 and counter == 6:
# 車道 A (赤)
y_led0.value(0)
r_led0.value(1)
# 車道 B (青)
r_led1.value(0)
g_led1.value(1)
# 歩行者 B
melody = melo_piyo
melody1_flg = True # メロディ ON
g_led3.value(1)
r_led3.value(0)
g_led4.value(1)
r_led4.value(0)
if mode0 == 1 and counter == 10:
# 歩行者 B (青点滅)
speaker.deinit() # メロディ OFF
melody1_flg = False
g_led3_flg = True
g_led4_flg = True
if mode0 == 1 and counter == 11:
# 車道 B (黄)
y_led1.value(1)
g_led1.value(0)
# 歩行者 B (赤)
g_led3_flg = False
g_led4_flg = False
g_led3.value(0)
r_led3.value(1)
g_led4.value(0)
r_led4.value(1)
# 音を鳴らす
def beat_kakko():
global melo_kakko
beat(melo_kakko)
def beat_piyo():
global melo_piyo
beat(melo_piyo)
def beat(melody):
global melo_i
global speaker
global busy
if melo_i >= len(melody): # メロディーを最後まで演奏し終えたら
speaker.deinit() # スピーカーのPWMを破棄して
busy = 0 # 終了
melo_i = 0
elif int(melody[melo_i]) == 0: # メロディー音が0、つまり無音(休符)の場合
speaker.duty_u16(0) # PWMのDutyを0とすることで波形は出力されずLOWとなり、音は出ない
melo_i += 1
else:
speaker.freq(int(melody[melo_i] + 0.5)) # PWMの周波数を次のメロディー音の周波数に変更する。整数で渡す必要があるので四捨五入
speaker.duty_u16(0x8000) # PWMのDutyを50%に戻し、音を出す。Dutyは0~0xFFFFつまり65535までの間の値で設定
melo_i += 1 # メロディーを次に進める
def initialize():
global counter, cnt
global speaker
global busy
busy = 0
cnt = -1
counter = -1
speaker.deinit()
g_led0.value(0)
y_led0.value(0)
r_led0.value(0)
g_led1.value(0)
y_led1.value(0)
r_led1.value(0)
g_led2.value(0)
r_led2.value(0)
g_led3.value(0)
r_led3.value(0)
g_led4.value(0)
r_led4.value(0)
# ** main関数 **
def main():
global speaker
global g_led2_flg, g_led3_flg, g_led4_flg
global melody0_flg, melody1_flg
global mode0, mode1
global busy
timer = Timer()
# 1sec timmer mode Timer.PERIODIC(繰り返し実行)
timer.init(mode=Timer. PERIODIC, period = mspb, callback = timesec)
while True:
mode0 = dip_sw0.value()
mode1 = dip_sw1.value()
while mode0 == 1 or mode1 == 1:
busy = 1
utime.sleep(1)
mode0 = dip_sw0.value()
mode1 = dip_sw1.value()
melody0_flg = False
melody1_flg = False
g_led2_flg = False
g_led3_flg = False
g_led4_flg = False
initialize()
utime.sleep(1)
timer.deinit()
# main関数エントリーポイント(実行開始)
if __name__ == "__main__":
main()