L’un des nombreux projets de Raspberry Pi est l’éclairage de chambres ou d’objets. Les bandes de LED sont particulièrement adaptées à cette fin, car de nombreuses LED individuelles sont alignées et chaque LED individuelle peut afficher toutes les couleurs RGB. Ainsi, certains projets tels que l’éclairage de chambre, Lumière ambiante ou par exemple l’éclairage d’un arbre de Noël peuvent être réalisés. Les effets des lumières colorées sont impressionnants.
Cet article montre l’utilisation générale du WS2801B sur le Raspberry Pi. Ce faisant, nous créons un exemple dans lequel les LED de la bande sont placées (couleurs arc-en-ciel) et la luminosité est diminuée. Dans la vidéo à la fin du tutoriel, vous pouvez voir le tout en action.
Équipement
Les bandes de LED RGB nécessitent une tension d’entrée de 5 V. La variante la plus avantageuse avec 32 LED par mètre a une distance entre les LED de seulement 2,5 cm :
- Bande LED WS2801B avec 32 LED par mètre
Il existe également des versions résistantes à la poussière et à l’eau (IP67). Chacune des LED a une consommation de courant d’environ 60 mA. À un mètre, ceci est presque 2A. C’est bien plus que ce que les GPIO de Raspberry Pi peuvent fournir. Nous avons donc besoin d’une source de courant externe qui alimente la bande RGB. Selon la longueur de votre bande, le courant maximum doit être plus élevé. L’alimentation doit donc être capable de fournir 10A à 5 mètres.
Vous avez le choix entre deux possibilités :
- Pour les débutants : Adaptateur d’alimentation + connecteur plug-in (c.f. image à droite)
- Pour les personnes expérimentées : Branchement de l’alimentation électrique + Fil d’alimentation
La différence est qu’un câble d’alimentation doit être déconnecté puis connecté à l’alimentation à découpage. Comme il est dangereux de travailler avec des tensions élevées, cela n’est pas recommandé aux débutants. Pour une alimentation électrique (similaire à celle des chargeurs d’ordinateurs portables), vous n’avez besoin que d’un adaptateur Power Jack supplémentaire, afin de pouvoir détacher les deux pôles de tension.
Enfin, des câbles de démarrage et une breadboard (ebay) sont nécessaires.
WS2801B vs. WS2812B
Les bandes LED WS2812 se trouvent souvent sur Internet et sont également un peu moins chères que les modèles WS2801. Cependant, elles ne sont pas toutes très bonnes pour le Raspberry Pi, puisque la sortie audio embarquée du Raspberry Pi ne peut plus être utilisée. Cependant, je vais écrire un autre tutoriel sur l’utilisation des bandes de LED WS2812.
Les bandes WS2801B ont deux lignes de données (données et horloge), ce qui permet d’adresser les LEDs individuelles via le bus SPI intégré du Raspberry Pi. Ceci est différent pour les modèles WS2812B. Ces barrettes n’ont qu’une seule broche de données, c’est pourquoi il faut en calculer beaucoup plus avant d’envoyer. C’est pourquoi les bandes de LED WS2801B RGB sont préférables à la WS2812 pour l’utilisation sur le Raspberry Pi, malgré leur soi-disant plus petit « numéro de série ».
Connecter l’alimentation à commutateur au WS2801
Avant de commencer, nous devons connecter la source de courant (uniquement pour l’alimentation enfichable). Si vous avez choisi la première variante – une alimentation de type chargeur – vous pouvez passer au point suivant. Il vous suffit de fixer l’adaptateur à l’alimentation électrique et de desserrer les vis.
Puisque ce tutoriel est principalement copié par des débutants, le texte suivant ne convient pas! Veuillez utiliser uniquement une alimentation électrique sûre.
Tout d’abord : Travailler avec une tension de 230V peut être mortel ! Pendant que vous effectuez des modifications, tous les raccordements à la prise doivent être débranchés ! Faites attention et ne travaillez avec elle que si vous êtes sûr de votre cause. Si ce n’est pas le cas, je recommande la première alimentation électrique.
Nous commençons par sectionner le câble d’alimentation (par ex. un vieux câble d’alimentation pour PC). Il y a deux ou trois câbles à l’intérieur. Ceux-ci doivent être soigneusement séparés d’environ 1 cm de l’isolation, de sorte que seul le fil soit visible dans les câbles. L’alimentation à découpage a trois connexions sur le côté gauche. D’une part, « L » (phase / conducteur extérieur) et « N » (conducteur neutre), qui sont marqués avec AC (courant alternatif) et un symbole de mise à la terre. Si votre câble ne contient que deux câbles plus petits, ils seront connectés aux connecteurs CA. S’il y en a trois, vous devez également identifier le câble de terre et le raccorder au symbole de mise à la terre / connecteur « PE ».
Comme les couleurs des câbles internes diffèrent avec les câbles d’alimentation plus anciens, voici un bref aperçu de la couleur :
- Le câble noir ou brun arrive au conducteur extérieur « L« .
- Le câble bleu est connecté au conducteur neutre « N« .
- Le câble vert-jaune est connecté au conducteur de protection « PE » ou symbole de mise à la terre
Pour le raccordement des câbles, les vis de l’alimentation doivent être desserrées. Ensuite, placez les fils sous les vis. Veillez à ce qu’ils soient bien vissés et que les câbles ne puissent pas se détacher. Normalement, ces appareils ont encore un petit rabat de protection, afin que vous ne les touchiez pas accidentellement. Si vous voulez être sûr, vous pouvez également enrouler du ruban isolant autour des points sensibles.
De l’autre côté, il y a la tension sortante de 5V (+V) et les connexions de terre (-V ou COM). Comme test, vous pouvez utiliser un multimètre pour mesurer la tension comme indiqué ici:
Câblage entre Raspberry Pi, WS2801 et la source de courant
Normalement, les bandes de LED sont livrées avec des fiches soudées, qui sont destinées à la connexion de plusieurs bandes WS2801. De plus, il y a généralement une fiche qui peut être placée sur un Breadboard (4 câbles connectés). En outre, deux câbles supplémentaires pour le raccordement de l’alimentation externe de la bande de LED (rouge et noir) sont souvent utilisés.
Puisque la couleur du câble ne correspond pas nécessairement aux normes, vous devez faire attention à quel câble mène exactement à quelle connexion sur la bande. Un mauvais câblage sur le Raspberry Pi peut entraîner une surchauffe ou un court-circuit.
Si vous savez quel câble conduit à quelle connexion, nous pouvons le brancher. Le Raspberry Pi doit être éteint et l’alimentation à découpage ne doit pas être connectée à la prise de courant. Les câbles sont raccordés comme suit:
WS2801 Bande LED | Raspberry Pi | (Commutation) d’alimentation électrique |
---|---|---|
5V | — | +V |
CK / CI | Broche 23 (SCKL) | — |
SI / DI | Broche 19 (MOSI) | — |
GND | Broche 6 (GND) | -V ou COM |
Pour le raccordement à l’alimentation à découpage, vous pouvez également utiliser les deux câbles supplémentaires (si disponibles). Il est important que GND / masse soit connecté à la fois au Raspberry Pi et de l’alimentation externe. La structure ressemble maintenant comme suit :
Installation de la bibliothèque de LED RGB WS2801 Raspberry Pi
Pour contrôler la bande de LED, nous utilisons une bibliothèque Python à partir de Adafruit. Cette bibliothèque spéciale Raspberry Pi WS2801 comprend quelques fonctions pour la commande des différentes LED. L’avantage est que chaque LED peut être adressée individuellement et toute coleur RVB est possible.
La bibliothèque nécessite le port SPI, que nous devons activer (si ce n’est déjà fait). Nous appelons ce qui suit:
sudo raspi-config
Sous « Option avancée » il y a un point pour « SPI ». Nous l’activons et quittons le menu de configuration.
L’installation fonctionne maintenant tout simplement via le gestionnaire de paquets Python depuis la console / le terminal normal. À titre préventif, nous commençons par mettre à jour les sources du paquet et par installer PIP (qui n’est pas inclus dans les versions Raspbian Lite par défaut) :
sudo apt-get update
sudo apt-get install python-pip -y
sudo pip install adafruit-ws2801
Si vous avez une version allégée ou si SpiDev n’est pas installé sur votre système, veuillez suivre ce guide pour l’installer et l’activer. Sur les versions Raspbian plus récentes, cependant, il devrait déjà être préinstallé.
Puisque l’exemple donné par les développeurs ne fonctionne apparemment pas sur toutes les (fraîches) versions rases, j’ai changé cela et élargi.
Exemple de code pour la variation de la luminosité des LED WS2801
L’exemple suivant peut être utilisé et étendu pour vos propres projets. Ici, quelques couleurs (arcs-en-ciel) sont d’abord commutées en série, après quoi la luminosité des différentes couleurs est atténuée. Pour cela, il faut dire que la luminosité d’une couleur peut également être définie avec la valeur RGB (voir Capteur de couleur RGB pour ceci).
Donc, créons un fichier :
sudo nano ws2801_example.py
Le contenu suivant doit être inséré :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
# Simple demo of of the WS2801/SPI-like addressable RGB LED lights. import time import RPi.GPIO as GPIO # Import the WS2801 module. import Adafruit_WS2801 import Adafruit_GPIO.SPI as SPI # Configure the count of pixels: PIXEL_COUNT = 32 # Alternatively specify a hardware SPI connection on /dev/spidev0.0: SPI_PORT = 0 SPI_DEVICE = 0 pixels = Adafruit_WS2801.WS2801Pixels(PIXEL_COUNT, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE), gpio=GPIO) # Define the wheel function to interpolate between different hues. def wheel(pos): if pos < 85: return Adafruit_WS2801.RGB_to_color(pos * 3, 255 - pos * 3, 0) elif pos < 170: pos -= 85 return Adafruit_WS2801.RGB_to_color(255 - pos * 3, 0, pos * 3) else: pos -= 170 return Adafruit_WS2801.RGB_to_color(0, pos * 3, 255 - pos * 3) # Define rainbow cycle function to do a cycle of all hues. def rainbow_cycle_successive(pixels, wait=0.1): for i in range(pixels.count()): # tricky math! we use each pixel as a fraction of the full 96-color wheel # (thats the i / strip.numPixels() part) # Then add in j which makes the colors go around per pixel # the % 96 is to make the wheel cycle around pixels.set_pixel(i, wheel(((i * 256 // pixels.count())) % 256) ) pixels.show() if wait > 0: time.sleep(wait) def rainbow_cycle(pixels, wait=0.005): for j in range(256): # one cycle of all 256 colors in the wheel for i in range(pixels.count()): pixels.set_pixel(i, wheel(((i * 256 // pixels.count()) + j) % 256) ) pixels.show() if wait > 0: time.sleep(wait) def rainbow_colors(pixels, wait=0.05): for j in range(256): # one cycle of all 256 colors in the wheel for i in range(pixels.count()): pixels.set_pixel(i, wheel(((256 // pixels.count() + j)) % 256) ) pixels.show() if wait > 0: time.sleep(wait) def brightness_decrease(pixels, wait=0.01, step=1): for j in range(int(256 // step)): for i in range(pixels.count()): r, g, b = pixels.get_pixel_rgb(i) r = int(max(0, r - step)) g = int(max(0, g - step)) b = int(max(0, b - step)) pixels.set_pixel(i, Adafruit_WS2801.RGB_to_color( r, g, b )) pixels.show() if wait > 0: time.sleep(wait) def blink_color(pixels, blink_times=5, wait=0.5, color=(255,0,0)): for i in range(blink_times): # blink two times, then wait pixels.clear() for j in range(2): for k in range(pixels.count()): pixels.set_pixel(k, Adafruit_WS2801.RGB_to_color( color[0], color[1], color[2] )) pixels.show() time.sleep(0.08) pixels.clear() pixels.show() time.sleep(0.08) time.sleep(wait) def appear_from_back(pixels, color=(255, 0, 0)): pos = 0 for i in range(pixels.count()): for j in reversed(range(i, pixels.count())): pixels.clear() # first set all pixels at the begin for k in range(i): pixels.set_pixel(k, Adafruit_WS2801.RGB_to_color( color[0], color[1], color[2] )) # set then the pixel at position j pixels.set_pixel(j, Adafruit_WS2801.RGB_to_color( color[0], color[1], color[2] )) pixels.show() time.sleep(0.02) if __name__ == "__main__": # Clear all the pixels to turn them off. pixels.clear() pixels.show() # Make sure to call show() after changing any pixels! rainbow_cycle_successive(pixels, wait=0.1) rainbow_cycle(pixels, wait=0.01) brightness_decrease(pixels) appear_from_back(pixels) for i in range(3): blink_color(pixels, blink_times = 1, color=(255, 0, 0)) blink_color(pixels, blink_times = 1, color=(0, 255, 0)) blink_color(pixels, blink_times = 1, color=(0, 0, 255)) rainbow_colors(pixels) brightness_decrease(pixels) |
Dans la ligne 11, vous devez spécifier le nombre de LEDs qui se trouvent sur la bande connectée. Ce nombre doit être de 32 mètres. Vous pouvez enregistrer le fichier avec CTRL + O et fermer l’éditeur avec CTRL + X.
Voici la vidéo promise avec les différents effets du fichier :
Je serais intéressé par les projets que vous envisagez de réaliser (éclairage de l’Avent, décoration de l’arbre de Noël, épicer les chambres, « Table miroir à l’infini », etc.) Y a-t-il des demandes de tutoriels spécifiques concernant le contrôleur WS2801B de Raspberry Pi ? J’ai déjà quelques idées, mais j’aimerais aussi avoir votre avis 🙂