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.

cablage pico 16leds

Voici mon montage réalisé avec des fils cavalier pour platine d'essai.

montage pico 16led

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.

  1. duty : durée d'allumage de chaque LED
  2. flag : sens du déplacement True -> droite vers la gauche, False -> gauche vers la droite
  3. 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.

  1. duty : durée d'allumage de chaque LED
  2. flag : sens du déplacement True -> droite vers la gauche, False -> gauche vers la droite
  3. 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.

  1. duty : durée d'allumage de chaque LED
  2. 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.

  1. duty : durée d'allumage de chaque LED
  2. 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.

  1. duty : durée d'allumage de chaque LED
  2. 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.