Fading LED utilisant PWM avec GPIO Zero sur le Raspberry Pi

fading_leds

Le projet

GPIO zéro, la nouvelle bibliothèque GPIO de la Raspberry Pi Foundation, devient ma méthode de prédilection pour faire des choses simples avec les broches GPIO du Pi. Ces dernières semaines, je me suis amusé à préparer l’exposition Bett, et plus particulièrement la Raspberry Jam qui s’y tient le 23 janvier.

Une partie de mon exposition est un Raspberry Pi Zero avec un Scroll pHAT attaché. Faire fonctionner cela était une histoire en soi, mais je veux me concentrer aujourd’hui sur les 4 LED que j’ai soudées sur une carte de prototypage qui est attachée au Zero. Vous pouvez les voir dans l’image ci-dessus.

Retour à GPIO Zero. Il contient une classe appelée PWMLED qui vous permet de faire du logiciel PWM avec LED. Cela signifie qu’au lieu de simplement les faire clignoter, vous pouvez les faire disparaître. Cela prend un peu de temps (sauf si j’ai manqué quelque chose), alors j’ai pensé partager avec vous ma méthode. Une chose à comprendre est que je l’ai fait dans un «  fil  », ce qui signifie que pendant que le Scroll pHAT fait son travail d’affichage des messages, je peux faire en sorte que les LED fassent quelque chose de déconnecté de ce processus. Cependant, les fonctions individuelles peuvent être supprimées de l’intérieur de l ‘«objet» de filetage si vous n’avez rien d’autre à faire que d’impulser les LED.

Voici une vidéo pour prouver que cela fonctionne!

YouTube video

Le code

Anyhoo. Voici le code. (J’ai supprimé tout ce qui concerne le Scroll pHAT) (Vous pouvez ignorer ce bit et aller directement à la audacieux peu à télécharger le code depuis Github.

Tout d’abord, importons les bibliothèques:

import time, threading, random
from gpiozero import LED, PWMLED

Maintenant, définissons les LED:

# Set-up LEDs
led_red = PWMLED(17)
led_yellow = PWMLED(27)
led_green = PWMLED(22)
led_blue = PWMLED(10)

Maintenant, afin d’obtenir une action de fondu en douceur, nous allons vouloir faire une boucle de 0 à 1 en utilisant une valeur ‘float’ (décimale). (0,1… 0,2… 0,3… 0,4… etc.). Nous ne pouvons pas faire cela sans une fonction d’assistance. Notez que Python ne semble pas très bien faire la soustraction de flotteurs, donc j’ai trouvé que je devais arrondir les flotteurs à une décimale juste pour que le jeu soit agréable! S’il me manque quelque chose, laissez un commentaire!

# Helper function to iterate over a float
def frange(start, stop, step):
  i = start
 
  if (start < stop):
    while i <= stop:
      yield i
      i += step
      # For some reason, += doesn't always add an exact decimal, so we have to round the value
      i = round(i, 1)
  else:
    while i >= stop:
      yield i
      i += step
      # For some reason, += doesn't always add an exact decimal, so we have to round the value
      i = round(i, 1)

Définissons maintenant une classe que nous pouvons démarrer dans le cadre d’un nouveau thread:

class RandomLEDs(threading.Thread):
  def __init__(self, threadID, name):
    threading.Thread.__init__(self)
    self.threadID = threadID
    self.name = name

  def run(self):
    while True:
      led_list = [led_blue,led_yellow,led_green,led_red]
      the_led = random.choice(led_list)
      self.fade_in_led(the_led, 0.03)
      time.sleep(0.3)
      self.fade_out_led(the_led, 0.02)
      time.sleep(0.3)

  # PWM the LED value from 0 to 1 (or from 1 to 0) with a 0.1 step
  def fade_in_led(self, led, speed):
    for i in frange(0.0, 1.0, 0.1):
      led.value = i
      time.sleep(speed)

  def fade_out_led(self, led, speed):
    for i in frange(1.0, 0.0, -0.1):
      led.value = i
      time.sleep(speed)

Maintenant, commençons le tout:

# Start independent threads
# This one lights up random LEDs
thread1 = RandomLEDs(1, "Thread-1")
thread1.start()

J’espère que tous les retraits se sont bien déroulés (je viens de passer les 10 dernières minutes à mettre des espaces, alors j’espère que oui).

TL; DR

Si vous souhaitez télécharger le code, procédez comme suit:

git clone https://github.com/recantha/scroller

Et le fichier que vous voulez est pwm_leds.py

Vous pouvez l’exécuter en faisant:

python3 pwm_leds.py

Retour d’information

Je serais très heureux de recevoir vos commentaires sur mon code et mon approche. je attendre qu’il existe un moyen beaucoup plus simple de le faire – la boucle flottante mérite un peu d’attention, par exemple – mais c’est ce que j’ai commencé à travailler! En tout cas, j’espère que vous avez trouvé le post intéressant! ?

  • Freenove Breakout Board for Raspberry Pi 5 / 4B / 3B+ / 3B / 3A+ / 2B / 1B+ / 1A+ / Zero W/Zero, Terminal Block Hat, GPIO Status LED
    Compatible models -> Raspberry Pi 5 / 4B / 3B+ / 3B / 3A+ / 2B / 1B+ / 1A+ / Zero W / Zero. (Note: NOT compatible with Raspberry Pi 400.) GPIO status LED -> LED on if GPIO outputs/inputs high level, LED off if GPIO outputs/inputs low level. Independent LED -> The status LED is driven by the chip instead of the GPIO so the GPIO will not be affected. Terminal block and header -> Connect to all pins of Raspberry Pi's 40-pin GPIO header, 2.54mm / 0.1in pitch. GPIO name -> The BCM numbering name of each GPIO is printed next to the port.
  • Geekworm 2x20 40 Pin Stacking Female Header Kit for Raspberry Pi 5 / Raspberry Pi 4 / 3B+ / 3B / 2B / B+ / Zero (Zero W) (4 Specifications), Raspberry Pi GPIO Stacking Header/Extender
    Packing List: 2 * 2x20 Female Header (Pin Len: 12mm), 2 * 2x20 Female Header (Pin Len: 10.7mm), 2 * 2x20 Female Header (Pin Len: 5.5mm), 2 * 2x20 Pin Header The 2x20 Pin Header is for Raspberry Pi Zero / Zero W. Material: Insulated plastic, hard metal pin Application: Widely be used in Raspberry Pi DIY project, such as for electronic circuit, PCB circuit board etc. electronic project Stacking header for Raspberry Pi 4, Pi 3, Pi 2, Pi Model B+, Pi A+, Pi Zero, Pi Zero W
  • GeeekPi pour Raspberry Pi Zero/Zero W, démarrage Kit avec Acrylique Raspberry Pi Zero Case, en-tête GPIO 20 Broches, Câble OTG, Câble de commutateur, Adaptateur HDMI, radiateur et Tournevis (Noir)
    Compatible avec Raspberry Pi Zero et Raspberry Pi Zero W (la carte Raspberry Pi Zero n'est pas incluse) Le dissipateur thermique est pour une meilleure dissipation thermique et l'en-tête GPIO facilite la connexion des ports GPIO. Boîtier en acrylique avec 2 couvercles et vis à installer. Accès à tous les ports du Raspberry Pi Zero Board. Le forfait comprend un étui, un dissipateur thermique, un câble de commutation, un câble OTG, un adaptateur HDMI, un en-tête GPIO et un tournevis.