Le Montage sur la platine d'essai
Le câblage est très simple, mais assez laborieuse sur la platine d'essai. Nous allons rattacher chaque LED respectivement du GP0 au GP17. Ne pas oublier la résistance de protection, j'ai choisi 220 ohms.
Voici mon montage réalisé avec des fils cavalier pour platine d'essai.
Le code
Mode ON/OFF
C'est le mode le plus facile à utiliser, chaque Pin aura deux états (0 ou 1). Après avoir étudié le code de l'Arduino, j'ai été confronté à la problématique d'appeler chaque LED par son numéro de Pin (GP). En utilisant l'initialisation classique comme ceci
#initialisation des objets leds
led0 = machine.Pin(1, machine.Pin.OUT)
led1 = machine.Pin(1, machine.Pin.OUT)
led2 = machine.Pin(2, machine.Pin.OUT)
Il sera impossible d'utiliser une boucle for. Nous allons donc utiliser un tableau avec la librairie array. Voici un exemple pour nous 18 LED.
from machine import Pin
from array import array
leds = [
Pin( 0, Pin.OUT, value=0),
Pin( 1, Pin.OUT, value=0),
Pin( 2, Pin.OUT, value=0),
Pin( 3, Pin.OUT, value=0),
Pin( 4, Pin.OUT, value=0),
Pin( 5, Pin.OUT, value=0),
Pin( 6, Pin.OUT, value=0),
Pin( 7, Pin.OUT, value=0),
Pin( 8, Pin.OUT, value=0),
Pin( 9, Pin.OUT, value=0),
Pin( 10, Pin.OUT, value=0),
Pin( 11, Pin.OUT, value=0),
Pin( 12, Pin.OUT, value=0),
Pin( 13, Pin.OUT, value=0),
Pin( 14, Pin.OUT, value=0),
Pin( 15, Pin.OUT, value=0),
Pin( 16, Pin.OUT, value=0),
Pin( 17, Pin.OUT, value=0)]
et voici le code pour les allumer tous
for i in range(0, 18):
leds[i].value(1)
et pour les éteindre
for i in range(0, 18):
leds[i].value(0)
Maintenant, nous allons créer quelques fonctions pour réaliser des animations. Vous aurez besoin de deux autres librairies utime pour la mesure du temps et random pour la génération de nombre aléatoire.
from machine import Pin #importe la librairie du Pi Pico
import utime #importe la librairie mesurant le temps
import random #importe la librairie générant des nombres pseudo-aléatoires
from array import array #importe la librairie pour les tableaux
onrun
Cette fonction utilise le principe du chenillard, elle allume chaque LED les unes après les autres dans un sens prédéfini. Nous utiliserons trois paramètres.
- duty : durée d'allumage de chaque LED
- flag : sens du déplacement True -> droite vers la gauche, False -> gauche vers la droite
- ar : Aller-retour, l'allumage de la LED revient à son point d'origine.
Voici le code
from machine import Pin #importe la librairie du Pi Pico
import utime #importe la librairie mesurant le temps
import random #importe la librairie générant des nombres pseudo-aléatoires
from array import array
#initialisation des LED du GP0 au GP17
#
leds = [
Pin( 0, Pin.OUT, value=0),
Pin( 1, Pin.OUT, value=0),
Pin( 2, Pin.OUT, value=0),
Pin( 3, Pin.OUT, value=0),
Pin( 4, Pin.OUT, value=0),
Pin( 5, Pin.OUT, value=0),
Pin( 6, Pin.OUT, value=0),
Pin( 7, Pin.OUT, value=0),
Pin( 8, Pin.OUT, value=0),
Pin( 9, Pin.OUT, value=0),
Pin( 10, Pin.OUT, value=0),
Pin( 11, Pin.OUT, value=0),
Pin( 12, Pin.OUT, value=0),
Pin( 13, Pin.OUT, value=0),
Pin( 14, Pin.OUT, value=0),
Pin( 15, Pin.OUT, value=0),
Pin( 16, Pin.OUT, value=0),
Pin( 17, Pin.OUT, value=0)]
def clearall():
#Extinction des LED
for i in range(0, 18):
leds[i].value(0)
def fillall():
#Allumage des LED
for i in range(0, 18):
leds[i].value(1)
#
# routine onrun
def onrun(duty, flag, ar):
if flag:
for i in range(0, 18):
clearall()
leds[i].value(1)
utime.sleep(duty)
if ar:
for i in range(17, -1, -1):
clearall()
leds[i].value(1)
utime.sleep(duty)
else:
for i in range(17, -1, -1):
clearall()
leds[i].value(1)
utime.sleep(duty)
if ar:
for i in range(0, 18):
clearall()
leds[i].value(1)
utime.sleep(duty)
# test
clearall()
duty = random.randint(20, 50)
onrun((duty / 1000), True, True);
utime.sleep(0.5)
clearall()
duty = random.randint(20, 50)
onrun((duty / 1000), True, False);
utime.sleep(0.5)
clearall()
duty = random.randint(20, 50)
onrun((duty / 1000), False, True);
utime.sleep(0.5)
clearall()
duty = random.randint(20, 50)
onrun((duty / 1000), False, False);
utime.sleep(0.5)
clearall()
Démo
alternate
Autre style de chenillard, on allume les LED une sur deux.
Nous utiliserons trois paramètres.
- duty : durée d'allumage de chaque LED
- flag : sens du déplacement True -> droite vers la gauche, False -> gauche vers la droite
- nb : nombre de déplacements
Voici le code
from machine import Pin #importe la librairie du Pi Pico
import utime #importe la librairie mesurant le temps
import random #importe la librairie générant des nombres pseudo-aléatoires
from array import array
#initialisation des LED du GP0 au GP17
#
leds = [
Pin( 0, Pin.OUT, value=0),
Pin( 1, Pin.OUT, value=0),
Pin( 2, Pin.OUT, value=0),
Pin( 3, Pin.OUT, value=0),
Pin( 4, Pin.OUT, value=0),
Pin( 5, Pin.OUT, value=0),
Pin( 6, Pin.OUT, value=0),
Pin( 7, Pin.OUT, value=0),
Pin( 8, Pin.OUT, value=0),
Pin( 9, Pin.OUT, value=0),
Pin( 10, Pin.OUT, value=0),
Pin( 11, Pin.OUT, value=0),
Pin( 12, Pin.OUT, value=0),
Pin( 13, Pin.OUT, value=0),
Pin( 14, Pin.OUT, value=0),
Pin( 15, Pin.OUT, value=0),
Pin( 16, Pin.OUT, value=0),
Pin( 17, Pin.OUT, value=0)]
def clearall():
#Extinction des LED
for i in range(0, 18):
leds[i].value(0)
def fillall():
#Allumage des LED
for i in range(0, 18):
leds[i].value(1)
#
# routine alternate
def alternate(duty, flag, nb):
if flag:
for i in range(1, nb):
clearall()
for j in range(0, 17, 2):
leds[j].value(1)
utime.sleep(duty)
clearall()
for j in range(1, 18, 2):
leds[j].value(1)
utime.sleep(duty)
clearall()
else:
for i in range(1, nb):
clearall()
for j in range(17, 0, -2):
leds[j].value(1)
utime.sleep(duty)
clearall()
for j in range(16, 1, -2):
leds[j].value(1)
utime.sleep(duty)
clearall()
# test
clearall()
duty = random.randint(80, 100)
nb = random.randint(2,6)
alternate((duty / 1000), True, nb);
utime.sleep(0.5)
clearall()
duty = random.randint(80, 100)
nb = random.randint(2,6)
alternate((duty / 1000), False, nb);
utime.sleep(0.5)
clearall()
Démo
flash
Cette fonction fait clignoter toutes les LED en fonction du nombre de fois déterminé par une boucle for.
Nous utiliserons deux paramètres.
- duty : durée d'allumage de chaque LED
- nb : nombre de clignotements
Voici le code
from machine import Pin #importe la librairie du Pi Pico
import utime #importe la librairie mesurant le temps
import random #importe la librairie générant des nombres pseudo-aléatoires
from array import array
#initialisation des LED du GP0 au GP17
#
leds = [
Pin( 0, Pin.OUT, value=0),
Pin( 1, Pin.OUT, value=0),
Pin( 2, Pin.OUT, value=0),
Pin( 3, Pin.OUT, value=0),
Pin( 4, Pin.OUT, value=0),
Pin( 5, Pin.OUT, value=0),
Pin( 6, Pin.OUT, value=0),
Pin( 7, Pin.OUT, value=0),
Pin( 8, Pin.OUT, value=0),
Pin( 9, Pin.OUT, value=0),
Pin( 10, Pin.OUT, value=0),
Pin( 11, Pin.OUT, value=0),
Pin( 12, Pin.OUT, value=0),
Pin( 13, Pin.OUT, value=0),
Pin( 14, Pin.OUT, value=0),
Pin( 15, Pin.OUT, value=0),
Pin( 16, Pin.OUT, value=0),
Pin( 17, Pin.OUT, value=0)]
def clearall():
#Extinction des LED
for i in range(0, 18):
leds[i].value(0)
def fillall():
#Allumage des LED
for i in range(0, 18):
leds[i].value(1)
#
# routine flash
def flash(duty, nb):
for i in range(1, nb):
clearall()
utime.sleep(duty)
fillall()
utime.sleep(duty)
# test
clearall()
duty = random.randint(80, 100)
nb = random.randint(2,6)
flash((duty / 1000), nb);
utime.sleep(0.5)
clearall()
duty = random.randint(80, 100)
nb = random.randint(2,6)
flash((duty / 1000), nb);
Démo
stack
Nous continuons par une fonction plus compliquée. Une animation de LED par empilement de LED allumées.
Nous utiliserons deux paramètres.
- duty : durée d'allumage de chaque LED
- flag : sens du déplacement True -> droite vers la gauche, False -> gauche vers la droite
Voici le code
from machine import Pin #importe la librairie du Pi Pico
import utime #importe la librairie mesurant le temps
import random #importe la librairie générant des nombres pseudo-aléatoires
from array import array
#initialisation des LED du GP0 au GP17
#
leds = [
Pin( 0, Pin.OUT, value=0),
Pin( 1, Pin.OUT, value=0),
Pin( 2, Pin.OUT, value=0),
Pin( 3, Pin.OUT, value=0),
Pin( 4, Pin.OUT, value=0),
Pin( 5, Pin.OUT, value=0),
Pin( 6, Pin.OUT, value=0),
Pin( 7, Pin.OUT, value=0),
Pin( 8, Pin.OUT, value=0),
Pin( 9, Pin.OUT, value=0),
Pin( 10, Pin.OUT, value=0),
Pin( 11, Pin.OUT, value=0),
Pin( 12, Pin.OUT, value=0),
Pin( 13, Pin.OUT, value=0),
Pin( 14, Pin.OUT, value=0),
Pin( 15, Pin.OUT, value=0),
Pin( 16, Pin.OUT, value=0),
Pin( 17, Pin.OUT, value=0)]
def clearall():
#Extinction des LED
for i in range(0, 18):
leds[i].value(0)
def fillall():
#Allumage des LED
for i in range(0, 18):
leds[i].value(1)
def stack(duty, flag):
if flag:
s = 0
while s <= 17:
pos = 0
while pos <= (17-s):
clearall()
leds[pos].value(1)
drawstack(s, flag)
utime.sleep(duty)
pos = pos + 1
s = s + 1
else:
s=17
while s >= 0:
pos = 17
while pos >= (17-s):
clearall()
leds[pos].value(1)
drawstack(s, flag)
utime.sleep(duty)
pos = pos - 1
s = s - 1
def drawstack(s, flag):
if flag:
i = 17
while i > (17-s):
if i >= 0:
leds[i].value(1)
i = i - 1
else:
i = 0
while i <= (16-s):
if i >= 0:
leds[i].value(1)
i = i + 1
# test
clearall()
duty = random.randint(20, 50)
stack((duty / 1000), True);
utime.sleep(0.5)
clearall()
duty = random.randint(20, 50)
stack((duty / 1000), False);
utime.sleep(0.5)
clearall()
Démo
stack1
Nous terminons par une fonction plus simple un dérivé de la fonction onrun que l'on nommera stack1.
Nous utiliserons deux paramètres.
- duty : durée d'allumage de chaque LED
- flag : sens du déplacement True -> droite vers la gauche, False -> gauche vers la droite
Voici le code
from machine import Pin #importe la librairie du Pi Pico
import utime #importe la librairie mesurant le temps
import random #importe la librairie générant des nombres pseudo-aléatoires
from array import array #importe la librairie pour les tableaux
#initialisation des LED du GP0 au GP17
#
leds = [
Pin( 0, Pin.OUT, value=0),
Pin( 1, Pin.OUT, value=0),
Pin( 2, Pin.OUT, value=0),
Pin( 3, Pin.OUT, value=0),
Pin( 4, Pin.OUT, value=0),
Pin( 5, Pin.OUT, value=0),
Pin( 6, Pin.OUT, value=0),
Pin( 7, Pin.OUT, value=0),
Pin( 8, Pin.OUT, value=0),
Pin( 9, Pin.OUT, value=0),
Pin( 10, Pin.OUT, value=0),
Pin( 11, Pin.OUT, value=0),
Pin( 12, Pin.OUT, value=0),
Pin( 13, Pin.OUT, value=0),
Pin( 14, Pin.OUT, value=0),
Pin( 15, Pin.OUT, value=0),
Pin( 16, Pin.OUT, value=0),
Pin( 17, Pin.OUT, value=0)]
def clearall():
#Extinction des LED
for i in range(0, 18):
leds[i].value(0)
def fillall():
#Allumage des LED
for i in range(0, 18):
leds[i].value(1)
def stack1(duty, flag):
if flag:
clearall()
for i in range(0, 18):
leds[i].value(1)
utime.sleep(duty)
for i in range(0, 18):
leds[i].value(0)
utime.sleep(duty)
else:
clearall()
for i in range(17, -1, -1):
leds[i].value(1)
utime.sleep(duty)
for i in range(17, -1, -1):
leds[i].value(0)
utime.sleep(duty)
clearall()
clearall()
# test
duty = random.randint(20, 50)
stack1((duty / 1000), True);
utime.sleep(1)
clearall()
duty = random.randint(20, 50)
stack1((duty / 1000), False);
utime.sleep(1)
clearall()
Démo
Conclusion
Maintenant que nos fonctions sont toutes réalisées, on peut réaliser une petite démo comme ci-dessous.
clearall()
# boucle principale
while True:
choix = random.randint(4,4)
if choix == 0:
duty = random.randint(20, 50)
flag = random.choice([True,False])
ar = random.randint(0, 1)
onrun((duty / 1000), flag, ar)
elif choix == 1:
duty = random.randint(80, 100)
flag = random.choice([True,False])
nb = random.randint(1, 6)
alternate((duty / 1000), flag, nb);
elif choix == 2:
duty = random.randint(80, 100)
nb = random.randint(1, 6)
flash((duty / 1000), nb);
elif choix == 3:
duty = random.randint(80, 100)
flag = random.choice([True,False])
stack((duty / 1000), flag);
elif choix == 4:
duty = random.randint(20, 50)
flag = random.choice([True,False])
stack1((duty / 1000), flag)
Dans le prochain article, nous utiliserons le mode PWM qui nous permettra de moduler l'intensité lumineuse de nos LED.