Ein Pixel Ring ist, wie die Bezeichnung es erahnen lässt, ein Ring aus eine Anzahl n NeoPixel. Es gibt diese Ringe in diversen Ausführungen. In diesem Beispiel möchte ich gerne den „12bit RGB NeoPixel Ring“ vorstellen.
Auf der Rückseite sind die Anschlüsse für die Verbindung zum Arduino (IN) bzw. zu einem weiteren Ring (OUT) vorhanden.
Betreibt man mehrere Ringe hintereinander, ist dabei die maximale Stromstärke, welche der Arduino Mikrocontroller am 5V Ausgang anbietet, zu beachten, der Arduino UNO liefert am 5V PIN max. 200mA.
Als Erstes müssen also nun die drei Leitungen für Strom & Daten an den Ring gelötet werden, ich nutze dafür Breadboardkabel, da diese gleich mit passendem Stecker für den Arduino UNO geliefert werden.
Bezugsquellen
Ein NeoPixel Ring wird in diversen Onlineportalen angeboten. Auf der Plattform ebay.de* habe ich den günstigsten Preis gesehen und „zugeschlagen“. Die Lieferzeit war mit ca. 2 Wochen relativ kurz und sehr verträglich, des Weiteren hatte der Preis von 1,77 € inkl. kostenlosem Versand für zusätzlichen Reiz gesorgt.
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Bauformen
Es gibt die NeoPixel einzeln als Ring, Stripe und Board, somit sind den Ideen für eigene Entwicklungen keine Grenzen gesetzt.
Technische Daten
- Durchmesser 38 mm
- Gewicht ca. 3,3 g
- Spannung 5V
Schaltplan
Der 12bit NeoPixel Ring verfügt über 3 PINs welche mit IN, VCC und GND bezeichnet sind. Diese PINs werden wie folgt am Arduino UNO angeschlossen.
12bit NeoPixel Ring | Arduino UNO |
---|---|
IN | digital PIN 8* |
VCC | 5V |
GND | GND |
*Der digitale PIN kann natürlich frei gewählt werden, sollte aber dann im Quellcode angepasst werden.
Quellcode
Ein einfaches Beispiel
Für den Betrieb des 12bit NeoPixel Ring wird eine Bibliothek bereitgestellt, diese kann im GitHub Repository von Adafruit heruntergeladen werden. Nachdem also nun die Bibliothek heruntergeladen und installiert wurde, kann mit dem Quellcode begonnen werden.
Im Nachfolgenden werde ich der kürze halber den „12bit NeoPixel Ring“ nur noch als Ring bezeichnen.
Als Erstes muss natürlich die Bibliothek eingebunden werden, dazu wird in die erste Zeile das Include geschrieben:
#include <Adafruit_NeoPixel.h>
Im nächsten Schritt muss nun noch definiert werden, auf welchem PIN der Ring angeschlossen wurde:
#define PIN 8
Sollte der Ring also an einer anderen PIN angeschlossen, muss dieses hier angepasst werden.
Zusätzlich wird jetzt eine Variable definiert wie viele NeoPixel der Ring hat, dadurch kann dieses Beispiel ganz leicht für andere Ringe Bsp. mit 16 oder 24 NeoPixel abgewandelt werden.
int numPixels = 12;
Nun müssen wir das Adafruit_NeoPixel Objekt initialisieren, dazu werden folgende Parameter erwartet:
- Anzahl der NeoPixel,
- PIN an welchem der Ring angeschlossen wurde,
- Pixel Typ
- NEO_GRB – GRB bitstream
- NEO_RGB – RGB bitstream
- NEO_KHZ800 – 800 KHz
- NEO_KHZ400 – 400 KHz
Adafruit_NeoPixel strip = Adafruit_NeoPixel(numPixels, PIN, NEO_GRB + NEO_KHZ800);
Nun folgt auch schon die Setup Funktion, in welcher die Grundeinstellungen gesetzt werden.
void setup() { strip.begin(); strip.setBrightness(50); //die Helligkeit setzen 0 dunke -> 255 ganz hell strip.show(); // Alle NeoPixel sind im Status "aus". }
In der Loop Funktion, welche die gesamte Laufzeit des Arduinos ausgeführt wird, kommt nun der Farbwechsel pro NeoPixel hinzu. In diesem Beispiel sollen alle NeoPixel für 1 Sek. in der Farbe Rot aufleuchten und dann nach Grün wechseln.
uint32_t red = strip.Color(255, 0, 0); //RGB Farbe Rot uint32_t green = strip.Color(0, 255, 0); //RGB Farbe Grün void loop() { for(uint16_t i=0; i<strip.numPixels(); i++) { //Für jeden NeoPixel strip.setPixelColor(i, red); // Farbe Rot setzen strip.show(); //Anzeigen delay(1000); //Warten von 1 sek. strip.setPixelColor(i, green); //Farbe Grün setzen strip.show(); //Anzeigen //Wenn noch NeoPixel folgen dann den Wert "i" um 1 erhöhen und von vorne beginnen wenn nicht Schleife beenden. } //Weiter zum Anfang der Loop Funktion. }
Video
Ein Kompass mit dem 3 Achsen Lagesensor HMC5883L
Den 3 Achsen Lagesensor habe ich Tutorial Arduino Lektion 14: 3 Achsen Lagesensor, HMC5883L ausgiebig beschrieben daher möchte ich auf diesen Sensor nicht im Speziellen eingehen.
Ziel dieses kleinen Projektes soll es sein ein 3 Achsen Lagesensor, als Kompass zu benutzen, es soll dabei der Norden mit einem Roten NeoPixel markiert werden, die restlichen NeoPixel sollen in der Farbe Grün aufleuchten.
Dieses ist nur ein Beispiel und kann gewiss keinen Kompass ablösen!
Benötigte Komponenten:
- Arduino UNO, (oder vergleichbares)
- 170 PIN Breadboard,
- 3 Achsen Sensor HMC5883L,
- 6 Breadboardkabel
- 4 Breadboard Kabel für den 3 Achsen Sensor,
- 2 Breadboardkabel für die Stromversorgung
- 12bit NeoPixel Ring
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Aufbau
Da der 12bit NeoPixel Ring nur über 12 LEDs verfügt ergibt dieses eine Auflösung 30° das ist in der Praxis natürlich nicht verwendbar jedoch als kleines Beispiel völlig ausreichend.
Modul | PIN | Arduino UNO |
---|---|---|
12bit NeoPixel Ring | IN | digital PIN 8 |
VCC | 5V | |
GND | GND | |
HMC5883L | VCC | 5V |
GND | GND | |
SCL | analog PIN 5 | |
SDA | analog PIN 4 |
Wichtig
Es sind 12 NeoPixel in dem Ring, gezählt wird aber von 0 bis 11, d.h. wenn man das NeoPixel an der Position 1 aktivieren bzw. verändern möchte, muss man die Position 0 ansprechen.
Quellcode
#include <Adafruit_NeoPixel.h> #include <Wire.h> //I2C Arduino Bibliothek #define address 0x1E //0011110b, I2C 7Bit Adresse des HMC5883 Chips #define PIN 8 int x; //X Achse int y; //Y Achse int z; //Z Achse int numPixels = 12; Adafruit_NeoPixel strip = Adafruit_NeoPixel(numPixels, PIN, NEO_GRB + NEO_KHZ800); uint32_t red = strip.Color(255, 0, 0); //RGB Farbe Rot uint32_t green = strip.Color(0, 255, 0); //RGB Farbe Grün void setup() { strip.begin(); strip.setBrightness(5); //die Helligkeit setzen 0 dunke -> 255 ganz hell drawGreenRing(); Serial.begin(9600); //Baudrate Wire.begin(); Wire.beginTransmission(address); //Beginnen der Kommunikation über die Adresse, für das setzen der Konfiguration Wire.write(0x02); //select mode register Wire.write(0x00); //Modus für das fortlaufende lesen der Werte. Wire.endTransmission(); //Beenden der Kommunikation. } void loop() { drawGreenRing(); float northDirection = getNorthDirection(); int northNeoPixel = calcNorthNeoPixel(northDirection); northNeoPixel = (numPixels-1) - northNeoPixel; if(northNeoPixel<0){ northNeoPixel = northNeoPixel *(-1); } strip.setPixelColor(northNeoPixel, red); strip.show(); delay(1000); } //Berechnet aus dem Winkel die Position des NeoPixels. int calcNorthNeoPixel(float northDirection){ int result = 0; int steps = 360 / numPixels; if(northDirection > 0 && northDirection < steps){ result = 0; } else { result = northDirection / steps; } return result; } //Setzt alle NeoPixel in die Farbe Grün. void drawGreenRing(){ for(uint16_t i=0; i<strip.numPixels(); i++){ strip.setPixelColor(i, green); } strip.show(); //Anzeigen } //Liefert den Winkel in Richtung Norden. float getNorthDirection(){ float northDegrees = 0; Wire.beginTransmission(address); //Beginnen der Kommunikation Wire.write(0x03); //select register 3, X MSB register Wire.endTransmission(); //Beenden der Kommunikation //Lesen der Daten vom 6 fach Register (2 Register pro Achse) Wire.requestFrom(address, 6); if(6<=Wire.available()){ x = Wire.read()<<8; //X msb x |= Wire.read(); //X lsb z = Wire.read()<<8; //Z msb z |= Wire.read(); //Z lsb y = Wire.read()<<8; //Y msb y |= Wire.read(); //Y lsb float heading = atan2(y, x); //Je nach Position auf der Erde muss hier ggf. //eine Anpassung der Deklination geschehen. float declinationAngle = 0.22; heading += declinationAngle; if(heading < 0){ heading += 2*PI; } if(heading > 2*PI){ heading -= 2*PI; } northDegrees = heading * 180/M_PI; } return northDegrees; }
Video
Downloads
Fazit
Beim Experimentieren mit dem 12bit NeoPixel Ring ist mir aufgefallen, das dieser einen defekten NeoPixel hat, das dieses Mal vorkommen kann und bei einem Preis von 1,77 € inkl. Versandkosten dieses in China als Massenware produziert wird ist dann auch klar. Aber die Helligkeit ist sehr gut, in den Videos musste ich den Wert „5“ für die Helligkeit wählen, da sonst die Kamera damit nicht zurechtkommen würde. Ansonsten ist dieser Ring bzw. das Board sehr gut verarbeitet und hat sonst keine nennbare Mängel.