Arduino Lektion 31: 12bit RGB NeoPixel Ring

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.

12bit NeoPixel Ring Ansicht vorne
12bit NeoPixel Ring Ansicht vorne

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 Microcontroller am 5V Ausgang anbietet zu beachten. zbsp. der Arduino UNO liefert am 5V PIN max. 200mA.

12bit NeoPixel Ring Ansicht hinten
12bit NeoPixel Ring Ansicht hinten

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.

Breadboardkabel am 12bit NeoPixel Ring
Breadboardkabel am 12bit NeoPixel Ring

Bezugsquellen

Ein NeoPixel Ring wird in diversen Onlineportalen angeboten, zbsp. ebay.de den günstigsten Preis / Leistungsverhältnis habe ich bei ebay.de 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.

Bauformen

Es gibt die NeoPixel einzeln als Ring, Stripe und Board, somit sind den Ideen für eigene Entwicklungen keine Grenzen gesetzt.

16bitNeoPixelBoard & 12bitNeoPixelRing
16bitNeoPixelBoard & 12bitNeoPixelRing

Technische Daten

  • Durchmesser 38 mm
  • Gewicht ca. 3,3g
  • 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 RingArduino 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 nun 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

12bit NeoPixel Ring

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:

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.

ModulArduino UNO
BezeichnungPIN
 12bit NeoPixel RingINdigital PIN 8
  VCC 5V
  GND GND
 HMC5883LVCC5V
 GNDGND
 SCLanalog PIN 5
 SDAanalog PIN 4
 
Einfacher Kompass mit 3Achsen Lagesensor & 12bit NeoPixel Ring
Einfacher Kompass mit 3Achsen Lagesensor & 12bit NeoPixel Ring

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

Arduino Kompass mit 12bit NeoPixel Ring & 3 Achsen Lagesensor (HMC5338L)

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.

3 Kommentare

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert