Lys opp med Neopixel

Lys opp med Neopixel

Iblant er det ikke nok med en håndfull lysdioder for å lyssette et prosjekt. Da er det noe som heter Neopixel, som vi skal se nærmere på i dette kapittelet.

Neopixel

Neopixel er et bibliotek og en familie av LED-produkter. Navnet er egentlig amerikanske Adafruits forbrukervennlige navn for brikken WS2801/11/12. Produktene lages imidlertid av mange forskjellige produsenter. Produktutvalget består av alt fra ringer i ulike størrelser (lik den som følger med i bokens tilhørende komponentpakke) til lister i ulike lengder.

Neopixel-ringer i to størrelser

Lysdiodene på Neopixel-produkter er av typen RGB, og alle lysdiodene kan adresseres individuelt. All adressering gjøres av Neopixel-produktets innebygde mikrokontroller i kombinasjon med Neopixel-biblioteket. Det er derfor nok med tre kabler (pluss, minus og data) for å koble en Neopixel-ring med 24 lysdioder til et utviklingskort.

Tilkobling av Neopixel

De fleste Neopixel-ringene leveres uten tilkoblingskabler. For å koble til komponentpakkens Neopixel-ring begynner vi med å lodde fast tilkoblingskabler til punktene PWR +5 V, GND og Data Input. På koblingsbrettet kobler vi deretter Neopixel-ringen i serie med en motstand på 100 Ω (behøves for modellen i bokens komponentpakke).

Illustrasjon laget med komponenter fra Fritzing (fritzing.org). CC BY-SA 3.0

Sette farge på lysdioder

I følgende eksempel skal vi bygge en enkel sekundviser som tenner eller slukker alle lysdioder på ca. ett sekund. Vi bruker delay-funksjonen for å beregne ett sekund av gangen. Den er ikke så nøyaktig, og i Hold tiden med Arduino brukte vi derfor en annen løsning.

Vi begynner med å importere biblioteket Adafruit_NeoPixel og definere tre variabler:

  • en byte-konstant for hvilken GPIO-pinne Neopixel-ringen er koblet til
  • en byte-konstant for hvor mange lysdioder Neopixel-ringen består av
  • en byte-variabel for hvor sterkt Neopixel-ringen skal lyse (0-255).

Obs! Hver lysdiode kan trekke opptil 60 mA på høyeste lysstyrke (1,4 A totalt). Det kan ikke strømforsyningen i den medfølgende komponentpakken levere. Den høyest anbefalte lysstyrken er derfor 100.

Del 1/4 av NeopixelSecond.ino

Vi lager deretter et nytt Neopixel-objekt som vi kaller ring. I tillegg til argumentene for GPIO-pinne og pikselantall beskriver vi hvilken type Neopixel-produkt vi har (NEO_GRB).  

Del 2/4 av NeopixelSecond.ino

I setup-funksjonen starter vi ringen og angir lysstyrken.  

Del 3/4 av NeopixelSecond.ino

I loop-funksjonen skriver vi to for-løkker. Den ene går gjennom pikslene (fra nummer 0 til nummer 23) og endrer fargen fra svart (av) til en farge. Den andre for-løkken gjør det samme, bare motsatt.

Med setPixelColor-metoden angir vi først hvilken piksel vi vil endre farge på, og deretter hvilken farge den skal få. Vi kan angi hvilken som helst farge ut fra fargens RGB-verdi (vi velger Kjell & Companys profilblå farge, som har RGB-verdien 0, 118, 189). Med show-metoden oppdaterer vi deretter verdien på den aktuelle pikselen.

Del 4/4 av NeopixelSecond.ino

Grunnen til at vi valgte en forsinkelse på 42 millisekunder er at løkkene kjøres 24 ganger. Det blir drøyt et sekund (1008 ms) per tenning eller slukking.

Her er en oversikt over andre flotte farger (Kjell & Companys profilfarger).

Forbedre terningen

Terningen fra Bygge en terning kan gjøres enda kulere ved hjelp av en Neopixel-ring. Vi vil at Neopixel-ringen skal "rotere" mens spilleren holder knappen trykket inn, og at servoen viser kastresultatet når spilleren slipper knappen.

Øverst i skissen vår gjør vi følgende:

  • inkluderer bibliotekene for Neopixel, servo og knapp
  • bestemmer GPIO-pinne for Neopixel-ringen
  • bestemmer antall piksler i Neopixel-ringen
  • bestemmer lysstyrken på pikslene i Neopixel-ringen
  • lager en Neopixel-ring, en knapp og en servo.

Legg merke til at vi bruker et annet servo-bibliotek enn i Styre en servo. Det er fordi at det IDE-innebygde servo-biblioteket forstyrrer Neopixel-ringen. Heldigvis har Adafruit laget et bibliotek ved navn Ticoservo, som fungerer på samme måte, men som ikke forstyrres av Neopixel (biblioteket må installeres før det kan tas i bruk).

Del 1/5 av RollDice3.ino

I setup-funksjonen starter vi Neopixel-ringen og knappen. Vi kobler servoen til GPIO-pinne 9 og fyller på med resten av setup-koden fra det første terningprosjektet.

Del 2/5 av RollDice3.ino

Loop-funksjonen skriver vi helt om. Vi innleder med en if-setning som startes når noen trykker på knappen. Det første som skjer da, er at lysstyrken økes og Neopixelen oppdateres. Deretter kjøres en while-løkke så lenge knappen ikke er sluppet opp. Den while-løkken kaller opp funksjonen rainbowCycle. Når knappen slippes opp, kjøres en for-løkke som suksessivt dimmer ned Neopixelens lysdioder. Når lysdiodene er slukket, kalles funksjonene upDown og setDice opp.

Del 3/5 av RollDice3.ino

Funksjonene UpDown- og setDice gjør det samme som tidligere. 

Del 4/5 av RollDice3.ino

RainbowCycle og wheel er to nye funksjoner. De gjør at fargene blandes og snurrer på en elegant måte. Grunnkoden er et kunstverk i seg selv og er skrevet av Adafruit som et av eksemplene deres. Flere flotte eksempler finner du under Eksempler på Fil-menyen. 

Del 5/5 av RollDice3.ino

Sist endret: 2017-09-08