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.
- duty : durée d'allumage de chaque LED
- 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.
ceci est un test