WS2812B ohjelmoitava LED-nauha

12/11/2018

Monet ovat varmasti törmänneet halpaan ohjelmoitavaan WS2812B led-valonauhaan. Nauhan ainoa huono puoli on sen vaativa kommunikaatioprotokolla. WS2812B piirit vaativat melko nopean kommunikaation, johon Arduinon kyvyt juuri ja juuri riittävät. Onneksi Adafruit on koodannut tähän sopivan kirjaston jo valmiiksi, ettei jokaisen tarvitse opetella assembly-kieltä rutiinien optimoimiseksi. Assembly on kyllä todella hyödyllinen, jos tarvitset kaiken tehon irti Arduinosta. Tästä voisi kirjoittaa joskus lisää, jos jotakin kiinnostaa.

Ledinauhan ajamiseen tarvit jonkinlaisen mikrokontrollerin. Kaikki käy, mutta Arduinoille on kirjoitettu valmiit kirjastot. Tässä on ohjeet kyseisen kirjaston asentamiseen:

1. Painamalla sketsi -> Sisällytä kirjasto -> Ylläpidä kirjastoja... (ylin vaihtoehto) pääset lataamaan kirjastoja helposti. Voit myös halutessasi painaa pikanäppäintä Ctrl+Shift+I.

2. Kirjoita hakuun neopixel ja valitse Adafruit NeoPixel by Adafruit. Valittuasi oikean kirjaston paina Asenna ja odota että kirjasto latautuu.

3. Kirjoita koodi. Ledinauhan ohjaaminen on helppoa, mutta erilaisten kuvioiden tekeminen ei.


Adafruit NeoPixel kirjaston käyttö ja muita ohjeita koodaamiseen

Juuri lataamassasi kirjastossa on paljon monipuolisia toimintoja, mutta pääasiassa tarvitset vain kolmea. Aluksi sinun täytyy sisällyttää kirjasto koodiisi. Suosittelen sijoittamaan kaikki kirjastot ihan koodin alkuun. Näin muistat, mitä kirjastoa pitää käyttää, jos vaihdat konetta tai jaat koodisi muille. Tällä koodilla saat sisällytettyä NeoPixel-kirjaston:

#include <Adafruit_NeoPixel.h>

Seuraavan on sinun määriteltävä käytettävien ledien määrä ja pinni, josta Arduino lähettää tiedon nauhalle. Suosittelen käyttämään makroja, jotka ovat kuin muuttujia jotka poistetaan ennen varsinaista kääntämistä. Tässä on esimerkki makron käytöstä:

#define MAKRON_NIMI ARVO_JOKA_MAKROLLE_ANNETAAN

Makroja ei ole pakko käyttää, mutta koodin muokkaaminen on huomattavasti helpompaa tulevaisuudessa. Makrojen nimeämisessä käytetään yleensä isoja kirjaimia. Välilyöntejä ei saa käyttää, vaan niiden tilalle on laitettava alaviiva.

Jos esimerkiksi haluat laittaa ledien määrän ja pinnin makroilla, voit kirjoittaa esimerkiksi näin:

#define PINNI 4 // Kytke ledinauhan datapinniin (yleensä DIN pinni)
#define LEDIEN_MAARA 7 // Kuinka monta led-valoa nauhassa on?

Seuraavaksi kirjastossa olevasta luokasta on luotava olio. Tämä on vain sitä varten, että pääsemme käsiksi kirjastossa olevaan koodiin. Ohjelmointiputkassa on todella hyviä esimerkkejä C++ koodaamiseen. Suosittelen vilkaisemaan. Tässä on esimerkiksi muutama asia luokista:
https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=cpp_ohj_09

NeoPixel kirjastolle luodaan olio, joka määritellään samalla kun se luodaan tällä koodilla:

Adafruit_NeoPixel lednauha = Adafruit_NeoPixel(LEDIEN_MAARA, PINNI, NEO_GRB + NEO_KHZ800);

Seuraava askel on "alustaa" ledinauha. Monissa kirjastoissa pinnimäärityksen on laitettu setup-funktion sisälle. Tämä tarkoittaa vain sitä, että datapinni asetetaan ulostuloksi. Tämä voidaan suorittaa lednauha.begin(); -komennolla. Tämä kannattaa sijoittaa setup() funktioon, sillä pinniä ei tarvi asettaa ulostuloksi kuin vain kerran käynnistyksen jälkeen.

Lopulta on vain jäljellä ledinauhan ohjaaminen. 

lednauha.setPixelColor(x,color);

Tämä komento asettaa ledinauhasta x:nnen ledin väriksi color. Ota huomioon, että ensimmäinen ledi on 0 eikä 1. Kun olet saanut asetettua ledit haluamallasi tavalla, on muutokset lähetettävä nauhalle. Tämä suoritetaan lednauha.show(); komennolla.

Lednauhalle voimme luoda värejä käyttämällä lednauha.Color(255,255,255); -funktiota, joka palauttaa 32-bittisen arvon takaisin. Tämä voidaan tallentaa uint32_t muuttujaan.


Erilaiset funktiot

Kun alat suunnittelemaan erilaisia kuvioita nauhalle, kannattaa funktiot sijoittaa joko yhteen erilliseen tiedostoon (ei kaikkea samaan tiedostoon), tai kaikki eri tiedostoihin. Tämä selkeyttää koodia huomattavasti, jolloin on mahdollisuus muokata, lisätä ja poistaa erilaisia efektejä. Funktioita suunnitellessasi on myös hyvä ottaa huomioon ajankäyttö: jos käytät Arduinoa pelkästään ledinauhassa, voit käyttää huoletta delay-funktiota. Muulloin täytyy käyttää millis()-funktiota (tai suoraan ajastimia, jos taitoa löytyy), sillä kun käytät delay-funktiota, Arduino lopettaa koodin ajamisen siksi aikaa. Millis()-funktion käyttö tuo kuitenkin kohtalaisen paljon monimutkaisuutta koodiin, joten kannattaa ajatella onko kyseessä kannattava teko.

GitHubista löytyvässä koodissa on muutama esimerkki funktioiden toteuttamisesta.