Adrien's log

Yet Another Note Pad

Un feu tricolore à base de Raspberry Pi

by adrien on 12 février 2014

Le projet

Peu de temps après le premier article sur le Raspberry et le montage aux trois DELs (ici), j’y ai ajouté un bouton afin de déclencher un cycle d’allumage/extinction des DELs (Ouais, l’article arrive un peu tard). Le premier montage tournait en boucle (rouge -> jaune -> vert) maintenant, il s’arrête au rouge et attend que l’on presse le bouton pour recommencer.

Le but était de dérouiller mes connaissances électroniques dans la partie détection.

La réalisation

Pour réaliser ce montage, on reprend exactement le même montage que dans l’article précédent. On va simplement y ajouter un bouton (et deux résistances) et modifier un peu le code Python.

Liste du matériel :

  • un bouton poussoir;
  • deux résistances (peu importe la valeur).

Le hardware

Voilà donc ce que nous devrons réaliser :

Schéma de la partie détection

Schéma de la partie détection

Nous relions la sortie de 3,3 volt du Raspberry à une résistance. L’autre côté de la résistance sera relié à une autre résistance  qui elle même sera connectée au GPIO n°23 du Raspberry. La première (R2) résistance est là uniquement pour protéger la Raspberry d’un court circuit, c’est pour cela que ça valeur importe peu : des résistances de 90Ohms comme dans le montage précédent suffiront. La seconde est complétement inutile, c’est juste que lorsque j’ai fait le montage j’avais jugé utile d’en mettre une …

Ensuite, entre les deux résistances, nous ajoutons le dit bouton et nous relierons sa deuxième borne à la masse.

En temps normal, lorsque le circuit est au repos (lorsque l’on n’appuie PAS sur le bouton), le GPIO n°23 est à l’état haut. Lorsque l’on appuie sur le bouton, tout le courant part par la masse, le GPIO est donc à l’état bas.

Le montage final :

Montage feu tricolore

Montage électronique du feu tricolore

Le software

L’enjeu de la modification du programme est de lui faire prendre en compte la passage de l’état haut à l’état bas. Ce n’est pas bien difficile, la bibliothèque que nous utilisons gère cela.

Le code python

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
""" Feu tricolore en Python """
 
import time
import RPi.GPIO as GPIO
import signal
import sys
 
rouge  = 22
jaune  = 17
vert   = 18
bouton = 23
 
GPIO.cleanup()
GPIO.setmode(GPIO.BCM)
GPIO.setup(rouge, GPIO.OUT)
GPIO.setup(jaune, GPIO.OUT)
GPIO.setup(vert, GPIO.OUT)
GPIO.setup(bouton, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) #Ici, on ajoute la configuration du GPIO23 en entrée.
 
def signal_handler(signal, frame):
    print "Fermeture en cours"
    GPIO.cleanup()
    sys.exit(0)
 
def allume(couleur):
    GPIO.output(couleur, GPIO.HIGH)
    print "allume %d" % couleur
 
def eteint(couleur):
    GPIO.output(couleur, GPIO.LOW)
    print "eteint %d" % couleur
 
def changeCouleur(index):
    if(index == 0):
        allume(vert)
        eteint(rouge)
        return 1
    elif(index == 1):
        allume(jaune)
        eteint(vert)
        return 1
    elif(index == 2):
        allume(rouge)
        eteint(jaune)
        return 3
    else:
        return 0
 
# Cette fonction gère un cycle
def makeCycle():
    i = 0
    while i < 3:
        t = changeCouleur(i)
        i += 1
        time.sleep(t)
 
signal.signal(signal.SIGINT, signal_handler)
 
makeCycle()
 
while True:
    GPIO.wait_for_edge(bouton, GPIO.FALLING) # On attends le passage à l'état bas
    print "Bouton presse"
    makeCycle()                              # Une fois le passage à l'état bas détecté, on fait un cycle.
    print "Cycle termine"
 
GPIO.cleanup()

Voilà, le montage est terminé. Lorsque l’on appuie sur le bouton, un cycle Rouge -> Vert -> Jaune -> Rouge et attends que l’on appuie à nouveau pour recommencer.

C’est totalement inutile, mais formateur ;).

 

2 thoughts on “Un feu tricolore à base de Raspberry Pi

  1. marola says:

    salut comment introduire la notion de temps dans la gestion de feux de circulation routiere dans le code python afin d’avoir les alterations des couleurs en fonction du temps introduit au préalable???

  2. adrien says:

    Hello !
    Je ne sais pas si j’ai bien compris, mais si tu veux remplacer l’appui sur un bouton par un temps donné, tu peux remplacer la ligne « GPIO.wait_for_edge(bouton, GPIO.FALLING) » par un « time.sleep(nombre_de_secondes) ».

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *