Om dit goed te kunnen doen, heb je eerst deze gedaan: Arduino Nano – Blink Extreme
Arduino Neopixel – spelen met licht
In deze oefening programmeer je een NeoPixel stokje op de Arduino Nano. De oefening blijk ook op de rode Arduino Nano te passen met iets minder geheugen.
Dit bijzondere onderdeel maakt het mogelijk om op een voordelige manier te werken met 8 RGB led pixels. De aansturing gebeurt met een speciale databus, wat voorlopig door de libraries voor jou onzichtbaar is gemaakt.
LED op!
Sommige libraries nemen wat meer geheugen dan andere. De rode Arduino heeft minder ruimte om de programma’s op te slaan dan de gele die voor dit voorbeeld is gebruikt. Als je minder functies van een library gebruikt, dan wordt er meestal ook maar een gedeelte van de library meegenomen in het geheugen.
Ontdek zelf of de code past? (tip: het past prima bij onze rode Arduino Nano)
Maak een Neopixel streepje – library Adafruit Neopixel – Simple example
Installeer de library ‘Adafruit NeoPixel’, by ‘Adafruit’. Dat doe je door in de Arduino IDE te klikken op Schets > Include library > manage library, en dan zoek je op de naam van de library en klik je Install. Ook kun je het volgende lab volgen: ‘Een Arduino library downloaden’, dit lab legt precies uit hoe dit werkt.
Open een voorbeeld programma: via voorbeelden, Examples from Custom Libraries / Adafruit Neopixel, Simple
De Arduino klaar maken voor het breadboard:
- de lange header pins steek je aan de onderkant in de Arduino gaatjes
- controleer dat het langste deel van de pinnetjes nog vrij is om in breadboard te steken
- soldeer de pennetjes netjes aan de Arduino
- Hiervoor kun je de volgende instructies volgen: Headers op een Arduino Nano solderen
De NeoPixel aansluiten op de Arduino:
- soldeer 3 header pins aan de neopixel aan de kant van de DIN
- 5V naar +5V naar de arduino
- GND gaat naar GND (het maakt niet uit welke GND want er zijn er twee)
- DIN gaat naar D6
We passen wat aan in het programma:
- zet aantal leds op 8
- op de regel met strip, moet er staan: NEO_GRB + NEO_KHZ800 (het staat in principe al goed)
Dit is een vorbeeld waarbij je zelf ook de pixels kunt programmeren
Communicatie.
Op de NeoPixel strip staat DIN voor Data In. Aan de andere kant van de strip zie je een DOUT, dat is dan de Data Uit. De DOUT kan je doorverbinden naar de DIN van een volgende strip. Zo maak je dan een strip van 16 pixels.
De communicatie vanuit de Arduino naar deze DIN vertelt de eerdte pixel welke kleur afgebeeld moeten worden. Bij de volgende kleurinformatie schuift de eerste kleur door naar de volgende pixel op de strip. De Arduino geeft dus telkens een gehele strip aan ‘beeld’ door aan de eerste DIN aansluiting. Hiervoor is een snelle communicatie nodig, maar daar zien we (meestal) niets van.
Toch zien we met onze rode Arduino Nano wel eens een probleem. Deze Arduino gebruikt een heel eenvoudige interne klok (eigenlijk: crystal). Deze is goed genoeg voor de meeste labs. Nu vraagt de NeoPixel een heel nauwkeurige communicatie. In sommige gevallen zien we dat de kleurinformatie niet goed van de rode Arduino Nano naar de ledstrips verzonden wordt. Dan helpt het om de Arduino power van onze breadboard voeding te gebruiken, en misschien zelfs om deze voeding te schakelen naar 3,3 volt.
NeoPixel NO Delay – alleen voor speciale programmeurs
Dit is alleen voor speciale programmeurs. Bij de Arduino Blink hebben we een variatie gezien die werkt zonder Delay functie. Dit is handig als je tijdens het knipperen bijvoorbeeld wilt controleren of er op een knopje wordt gedrukt. Zie ook https://junioriot.nl/blink-no-delay-2/
We hebben voor de NeoPixel ook een NO DELAY versie gemaakt. Vervang de Loop() uit het Simple example door:
void loop() { // we will run this loop very frequently without delay --> will use current millis() to calculate status unsigned long this_moment = millis(); const int time_each_pixel = 150; // milisec const int num_steps = NUMPIXELS * 2 - 2; int prev_step = -1; int curr_step = (this_moment/time_each_pixel) % num_steps; if (curr_step != prev_step) { pixels.clear(); // Set all pixel colors to 'off' if (curr_step<NUMPIXELS) { // step 0 1 2 3 4 5 6 7 --> go up from led 0 to 7 int this_pixel=curr_step; // pixels.Color() takes RGB values, from 0,0,0 up to 255,255,255 // Here we're using a moderately bright green color: pixels.setPixelColor(this_pixel, pixels.Color(0, 150, 0)); } else { // step 8 9 10 11 12 13 --> go backwards from led 6 to 1 int this_pixel=NUMPIXELS * 2 - 2 - curr_step; // pixels.Color() takes RGB values, from 0,0,0 up to 255,255,255 // Here we're using a moderately bright green color: pixels.setPixelColor(this_pixel, pixels.Color(0, 150, 0)); } pixels.show(); // Send the updated pixel colors to the hardware. prev_step = curr_step; } // if a change was needed //delay(10); // Pause before next pass through loop }
Neo voorbeeld, uitgebreid
Voorbeelden, Examples from Custom Libraries / Adafruit Neopixel, strandtest
Goed aansluiten:
- soldeer 3 geader pins aan de neopixel aan de kant van de DIN
- 5V naar +5V naar de arduino
- GND gaat naar GND
- DIN gaat naar D6
We passen wat aan in het programma:
- zet aantal leds op 8
- op de regel met strip, moet er staan: NEO_RGB + NEO_KHZ800
In dit voorbeeld worden uitgebreide effecten getoond.
Challenges
Challenge: De strip van 8 NeoPixels werkt hetzelfde als bijvoorbeeld een RDB of RGBW NeoPixel ledstrip van 5 meter lang. Kan je wat je in deze oefening leert ook toepassen op de ledstrip?
Challenge voor de hard-core software- en hardware engineers: Programmeer de NeoPixels nu eens zelf, zonder libraries.