Para poder conectar la Raspberry a una protoboard, se vio el datasheet donde viene a donde se conectan los pines. Este paso es importante porque asi puedes ver que entrada activar estas salidas, se pueden activar desde antes de programar con un comando en el símbolo de sistema, activa el GPIO.
Se importa el GPIO y de ahi LED, con esos primero decimos que pines usaremos, y a una variable le podemos asignar un LED que estara conectado a cierto pin.
Para el movimiento de tortugas aleatorias emplee .stamp(), estampa la tortuga. Pero para que hiciera un efecto de movimiento también use .clearstamps(1), que borra la ultima estampa hecha, ya solo con un ciclo for que tomaba de rango un numero aleatorio con randint, generaba las estampas seleccionadas.
En una función puse que los leds encendieran justo después de que en el dibujo marcara su color de encendido, y apagara el led después de que el dot se pusiera en su color de apagado. Estos colores los puse en una lista, que la función fue recorriendo.
Para el fondo simplemente importe la imagen como fondo del programa.
#Glorieta de tortugas
from turtle import *
import RPi.GPIO as GPIO
from turtle import *
import time
from gpiozero import LED
from time import sleep
from signal import pause
import random
def luces():
name[nt]=Turtle()
name[nt].hideturtle()
name[nt].shape('turtle')
name[nt].pencolor('green')
name[nt].penup()
name[nt].goto(posistort[nt])
if(nt==0):
p.clearstamps()
name[nt].goto(-130,-40)
a=-160
for x in range(z1-1):
name[nt].stamp();name[nt].goto(a,-40);name[nt].stamp()
a=a-30
name[nt].clearstamps(-1)
elif(nt==1):
s.clearstamps()
a=180
name[nt].rt(90)
for x in range(z2-1):
name[nt].stamp();name[nt].goto(-10,a);name[nt].stamp()
a=a+30
name[nt].clearstamps(-1)
elif(nt==2):
t.clearstamps()
a=210
name[nt].rt(180)
for i in range(z3-1):
name[nt].stamp();name[nt].goto(a,30);name[nt].stamp()
a=a+30
name[nt].clearstamps(-1)
elif(nt==3):
c.clearstamps()
a=-190
name[nt].lt(90)
for i in range(z4-1):
name[nt].stamp();name[nt].goto(40,a);name[nt].stamp()
a=a-30
name[nt].clearstamps(-1)
cont=0
for w in range (3):
ss=focos[w]
semaforos[w]=Turtle()
semaforos[w].hideturtle()
semaforos[w].penup()
if(ss==1):
while (cont<1):
semaforos[w].hideturtle()
semaforos[w].goto(posisleds[nt][2])#rojo OFF
semaforos[w].dot(11,apagados[2])
semaforos[w].goto(posisleds[nt][0])#verde ON
semaforos[w].dot(11,encendidos[0])
green.on()
for i in range(80):
name[nt].stamp(); name[nt].fd(20);name[nt].clearstamps(1)
cont=cont+1
if(ss==1):
for q in range(3):
if(nt!=0):
semaforos[w]=Turtle()
semaforos[w].hideturtle()
semaforos[w].pu()
name[nt]=Turtle()
name[nt].pu()
semaforos[w].hideturtle()
semaforos[w].goto(posisleds[nt][0])#verde ON
semaforos[w].dot(11,encendidos[0])
green.on()
sleep(1)
semaforos[0].goto(posisleds[nt][0]) #verde OFF
semaforos[0].dot(11,apagados[0])
green.off()
sleep(1)
if(nt==0):
semaforos[w].hideturtle()
semaforos[w].goto(posisleds[nt][0])#verde ON
semaforos[w].dot(11,encendidos[0])
green.on()
sleep(0.4)
name[nt].pu()
name[nt].hideturtle()
name[nt].goto(-395,-40)
name[nt].showturtle()
for i in range(17):
name[nt].showturtle(); name[nt].stamp(); name[nt].fd(45); name[nt].clearstamps(i)
name[nt].hideturtle()
semaforos[w].goto(posisleds[nt][0]) #verde OFF
semaforos[w].dot(11,apagados[0])
green.off()
sleep(0.4)
if(ss==2):
semaforos[w].hideturtle()
semaforos[w].goto(posisleds[nt][1]) #amarillo ON
semaforos[w].dot(11,encendidos[1])
yellow.on()
sleep(4)
yellow.off()
if(ss==3):
semaforos[w].hideturtle()
semaforos[w].goto(posisleds[nt][1]) #amarillo OFF
semaforos[w].dot(11,apagados[1])
semaforos[w].goto(posisleds[nt][2]) #rojo ON
semaforos[w].dot(11,encendidos[2])
f1=random.randint(2,10)
f2=random.randint(2,10)
f3=random.randint(2,10)
f4=random.randint(2,10)
z1=f1
z2=f2
z3=f3
z4=f4
GPIO.setmode(GPIO.BCM)
#-------------------------PRIMER semaforo
#led rojo
GPIO.setup(17, GPIO.OUT)
#led amarillo
GPIO.setup(27, GPIO.OUT)
#led verde
GPIO.setup(22, GPIO.OUT)
#-------------------------SEGUNDO semaforo
#led rojo
GPIO.setup(13, GPIO.OUT)
#led amarillo
GPIO.setup(19, GPIO.OUT)
#led verde
GPIO.setup(26, GPIO.OUT)
#-------------------------TERCER semaforo
#led rojo
GPIO.setup(16, GPIO.OUT)
#led amarillo
GPIO.setup(20, GPIO.OUT)
#led verde
GPIO.setup(21, GPIO.OUT)
#-------------------------CUARTO semaforo
#led rojo
GPIO.setup(12, GPIO.OUT)
#led amarillo
GPIO.setup(6, GPIO.OUT)
#led verde
GPIO.setup(5, GPIO.OUT)
red1=LED(17)
red2=LED(13)
red3=LED(16)
red4=LED(12)
encendidos=['#00ff04','yellow','#ff120a']
apagados=['#203d06','#ad7000','#680d03']
semaforos=['sem1','sem2','sem3']
focos=[1,2,3]
posisleds=[[[-70,-60],[-70,-45],[-70,-30]],[[-50,90],[-35,90],[-20,90]],[[100,65],[100,50],[100,35]],[[80,-90],[65,-90],[50,-90]]]
posistort=[[-130,-40],[-10,150],[180,30],[40,-160]]
name=['p','s','t','c']
cua1=Turtle()
cua2=Turtle()
franja1=Turtle()
franja2=Turtle()
franja3=Turtle()
franja4=Turtle()
p=Turtle()
s=Turtle()
t=Turtle()
c=Turtle()
p.pencolor('green')
s.pencolor('green')
t.pencolor('green')
c.pencolor('green')
sem1=Turtle()
sem2=Turtle()
sem3=Turtle()
sem4=Turtle()
cont=1
bgpic('fondo.png')
screensize(600,400)
setup(640,680,0,0)
colormode(255)
title("Glorieta con semaforos")
p.shape('turtle')
s.shape('turtle')
t.shape('turtle')
c.shape('turtle')
p.hideturtle()
s.hideturtle()
t.hideturtle()
c.hideturtle()
franja1.hideturtle()
franja2.hideturtle()
franja3.hideturtle()
franja4.hideturtle()
sem1.hideturtle()
sem2.hideturtle()
sem3.hideturtle()
sem4.hideturtle()
#--------------------------------------------------dibujo de calles
cua1.speed(3)
cua2.speed(3)
franja1.speed(250)
franja2.speed(250)
franja3.speed(250)
franja4.speed(250)
cua1.pensize(150)
cua2.pensize(150)
cua1.pencolor(132, 128, 127)
cua2.pencolor(132, 128, 127)
cua1.penup()
cua2.penup()
cua1.goto(15,50)
cua2.goto(15,50)
cua1.pendown()
cua2.pendown()
cua1.lt(90)
cua2.rt(90)
cua1.fd(400)
cua2.fd(400)
cua1.penup()
cua2.penup()
cua1.goto(-35,0)
cua2.goto(35,0)
cua1.lt(90)
cua2.lt(90)
cua1.pendown()
cua2.pendown()
cua1.fd(400)
cua2.fd(400)
franja1.pencolor('#fffa00')
franja2.pencolor('#fffa00')
franja3.pencolor('#fffa00')
franja4.pencolor('#fffa00')
franja1.pensize(6)
franja2.pensize(6)
franja3.pensize(6)
franja4.pensize(6)
franja1.penup()
franja2.penup()
franja3.penup()
franja4.penup()
franja1.goto(-101,73)
franja2.goto(120,73)
franja3.goto(-57,110)
franja4.goto(-57,-120)
franja1.rt(90)
franja2.rt(90)
for i in range(8):
franja1.pendown();franja1.lt(90);franja1.fd(15);franja1.backward(15);franja1.rt(90);franja1.penup();franja1.fd(20)
franja2.pendown();franja2.lt(90);franja2.fd(15);franja2.backward(15);franja2.rt(90);franja2.penup();franja2.fd(20)
franja3.pendown();franja3.lt(90);franja3.fd(15);franja3.backward(15);franja3.rt(90);franja3.penup();franja3.fd(20)
franja4.pendown();franja4.lt(90);franja4.fd(15);franja4.backward(15);franja4.rt(90);franja4.penup();franja4.fd(20)
franja1.pencolor('white')
franja2.pencolor('white')
franja3.pencolor('white')
franja4.pencolor('white')
franja1.pensize(6)
franja2.pensize(6)
franja3.pensize(6)
franja4.pensize(6)
franja1.goto(-125,0)
franja2.goto(20,150)
franja3.goto(160,0)
franja4.goto(20,-140)
franja1.pendown()
franja2.pendown()
franja3.pendown()
franja4.pendown()
franja1.lt(90)
franja2.lt(180)
franja4.rt(90)
franja1.backward(400)
franja2.fd(400)
franja3.fd(400)
franja4.fd(400)
#-----------------------------bases de semaforos
sem1.begin_fill()
sem2.begin_fill()
sem3.begin_fill()
sem4.begin_fill()
sem1.penup()
sem2.penup()
sem3.penup()
sem4.penup()
sem1.goto(-63,-70)
sem1.lt(90)
sem2.goto(-57,97)
sem3.goto(93,75)
sem3.rt(90)
sem4.goto(90,-83)
sem4.lt(180)
sem1.pendown()
sem2.pendown()
sem3.pendown()
sem4.pendown()
sem1.fd(50)
sem1.lt(90)
sem2.fd(50)
sem2.rt(90)
sem3.fd(50)
sem3.lt(90)
sem4.fd(50)
sem4.lt(90)
sem1.fd(15)
sem1.lt(90)
sem2.fd(15)
sem2.rt(90)
sem3.fd(15)
sem3.lt(90)
sem4.fd(15)
sem4.lt(90)
sem1.fd(50)
sem1.lt(90)
sem2.fd(50)
sem2.rt(90)
sem3.fd(50)
sem3.lt(90)
sem4.fd(50)
sem4.lt(90)
sem1.fd(15)
sem1.end_fill()
sem2.fd(15)
sem2.end_fill()
sem3.fd(15)
sem3.end_fill()
sem4.fd(15)
sem4.end_fill()
#--------------------------------------------luces de semaforos
sem1.penup()
sem2.penup()
sem3.penup()
sem4.penup()
sem1.goto(-70,-30) #posicion roja roja 1
sem1.dot(11,'#ff120a')
red1.on()
sleep(1)
sem1.goto(-70,-45) #posicion luz amarilla 1
sem1.dot(11,'#685300')
sem1.goto(-70,-60) #posicion luz verde 1
sem1.dot(11,'#203d06')
sem2.goto(-50,90) #posicion luz verde 2
sem2.dot(11,'#203d06')
sem2.goto(-35,90) #posicion luz amarilla 2
sem2.dot(11,'#685300')
sem2.goto(-20,90) #posicion luz roja 2
sem2.dot(11,'#ff120a')
red2.on()
sleep(1)
sem3.goto(100,65) #posicion luz verde 3
sem3.dot(11,'#203d06')
sem3.goto(100,50) #posicion luz amarilla 3
sem3.dot(11,'#685300')
sem3.goto(100,35) #posicion luz roja 3
sem3.dot(11,'#ff120a')
red3.on()
sleep(1)
sem4.goto(80,-90) #posicion luz verde 4
sem4.dot(11,'#203d06')
sem4.goto(65,-90) #posicion luz amarilla 4
sem4.dot(11,'#685300')
sem4.goto(50,-90) #posicion luz rojo 4
sem4.dot(11,'#ff120a')
red4.on()
sleep(1)
#---------------------------------------------------tortugas aleatorias
p.penup()
s.penup()
t.penup()
c.penup()
p.goto(-340,-40)
p.stamp()
s.rt(90)
s.goto(-10,350)
t.goto(350,30)
t.rt(180)
c.goto(40,-370)
c.lt(90)
p.hideturtle()
s.hideturtle()
t.hideturtle()
c.hideturtle()
#PRIMERA TORTUFIL
tp=p.pos()
tp=tp[0]
a=-310
for i in range(f1):
p.speed(1)
while(tp<=-130):
p.stamp();p.goto(a,-40);p.clearstamps(i)
tp=p.pos()
tp=tp[0]
a=a+30
if(tp==-130):
break
if(tp==-100):
p.hideturtle()
while(f1-1<8):
p.clearstamps(1)
f1=f1+1
#SEGUNDA TORTUFIL
tp=s.pos()
tp=tp[1]
a=330
for i in range(f2):
s.speed(1)
while(tp>=150):
s.stamp();s.goto(-10,a);s.clearstamps(i)
tp=s.pos()
tp=tp[1]
a=a-30
if(tp==150):
break
if(tp==130):
s.hideturtle()
while(f2-1<8):
s.clearstamps(1)
f2=f2+1
#TERCERA TORTUFIL
tp=t.pos()
tp=tp[0]
a=330
for i in range(f3):
t.speed(1)
while(tp>=180):
t.stamp();t.goto(a,30);t.clearstamps(i)
tp=t.pos()
tp=tp[0]
a=a-30
if(tp==180):
break
if(tp==150):
t.hideturtle()
while(f3-1<8):
t.clearstamps(1)
f3=f3+1
#CUARTA TORTUFIL
tp=c.pos()
tp=tp[1]
a=-340
for i in range(f4):
c.speed(1)
while(tp<=-160):
c.stamp();c.goto(40,a);c.clearstamps(i)
tp=c.pos()
tp=tp[1]
a=a+30
if(tp==-160):
break
if(tp==-130):
c.hideturtle()
while(f4-1<8):
c.clearstamps(1)
f4=f4+1
#-----------------------------------------------CALLE 1
nt=0
red1.off()
yellow=LED(27)
green=LED(22)
luces()
red1.on()
#-----------------------------------------------CALLE 2
nt=1
red2.off()
yellow=LED(19)
green=LED(26)
luces()
red2.on()
sleep(1)
#SEGUNDA TORTUFIL
tp=[-10,350]
s.goto(tp)
s.stamp()
tp=tp[1]
a=330
for i in range(4):
while(tp>=150):
s.stamp();s.goto(-10,a);s.clearstamps(i)
tp=s.pos()
tp=tp[1]
a=a-30
if(tp==150):
break
if(tp==130):
s.hideturtle()
j=4
while(j<8):
s.clearstamps(1)
j=j+1
#-----------------------------------------------CALLE 3
nt=2
red3.off()
yellow=LED(20)
green=LED(21)
luces()
red3.on()
sleep(1)
#PRIMERA TORTUFIL
tp=[-340,-40]
p.goto(tp)
p.stamp()
tp=tp[0]
a=-310
for i in range(5):
while(tp<=-130):
p.stamp();p.goto(a,-40);p.clearstamps(i)
tp=p.pos()
tp=tp[0]
a=a+30
if(tp==-130):
break
if(tp==-100):
p.hideturtle()
j=5
while(j<8):
p.clearstamps(1)
j=j+1
#-----------------------------------------------CALLE 4
nt=3
red4.off()
yellow=LED(6)
green=LED(5)
luces()
red4.on()
sleep(1)
#TERCERA TORTUFIL
tp=[350,30]
t.goto(tp)
tp=tp[0]
a=330
for i in range(3):
while(tp>=180):
t.stamp();t.goto(a,30);t.clearstamps(i)
tp=t.pos()
tp=tp[0]
a=a-30
if(tp==180):
break
if(tp==150):
t.hideturtle()
j=3
while(j<8):
t.clearstamps(1)
j=j+1
red1.on()
red2.on()
red3.on()
red4.on()
sleep(2)
GPIO.cleanup()
t.pu()
t.goto(-5,0)
t.color('white')
t.write("FIN :)", font=("Comic Sans", int(18),"italic bold"))
exitonclick()
- Visualización (solo de las tortugas sin mover y los leds en rojo):