Semáforo sincronizado con LEDs en Raspberry PI
Programa Semáforos con Raspberry PI
#Maestra: Ariadna Cardozo
#fecha: 22-05-2018
#Librerias
from turtle import*
import turtle
from time import sleep
import random
from gpiozero import LED
#Definimos los sprites que se usaran
cars_right = ["sprites/redCar.gif",
"sprites/greenCar.gif",
"sprites/blackCar.gif",
"sprites/blueCar.gif",
"sprites/yellowCar.gif",
"sprites/greyCar.gif"]
cars_left = ["sprites/redCar_left.gif",
"sprites/greenCar_left.gif",
"sprites/blackCar_left.gif",
"sprites/blueCar_left.gif",
"sprites/yellowCar_left.gif",
"sprites/greyCar_left.gif"]
cars_up = ["sprites/redCar_up.gif",
"sprites/greenCar_up.gif",
"sprites/blackCar_up.gif",
"sprites/blueCar_up.gif",
"sprites/yellowCar_up.gif",
"sprites/greyCar_up.gif"]
cars_down = ["sprites/redCar_down.gif",
"sprites/greenCar_down.gif",
"sprites/blackCar_down.gif",
"sprites/blueCar_down.gif",
"sprites/yellowCar_down.gif",
"sprites/greyCar_down.gif"]
maps = ["sprites/map.gif"]
trafficLightGroup = ["sprites/tlight.gif", "sprites/tlighth.gif"]
trafficLightOn = ["sprites/redon.gif", "sprites/yellowon.gif", "sprites/greenon.gif"]
#Variables importantes para el funcionamiento de los semaforos
greentime = 3
gBinkTimes = 5
yellowtime = 2
#variables importantes para el movimiento de los coches
speed = 1
TL_state = [0,0,0,0] #Representa los estados de los semaforos 1 en avance 0 en pare
separ = 50
avance = 1800
#leds
Agreen = LED(2)
Ayell = LED(3)
Ared = LED(4)
Bgreen = LED(17)
Byell = LED(27)
Bred = LED(22)
Cgreen = LED(10)
Cyell = LED(9)
Cred = LED(11)
Dgreen = LED(5)
Dyell = LED(6)
Dred = LED(13)
#turtle Setup
t = Turtle()
turtle.setup(1340,715)
screen = t.getscreen()
screen.title("Semaforo Sincronizado")
screen.bgpic(maps[0]) #Fondo de la ventana
t.ht()
#Cargamos las formas de todos los coches y el semaforo
for car in cars_right:
screen.addshape(car)
for car in cars_left:
screen.addshape(car)
for car in cars_up:
screen.addshape(car)
for car in cars_down:
screen.addshape(car)
for tl in trafficLightGroup:
screen.addshape(tl)
for light in trafficLightOn:
screen.addshape(light)
#Coches Tortuga
turtCar1 = Turtle()
turtCar2 = Turtle()
turtCar3 = Turtle()
turtCar4 = Turtle()
turtCar5 = Turtle()
turtCar6 = Turtle()
turtCar7 = Turtle()
turtCar8 = Turtle()
turtCar9 = Turtle()
turtCar10 = Turtle()
turtCar11 = Turtle()
turtCar12 = Turtle()
cars_left_tort = [turtCar1, turtCar2, turtCar3]
cars_right_tort = [turtCar4, turtCar5, turtCar6]
cars_up_tort = [turtCar7, turtCar8, turtCar9]
cars_down_tort = [turtCar10, turtCar11, turtCar12]
#Creamos varios objetos tortuga
#Semaforos
sem1 = Turtle()
sem2 = Turtle()
sem3 = Turtle()
sem4 = Turtle()
#Luces de los semaforos
tra_light_1 = Turtle()
tra_light_2 = Turtle()
tra_light_3 = Turtle()
tra_light_4 = Turtle()
#-----------------------------Parte De Los Semaforos-------------------------------------------------------------------------------------
#Dibujamos semaforo por separado
def DrawTrafficLight(_t, mov, rot, h):
_t.penup()
_t.shape((trafficLightGroup[0],trafficLightGroup[1])[h==1])
_t.right(rot)
_t.forward(mov)
#Dibujamos 4 semaforos llamando a las funciones de manera separada
def DrawTrafficLights():
DrawTrafficLight(sem1, -200, 0, 0) #Traffic light A
DrawTrafficLight(sem2, 200, 0, 0) #Traffic light B
DrawTrafficLight(sem3, 175, -90, 1) #Traffic light C
DrawTrafficLight(sem4, 175, 90, 1) #Traffic light D
#Definimos una configuracion inicial a las luces de los semaforos
def LightsSetup():
tra_light_1.shape(trafficLightOn[2])
tra_light_1.penup()
tra_light_2.shape(trafficLightOn[0])
tra_light_2.penup()
tra_light_3.shape(trafficLightOn[0])
tra_light_3.penup()
tra_light_4.shape(trafficLightOn[0])
tra_light_4.penup()
#Esta funcion posiciona una tortuga segun la luz y semaforo que le corresponda
def TrafficLightPositioner(_t, fw, rot, chooser):
def PosA():
_t.forward(fw)
_t.right(rot)
_t.forward(50)
def PosB():
_t.backward(fw)
_t.left(rot)
_t.forward(175)
_t.right(90)
def PosC():
_t.forward(fw)
_t.right(rot)
_t.forward(50)
def PosD():
_t.backward(fw)
_t.left(rot)
_t.forward(-175)
_t.left(-rot)
if chooser == 'a':
PosA()
elif chooser == 'b':
PosB()
elif chooser == 'c':
PosC()
elif chooser == 'd':
PosD()
#posiciona las cuatro luces en sus respectivos semaforos
def TrafficLightMultiplePositioner():
TrafficLightPositioner(tra_light_1, -200, -90, 'a')
TrafficLightPositioner(tra_light_2, 50, 90, 'b')
TrafficLightPositioner(tra_light_3, 200, 90, 'c')
TrafficLightPositioner(tra_light_4, 50, 90, 'd')
#Apaga las luces de las tortugas
def TurnOnOff(_t, state):
if state == 'on':
_t.st()
else:
_t.ht()
#Cambia el sprite de la tortuga al color de semaforo deseado
def ChangeLightColor(_t, color):
if color == 'g':
_t.shape(trafficLightOn[2])
elif color == 'y':
_t.shape(trafficLightOn[1])
elif color == 'r':
_t.shape(trafficLightOn[0])
#Hace el parpadeo intermedio de cambio de semaforo
def BlinkGreenLight(_t):
_t.shape(trafficLightOn[2])
Agreen.on()
for i in range(gBinkTimes):
_t.ht()
Agreen.off()
sleep(1)
Agreen.on()
_t.st()
sleep(1)
#Estas funciones Mueven las tortugas para cambiar las luces
# de los semaforos
def MoverA(FromTo):
if FromTo == 'g-y':
tra_light_1.forward(-50)
if FromTo == 'y-r':
tra_light_1.forward(-50)
if FromTo == 'r-g':
tra_light_1.forward(100)
def MoverB(FromTo):
if FromTo == 'g-y':
tra_light_2.forward(-50)
if FromTo == 'y-r':
tra_light_2.forward(-50)
if FromTo == 'r-g':
tra_light_2.forward(100)
def MoverC(FromTo):
if FromTo == 'g-y':
tra_light_3.forward(50)
if FromTo == 'y-r':
tra_light_3.forward(50)
if FromTo == 'r-g':
tra_light_3.forward(-100)
def MoverD(FromTo):
if FromTo == 'g-y':
tra_light_4.forward(-50)
if FromTo == 'y-r':
tra_light_4.forward(-50)
if FromTo == 'r-g':
tra_light_4.forward(100)
#Controlamos el apagado y encendido de las lamparas de los semaforos
def TrafficLightSynchronizer():
while True:
#Funcionamiento del Semaforo A (Izquierdo)
#TL_state = [1,0,0,0]
InitLEDs()
MoveCars('a')
Agreen.on()
sleep(greentime)
BlinkGreenLight(tra_light_1)
TurnOnOff(tra_light_1, 'off')
Agreen.off()
MoverA('g-y')
ChangeLightColor(tra_light_1, 'y')
TurnOnOff(tra_light_1, 'on')
Ayell.on()
sleep(yellowtime)
Ayell.off()
TurnOnOff(tra_light_1, 'off')
ChangeLightColor(tra_light_1, 'r')
MoverA('y-r')
TurnOnOff(tra_light_1, 'on')
Ared.on()
#Funcionamiento del Semaforo B (Arriba)
Bred.off()
TurnOnOff(tra_light_2, 'off')
MoverB('r-g')
ChangeLightColor(tra_light_2,'g')
TurnOnOff(tra_light_2, 'on')
Bgreen.on()
#TL_state = [0,1,0,0]
MoveCars('b')
sleep(greentime)
BlinkGreenLight(tra_light_2)
TurnOnOff(tra_light_2, 'off')
Bgreen.off()
MoverB('g-y')
ChangeLightColor(tra_light_2,'y')
TurnOnOff(tra_light_2, 'on')
Byell.on()
sleep(yellowtime)
TurnOnOff(tra_light_2, 'off')
Byell.off()
ChangeLightColor(tra_light_2,'r')
MoverB('y-r')
TurnOnOff(tra_light_2, 'on')
Bred.on()
#Semaforo de la derecha C
Cred.off()
TurnOnOff(tra_light_3, 'off')
MoverC('r-g')
ChangeLightColor(tra_light_3,'g')
TurnOnOff(tra_light_3, 'on')
Cgreen.on()
#TL_state = [0,0,1,0]
MoveCars('c')
sleep(greentime)
BlinkGreenLight(tra_light_3)
TurnOnOff(tra_light_3, 'off')
Cgreen.off()
MoverC('g-y')
ChangeLightColor(tra_light_3,'y')
TurnOnOff(tra_light_3, 'on')
Cyell.on()
sleep(yellowtime)
TurnOnOff(tra_light_3, 'off')
Cyell.off()
ChangeLightColor(tra_light_3,'r')
MoverC('y-r')
TurnOnOff(tra_light_3, 'on')
Cred.on()
#Semaforo D (abajo)
Dred.off()
TurnOnOff(tra_light_4, 'off')
MoverD('r-g')
ChangeLightColor(tra_light_4,'g')
TurnOnOff(tra_light_4, 'on')
Dgreen.on()
#TL_state = [0,0,0,1]
MoveCars('d')
sleep(greentime)
BlinkGreenLight(tra_light_4)
TurnOnOff(tra_light_4, 'off')
Dgreen.off()
MoverD('g-y')
ChangeLightColor(tra_light_4,'y')
TurnOnOff(tra_light_4, 'on')
Dyell.on()
sleep(yellowtime)
TurnOnOff(tra_light_4, 'off')
Dyell.off()
ChangeLightColor(tra_light_4,'r')
MoverD('y-r')
TurnOnOff(tra_light_4, 'on')
Dred.on()
#Regresamos al principio
TurnOnOff(tra_light_1, 'off')
MoverA('r-g')
ChangeLightColor(tra_light_1,'g')
TurnOnOff(tra_light_1, 'on')
#----------------------------------------------------------------------------------------------------------------------------------------
#--------------------------------------------------------Parte Correspondiente al movimiento de los coches-------------------------------
#Rellenamos la forma de la tortuga con un valor al azar y lo sacamos de la lista de coches
def turtsCarsSetup():
for i in cars_down_tort:
i.shape(cars_down[random.randrange(0,5,1)])
i.penup()
for i in cars_left_tort:
i.shape(cars_left[random.randrange(0,5,1)])
i.penup()
for i in cars_up_tort:
i.shape(cars_up[random.randrange(0,5,1)])
i.penup()
for i in cars_right_tort:
i.shape(cars_right[random.randrange(0,5,1)])
i.penup()
def CarsPositioner():
#posicionamos los coches que van de izquierda a derecha
posx = separ+60
for i in cars_right_tort:
i.backward(posx*3)
i.right(90)
i.forward(50)
i.left(90)
posx = posx + 40
#posicionamos los coches que van de derecha a izquierda
posx = separ+60
for i in cars_left_tort:
i.left(180)
i.backward(posx*3)
i.right(90)
i.forward(50)
i.left(90)
posx = posx + 40
#posicionamos los coches que van de abajo hacia arriba
posx = separ+60
for i in cars_up_tort:
i.forward(50)
i.left(90)
i.backward(posx*3)
posx = posx + 40
#posicionamos los coches que van de abajo hacia arriba
posx = separ+60
for i in cars_down_tort:
i.forward(-50)
i.left(90)
i.forward(posx*3)
posx = posx + 40
i.right(180) #Dejamos ajustada la direccion hacia abajo
def MoveCars(sel):
if sel == 'c':
for i in cars_right_tort:
i.forward(avance)
i.ht()
i.backward(avance)
i.st()
elif sel == 'a':
for i in cars_left_tort:
i.forward(avance)
i.ht()
i.backward(avance)
i.st()
elif sel == 'd':
for i in cars_down_tort:
i.forward(avance)
i.ht()
i.backward(avance)
i.st()
elif sel == 'b':
for i in cars_up_tort:
i.forward(avance)
i.ht()
i.backward(avance)
i.st()
#----------------------------------------------------------------------------------------------------------------------------------------
def InitLEDs():
Agreen.on()
Ayell.off()
Ared.off()
Bgreen.off()
Byell.off()
Bred.on()
Cgreen.off()
Cyell.off()
Cred.on()
Dgreen.off()
Dyell.off()
Dred.on()
#Funcion Principal
def main():
DrawTrafficLights()
LightsSetup()
TrafficLightMultiplePositioner()
turtsCarsSetup()
CarsPositioner()
TrafficLightSynchronizer()
main()
screen.exitonclick()

Comentarios
Publicar un comentario