Skip to content

Leds neopixel WS2812B

Description

Leds RGB adressables unitairement et pouvant être contrôlées en couleur, etc. Ce type de rubans LEDs utilisable une communication série sur 1 fil, selon un protocole spécifique.

Info

Ces LEDs pixels existent sous toutes sortes de formes : en barettes, en anneau (ring) et même en matrices.

LE POINT LE PLUS IMPORTANT EST D'UTILISER UNE ALIMENTATION DU RUBAN CAPABLE DE SUPPORTER L'INTENSITE DEMANDEE PAR LE RUBAN ALLUME INTEGRALEMENT +++

Brochage

  • Vcc : 5V
  • GND : 0V
  • Data In (DI)
  • et parfois : Data Out (DO) : pour mise en série de plusieurs rubans LEDs pixels

Contrôle en 3.3V ?

Cela ne posera pas de problème pour les couleurs rouge et vert, éventuellement un peu juste en bleu. Mais concrètement, c'est possible. LE PLUS IMPORTANT DANS TOUS LES CAS EST DE FAIRE TRES ATTENTION A l'intensité maximale qui sera nécessaire. Si on compte 10mA par LED, pour une LED à 3 LEDs, on est à 30mA et x 10 Leds, on est à 300mA, etc... donc çà va vite et il vaut mieux utiliser une alimentation externe.

PAR CONTRE ATTENTION : SURTOUT PAS DE 12V SUR LE RUBAN QUI GRILLERAIT INSTANTANEMENT !

Montage type

Avec ESp 32

Exemple en connexion sur 3V3 sur un ESP32 :

Avec une ESP UNO

Avec Pi Pico

Librairie Micropython

Note importante

Quelque soit la librairie, on a une fonction pour fixer la valeur et une fonction pour envoyer les modifs aux Leds (write() ou show() selon les cas)

Pi Pico

A noter que la plupart des exemples pour le Pi Pico utilise les PIO... ce qui donne un code un peu trop "expert"...

La bonne lib pour le pico est peut-être ici (mais annoncé ne fonctionnant pas dans l'interpréteur...) : https://github.com/benevpi/pico_python_ws2812b Le PIO est dans la lib.

wget https://raw.githubusercontent.com/benevpi/pico_python_ws2812b/main/ws2812b.py

Copier sur la carte avec :

./copy.sh /dev/ttyACM3 ws2812b.py

Ensuite

import ws2812b

pixels = ws2812b.ws2812b(5,0,16) # nb LEDs, state machine, GPIO

pixels.set_pixel(2,10,255,0) # n,r,g,b

pixels.show()

Driver WS2812B cité par awesome-micropython : https://github.com/JanBednarik/micropython-ws2812

wget https://raw.githubusercontent.com/JanBednarik/micropython-ws2812/master/ws2812.py

Copier sur la carte avec :

./copy.sh /dev/ttyUSB0 ws2812.py

La top pour moi

Une variante ici qui serait plus efficiente en utilisant un SPI : https://github.com/nickovs/ws2812-SPI

Télécharger dans le rép librairies avec :

wget https://raw.githubusercontent.com/nickovs/ws2812-SPI/master/neoSPI.py

Note

L'utilisation de SPI pour les LEDs Neopixel est un "truc" pour avoir une fréquence plus rapide. On utilise que TX de la SPI ou MOSI, c'est idem. C'est bien vu +++ ! Prinicpe ici : http://www.elec-tron.org/wp-content/uploads/2015/10/ws2812bconverter.jpg

ESP 8266 / 32

Sur les ESP, les choses sont simples puisque le module neopixel est disponible... en natif !

Débroullage dans l'interpréteur

Avec la lib native de ESP32 (cas particulier) :

>>> import machine
>>> import neopixel
>>> n=5
>>> p=15
>>> np = neopixel.NeoPixel(machine.Pin(p), n)
>>> np[0] = (255, 0, 0)
>>> np.write()
>>> np[3] = (125, 204, 223)
>>> np.write()

Exemple ici : https://gndtovcc.home.blog/2020/04/17/micropython-ws2812b-addressable-rgb-leds-with-esp32-and-esp8266/

Doc ici pour la 8266 : https://docs.micropython.org/en/latest/esp8266/tutorial/neopixel.html

Note

Cette lib m'a posé quelques problèmes, voire ne fonctionne pas forcément... pas clair...

Avec la lib neoSPI (Pi Pico) - la lib top pour moi :

Exemple Pi Pico

>>> from machine import Pin, SPI
>>> # sp=SPI(0, sck=Pin(18), mosi=Pin(19),miso=Pin(16))
>>> sp=SPI(0, mosi=Pin(19)) # Que MOSI suffit 
>>> sp.init(baudrate=3200000)
>>> import neoSPI
>>> np=neoSPI.NeoPixel(sp,5)
>>> np[0:5]=(0,0,40)
>>>np.write() # IMPORTANT ET NE PAS OUBLIER

Ce qui est très intéressant avec cette librairie, c'est la façon très "pythonique" d'accéder aux LEDs, à la façon presque d'un tableau numpy

# Blank the whole set
np[:] = (0,0,0)
# Set the first 10 pixels to dark blue
np[0:10] = (0,0,40)
# Set the second pixel to green
np[1] = (128,0,0)
# Set the third pixel's red value to full brightness
np[2,2] = 255
# Copy the 2nd pixel to the 5th
np[4] = np[1]
# Copy the first 16 pixels to the last 16 pixels
np[-16:] = np[:16]

Quelques essais :

>>> np[:]=(0,0,0)
>>> np.write()
>>> np[:]=(255,0,0)
>>> np.write()
>>> np[:]=(0,255,0)
>>> np.write()
>>> np[:]=(0,0,255)
>>> np.write()
>>> import utime as time
>>> for i in range(5):
    np[:]=(0,0,0)
    np[i]=(0,255,0)
    np.write()
    time.sleep_ms(100)

Bref, c'est vraiment bien et très Python. En plus, l'utilisation du SPI rend la fluidité du Neopixel à priori optimale.

Pour mémoire, La configuration de la connexion SPI : https://docs.micropython.org/en/latest/library/machine.SPI.html Ici, on ne configure que la broche MOSI, les autres broches n'étant pas utilisées. C

Exemple ESP 8266

Fonctionne nickel ! Test sur ESP 8266 UNO :

from machine import Pin, SPI
>>> sp=SPI(1) # MISO=GPIO12 MOSI=GPIO13 et SCK=GPIO14 - SPI 0 = flash !
>>> sp.init(baudrate=3200000)
>>> import neoSPI
>>> np=neoSPI.NeoPixel(sp,5)
>>> np[0:5]=(0,0,255)
>>> np.write()

Liens utiles

Où acheter ?