![]() |
Cahier d'exercices pour l'enseignement et l'apprentissage de programmation issu de la collection "Climat et météo tremplin pour l'enseignement des sciences" (PIA IFÉ ENS de Lyon - Météofrance ENM Toulouse). Le dispositif clef en main repose sur l'utilisation d'une RaspberryPi chargée avec le système d'exploitation Debian enrichi, fourni par le projet. Les sources et les exécutables sont accessibles dans l'espace collaboratif de la forge github; plus d'information sur les blogs d'accompagnement systèmes d'exploitation sur la page des OS de Raspberries Pi. Toutes les ressources issues du projet sont fournies sous licence Creative Commons ou sous les licences libres d'origine des outils utilisés. Les ressources du projet peuvent être utilisées dans tout autre environnement compatible.
Auteurs : G. Vidal, C-H. Eyraud, E. le Jan
Une diode électroluminescente est un composé électronique qui émet de la lumière lorsqu'il est parcouru par un courant électrique. L'une des particularités de ce composant est qu'il ne peut être parcouru que dans un seul sens si l'on permute le sens du courant il est bloqué (aucune intensité ne parcourt le composant) et la diode (LED) reste éteinte. Nous verrons comment exploiter cette particularité en contrôlant par un programme l'alimentation de LEDs. Nous allons utiliser des montages regroupées sur une plaque d'expérimentation, il s'agit d'une base de proposition qui peut-être copiée et modifiée et chaque expérience peut-être isolée de ses voisines. La plaque est représentée ci- dessous:
Nous allons utiliser un certain nombre de programmes écrits par des développeurs pour nous permettre d'interagir avec les broches d'une Raspberry Pi, ces programmes sont regroupés dans des librairies stockées sur le disque de la machine et prêtes à l'emploi, il suffit de solliciter leur utilisation pour accéder aux programmes qu'elles contiennent. On utilise pour cela l'instruction import nom_de_la_bibliothèque as nom_que_nous_utiliserons_dans_le_programme. Ces commandes doivent systématiquement figurer en tête de chaque programme que nous allons écrire.
Nous allons utiliser le montage encadré ci-dessous et connecter deux broches de la Raspberry Pi. L'identification des broche est une question de type "troll" dans la mesure où il y a plusieurs façons d'identifier ces broches dont toutes ont des avantages et des inconvénients. Nous utiliserons ici le numéro de la broche en commençant en haut à gauche (les connecteurs USB et RJ45 étant considérés en bas) en descendant et en augmentant de droite à gauche.
Connecter le fil vert à la broche 35 et le fil noir à la broche 6 (GROUND). Pour allumer la LED:
import mraa
led = mraa.Gpio(35)
Les broches peuvent fonctionner dans le sens in pour recevoir des données ou dans le sens out pour envoyer un signal ou un courant.
status = led.dir(mraa.DIR_OUT)
#print ('Return status : {0:1d}'.format(status))
status = led.write(1)
#print ('Return status : {0:1d}'.format(status))
On éteint ou on ré-éteint la LED en mettant la sortie au niveau 0 avec la commande write
led.write(0)
#print ('Return status : {0:1d}'.format(status))
0
Il est possible de contrôler la durée d'allumage ou d'extinction de la LED ce qui conduit à la logique de clignotement. Pour y parvenir il est nécessaire de disposer de fonctions temporelles fournies par la bibliothèque time. On importe time ensuite on choisit la durée d'allumage et d'extinction en secondes:
import time
led.write(1)
time.sleep(2)
led.write(0)
time.sleep(3)
led.write(1)
time.sleep(1)
led.write(0)
time.sleep(1)
led.write(1)
time.sleep(0.5)
led.write(0)
time.sleep(0.5)
led.write(1)
time.sleep(0.5)
led.write(0)
time.sleep(0.5)
led.write(1)
time.sleep(0.5)
led.write(0)
time.sleep(0.5)
led.write(1)
time.sleep(0.5)
led.write(0)
time.sleep(0.5)
led.write(1)
time.sleep(0.25)
led.write(0)
time.sleep(0.25)
led.write(1)
time.sleep(0.25)
led.write(0)
time.sleep(0.25)
led.write(1)
time.sleep(0.25)
led.write(0)
time.sleep(0.25)
led.write(1)
time.sleep(0.25)
led.write(0)
0
Comme on l'a vu ci dessus il suffit d'imposer le temps d'allumage et d'extinction pour un obtenir un clignotement, cependant c'est très fastidieux de répéter plusieurs fois la même séquence d'instructions. La programmation fournit un outil qui décrit une répétition de commandes et permet en quelques lignes de répéter un grand nombre d'instructions identiques. Le programme ci-dessous utilise la variable i qui prend la valeur 0 pour commencer : la valeur initiale et se termine à 20 la valeur finale en augmentant chaque fois d'une unité : le pas. Le clignotement se compose d'une phase d'allumage pendant 0.15 s et une phase d'extinction de 0.25 s.
for i in range(0,20,1) :
led.write(1)
time.sleep(0.15)
led.write(0)
time.sleep(0.25)
Modifier la valeur initiale, la valeur finale et le pas pour modifier le clignotement.
for i in range(-,-,-) :
led.write(1)
time.sleep(-.-)
led.write(0)
time.sleep(-.-)
On peut modifier la commande qui est répétée en ajoutant des tests qui permettent de fixer le moment ou le type de clignotement change. Ici on change tous les 10 clignotements.
for i in range(0,30,1) :
if (i < 10) :
led.write(1)
time.sleep(0.15)
led.write(0)
time.sleep(0.25)
elif (i >= 10 & i < 20) :
led.write(1)
time.sleep(0.2)
led.write(0)
time.sleep(0.2)
else :
led.write(1)
time.sleep(0.05)
led.write(0)
time.sleep(0.05)
Décrivez un mode de clignotement composé de plusieurs phases sur le modèle ci-dessus et écrivez le programme correspondant dans le bloc ci-dessous.
for i in range(-,-,-) :
if (- < -) :
led.write(1)
time.sleep(-.-)
led.write(0)
time.sleep(-.-)
elif ():
else :
Tout ce qui a été présenté ci dessus peut se généraliser à plusieurs LED. Pour cela on conserve une seule masse commune aux 3 LEDs utilisées dans cette partie et on branche une broche sur chacune des 3 LEDs, ce qui a été vu pour la LED jaune de la partie précédente est appliqué simultanément aux 3 broches connectées aux LEDS Rouge Jaune et Verte.
:
Dans l'exemple présenté ici on branche :
import mraa, time
# déclaration des broches utilisées
ledr = mraa.Gpio(11)
ledg = mraa.Gpio(35)
ledy = mraa.Gpio(31)
# sens d'utilisation des broches choisies
ledr.dir(mraa.DIR_OUT)
ledg.dir(mraa.DIR_OUT)
ledy.dir(mraa.DIR_OUT)
0
Allumage pendant une seconde successivement des 3 LEDs, puis allumage des 3 LEDs ensemble pendant 5 secondes
# Allumage pendant une seconde successivement des 3 LEDs Rouge Jaune Vert
ledr.write(1)
time.sleep(1)
ledr.write(0)
ledy.write(1)
time.sleep(1)
ledy.write(0)
ledg.write(1)
time.sleep(1)
ledg.write(0)
time.sleep(1)
# Allumage simultanné des 3 LEDs
ledr.write(1)
ledg.write(1)
ledy.write(1)
time.sleep(5)
ledr.write(0)
ledg.write(0)
ledy.write(0)
0
for i in range(0,300,1) :
j = 2
k = 5
l = 10
if (i % k == 0):
if ((i / k) % 2 == 0):
ledg.write(1)
else :
ledg.write(0)
if (i % l == 0):
if ((i / l) % 2 == 0):
ledr.write(1)
else :
ledr.write(0)
if (i % j == 0):
ledy.write(1)
time.sleep(0.1)
else :
ledy.write(0)
time.sleep(0.1)
time.sleep(0.1)
On peut aussi envisager ici des applications comme les montres binaires ou en base 5 (existent toutes deux dans le commerce)