Mode PWM (modulation du signal)

C'est bien tout ça, mais comment utiliser des luminosités variables avec PWM ? On va utiliser le code suivant. Attention, ne pas oublier la librairie PWM. Contrairement à la première méthode, nous ne pourrons pas utiliser les broches GP16 et 17 puisqu'elles utilisent le même PWM que les broches GP0 et GP1

from machine import Pin, PWM
from array import array

leds = [
    PWM(Pin(0)),
    PWM(Pin(1)),
    PWM(Pin(2)),
    PWM(Pin(3)),
    PWM(Pin(4)),
    PWM(Pin(5)),
    PWM(Pin(6)),
    PWM(Pin(7)),
    PWM(Pin(8)),
    PWM(Pin(9)),
    PWM(Pin(10)),
    PWM(Pin(11)),
    PWM(Pin(12)),
    PWM(Pin(13)),
    PWM(Pin(14)),
    PWM(Pin(15))]

Il faudra paramétrer la fréquence (freq) et la longueur d'impulsion (duty_u16) avec le code suivant.

for i in range (0, 15):
    leds[i].freq(1_000)
    leds[i].duty_u16(0)

La longueur d'impulsion étant à zéro, les LED seront éteintes. La valeur max de duty_u16 est de 65535 pour le Pi Pico. Voici maintenant, les différents mode de fonctionnement. Tout d'abord, les fonctions pour allumer ou éteindre toutes les Leds

def led_low(pos):
    # extinction LED
    leds[pos].duty_u16(0)
    
def led_high(pos):
    # allumage LED
    leds[pos].duty_u16(65535)
    
def clearall():
    #Extinction des LEDs
    for i in range(0, 16):
        led_low(i)
        
def fillall():
    #Allumage des LEDs
    for i in range(0, 16):
        led_high(i)

Fonctions onrun, alternate, flash, stack et stack1

Ces procédures sont modifiées pour les adapter au 15 LED comme ci-dessous.

def onrun(duty, flag, ar):
    if flag:
        for i in range(0, 16):
            clearall()
            led_high(i)
            utime.sleep(duty)
        if ar:
            for i in range(15, -1, -1):
                clearall()
                led_high(i)
                utime.sleep(duty)
    else:
        for i in range(15, -1, -1):
            clearall()
            led_high(i)
            utime.sleep(duty)
        if ar:
            for i in range(0, 16):
                clearall()
                led_high(i)
                utime.sleep(duty)
        
        
def alternate(duty, flag, nb):
    if flag:
        for i in range(1, nb):
            clearall()
            for j in range(0, 15, 2):
                led_high(j)
                utime.sleep(duty)
            clearall()
            for j in range(1, 16, 2):    
                led_high(j)
                utime.sleep(duty)
            clearall()
    else:
        for i in range(1, nb):
            clearall()
            for j in range(15, -1, -2):    
                led_high(j)
                utime.sleep(duty)
            clearall()
            for j in range(14, -2, -2):    
                led_high(j)
                utime.sleep(duty)
            clearall()        
            
def flash(duty, nb):
    for i in range(1, nb):
        clearall()
        utime.sleep(duty)
        fillall()
        utime.sleep(duty)
        
def stack(duty, flag):
    if flag:
        s = 0
        while s <= 15:
            pos = 0
            while pos <= (15-s):
                clearall()
                led_high(pos)
                drawstack(s, flag)
                utime.sleep(duty)
                pos = pos +1
            s = s + 1
    else:
        s=15
        while s >= 0:
            pos = 15
            while pos >= (15-s):
                clearall()
                led_high(pos)
                drawstack(s, flag)
                utime.sleep(duty)
                pos = pos - 1
            s = s - 1
        
        
def drawstack(s, flag):
    if flag:
        i = 15
        while i > (15-s):
            if i >= 0:
                led_high(i)
            i = i - 1
    else:
        i = 0
        while i <= (14-s):
            if i >= 0:
                led_high(i)
            i = i + 1

def stack1(duty, flag):
    if flag:
        clearall()
        for i in range(0, 16):
            led_high(i)
            utime.sleep(duty)    
        for i in range(0, 16):
            led_low(i)
            utime.sleep(duty)    
    else:
        clearall()
        for i in range(15, -1, -1):
            led_high(i)
            utime.sleep(duty)    
        for i in range(15, -1, -1):
            led_low(i)
            utime.sleep(duty) 

Les fonctions PWM

Maintenant passons aux fonctions utilisant le mode PWM.

fadeflash

Nous commencerons par la routine fadeflash. Les LEDs vont s'allumer et s'éteindre progressivement selon une durée choisie par l'utilisateur avec le paramètre duty.

from machine import Pin, PWM #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
#mode PWM
leds = [
    PWM(Pin(0)),
    PWM(Pin(1)),
    PWM(Pin(2)),
    PWM(Pin(3)),
    PWM(Pin(4)),
    PWM(Pin(5)),
    PWM(Pin(6)),
    PWM(Pin(7)),
    PWM(Pin(8)),
    PWM(Pin(9)),
    PWM(Pin(10)),
    PWM(Pin(11)),
    PWM(Pin(12)),
    PWM(Pin(13)),
    PWM(Pin(14)),
    PWM(Pin(15))]
   
def led_low(pos):
    leds[pos].duty_u16(0)
    
def led_high(pos):
    leds[pos].duty_u16(65535)
    
def clearall():
    #Extinction des LED
    for i in range(0, 16):
        led_low(i)
        
def fillall():
    #Allumage des LED
    for i in range(0, 16):
        led_high(i)

def fadeflash(duty):
    clearall()
    newdelay = duty / 5;
    for i in range(0, 65535, 1285):
        for pos in range(0, 16):
           leds[pos].duty_u16(i)
        utime.sleep(newdelay)
    for i in range(65535, -1285, -1285):
        for pos in range(0, 16):
           leds[pos].duty_u16(i)
        utime.sleep(newdelay)

######################
#  Programme
######################
# initialisation PMW
for i in range (0, 16):
    leds[i].freq(1_000)    
    
clearall()

#test
for i in range(0,5):
        duty = random.randint(80, 100)
        fadeflash((duty / 1000));

Démo

fadealter

Cette fonction allume et éteint alternativement et progressivement selon une durée choisie par l'utilisateur avec le paramètre duty.

from machine import Pin, PWM #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
#mode PWM
leds = [
    PWM(Pin(0)),
    PWM(Pin(1)),
    PWM(Pin(2)),
    PWM(Pin(3)),
    PWM(Pin(4)),
    PWM(Pin(5)),
    PWM(Pin(6)),
    PWM(Pin(7)),
    PWM(Pin(8)),
    PWM(Pin(9)),
    PWM(Pin(10)),
    PWM(Pin(11)),
    PWM(Pin(12)),
    PWM(Pin(13)),
    PWM(Pin(14)),
    PWM(Pin(15))]
   
def led_low(pos):
    leds[pos].duty_u16(0)
    
def led_high(pos):
    leds[pos].duty_u16(65535)
    
def clearall():
    #Extinction des LED
    for i in range(0, 16):
        led_low(i)
        
def fillall():
    #Allumage des LED
    for i in range(0, 16):
        led_high(i)

def fadealter(duty):
    clearall()
    newdelay = duty / 5;
    for i in range(0, 65535, 1285):
        for pos in range(0, 15, 2):
           leds[pos].duty_u16(i)
        for pos in range(1, 16, 2):
           leds[pos].duty_u16(65535-i)
        utime.sleep(newdelay)
    for i in range(65535, -1285, -1285):
        for pos in range(0, 15, 2):
           leds[pos].duty_u16(i)
        for pos in range(1, 16, 2):
           leds[pos].duty_u16(65535-i)
        utime.sleep(newdelay)
    clearall()

######################
#  Programme
######################
# initialisation PMW
for i in range (0, 16):
    leds[i].freq(1_000)    
    
clearall()

#test
for i in range(0,5):
        duty = random.randint(80, 100)
        fadealter((duty / 1000));

Démo

campfire

Dernière fonction, celle-ci allume aléatoirement et avec une luminosité aléatoire un certain nombre de LEDs pendant un certain temps généré par une boucle for. Nous utiliserons deux paramètres.

  1. duty : durée d'allumage de chaque LED
  2. nb : durée du temps général généré par la boucle for

Voici le code

from machine import Pin, PWM #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
#mode PWM
leds = [
    PWM(Pin(0)),
    PWM(Pin(1)),
    PWM(Pin(2)),
    PWM(Pin(3)),
    PWM(Pin(4)),
    PWM(Pin(5)),
    PWM(Pin(6)),
    PWM(Pin(7)),
    PWM(Pin(8)),
    PWM(Pin(9)),
    PWM(Pin(10)),
    PWM(Pin(11)),
    PWM(Pin(12)),
    PWM(Pin(13)),
    PWM(Pin(14)),
    PWM(Pin(15))]
   
def led_low(pos):
    leds[pos].duty_u16(0)
    
def led_high(pos):
    leds[pos].duty_u16(65535)
    
def clearall():
    #Extinction des LED
    for i in range(0, 16):
        led_low(i)
        
def fillall():
    #Allumage des LED
    for i in range(0, 16):
        led_high(i)

def campfire(nb, duty):
    clearall()
    for i in range(nb):
        j = random.randint(0, 15)
        duty1 = random.randint(0, 47)
        leds[j].duty_u16(int((duty1/100)*30_840)) 
        utime.sleep_ms(random.randint(0, duty))
    clearall()

######################
#  Programme
######################
# initialisation PMW
for i in range (0, 16):
    leds[i].freq(1_000)    
    
clearall()

#test
duty = random.randint(20, 50)
nb = random.randint(600, 800)
campfire(nb, duty)

Démo

Il vous reste à réaliser vos propres montages. Si je trouve de nouvelles fonctions, je me ferais un plaisir de les rajouter. Amusez-vous bien.