Digi-Dot-Booster am Arduino – ganz einfach

Nach all den Experimenten mit  dem Digi-Dot-Booster am Raspberry Pi und dem STM32 Nucleo Board war irgendwann klar, dass auch an Arduino kein Weg vorbei führt. Auf der Produktseite vom Digi-Dot-Booster gibt es schon viele Beispiele für die Arduino Plattform, mit der man schnell verschiedene Effekte zauben kann. Dann habe ich einen genauen Blick auf den Code geworfen und sah da Ver­bes­se­rungs­po­ten­zi­al. So ist die Arduino DD-Booster-Library entstanden.

Die Arduino Plattform soll vor allem Neulingen die Programmierung von Mikrocontrollern erleichtern. Die Arduino Programme (Sketches) haben eine einfache Struktur: die Funktion `setup()` dient der Initialisierung beim Start und die Funktion `loop()` ist der Körper des Programms – eine Schleife, die periodisch aufgerufen wird.

So sollen im Sketch nach Möglichkeit auch nur die wichtigsten Ausdrücke stehen, die den Ablauf des Programms bestimmen, und alles andere kann in eine Bibliothek ausgelagert werden. Genau das wird mir der DD-Booster-Library erreicht.
Die Bibliothek kapselt die ganze SPI Bus Kommunikation inkl. dem Datenprotokoll mit dem Digi-Dot-Booster und stellt für die Steuerung einfache Funktionen zur Verfügung.

Der Anschluss ist bereits im Datasheet vom Digi-Dot-Booster dokumentiert und sollte daher keine Probleme bereiten.

Die Bibliothek kann direkt über den eingebauten Library Manager installiert werden.

Der Library Manager ist über Sketches/Include Library/Manage Libraries... ereeichbar

Der Library Manager ist über Sketch/Include Library/Manage Libraries… erreichbar

Im Sucheingabefeld dd-booster eintippen, in der Liste den Eintrag auswählen und den Button "Intall" klicken.

Im Sucheingabefeld dd-booster eintippen, in der Liste den Eintrag auswählen und per „Install“ Button die Installation einleiten.

Der Code der Bibliothek liegt auf GitHub. Dort ist ebenfalls die Dokumentation abgelegt. Verbesserungen, neue Beispiele oder sonstige Anmerkungen sind wie immer willkommen.

Neben der Kapselung der Befehle, die der DD-Booster unterstützt, enthält die Bibliothek weitere nützliche Funktionen. Die oft gebrauchten Funktionen `clearLed()` und `clearAll` schalten eine LED bzw. alle LEDs aus, in dem sie die Farbe auf `RGB(0,0,0)` setzen. Die Funktion `setGradient()` berechnet und setzt einen Farbverlauf zwischen zwei LEDs von einer Farbe in die andere. Mit dieser Funktion ist das Beispiel WaterDrop umgesetzt.

Die Verwendung der Library ist recht einfach und gut dokumentiert, hier folgt auch eine kurze Anleitung dazu anhand des Blinker-Beispiels. Das `TurnSignal` Beispiel kann nach der Installation der Bibliothek direkt aufgerufen werden.

Library_examples

Für die Steuerung des Digi-Dot-Boosters wird zunächst ein Objekt der Klasse `DDBooster` erzeugt. Dabei wird die SPI Schnittstelle initialisiert und auf 12 MHz, MSB first, mode 0 eingestellt. 12 MHz ist der maximal mögliche Wert und je nach Arduino Version wird von der Plattform automatisch entschieden, ob dieser Wert erreicht werden kann. Ansonsten wird der jeweils mögliche niedrigerer Wert gewählt.

#include <DDBooster.h>

// create booster object
DDBooster booster;

void setup() {
}

void loop() {
}

Standardmäßig verwendet die Bibliothek den SS Pin der SPI Schnittstelle für die Steuerung der ChipSelect Leitung. Falls jemand einen anderen digitalen Pin dazu verwenden möchte, kann mit der Funktion `configurePins()` die Bibliothek entsprechend konfigurieren. Der erste Parameter legt dabei den neuen ChipSelect Pin fest, der zweite definiert welcher Pin für einen Hardware Reset des DD-Boosters mittels der Funktion `reset()` verwendet wird. Dazu muss der entsprechende digitale Pin mit dem RESET Pin des DD-Boosters verbunden werden. Ohne explizite Zuweisung des Pins für den Reset hat der Aufruf von `reset()` keine Auswirkung.

Als Nächstes muss dem DD-Booster mitgeteilt werden, wie viele LEDs er ansteuern soll – gültig Werte sind von 0 bis 256. Das wird mit der Funktion `init()` gemacht. Für das Beispiel werden 20 LEDs auf einem ws2812 Stripe festgelegt. Zuvor werden global noch zusätzliche Variablen definiert: `led_count` für die Anzahl der LEDs, `index` für die aktuelle Position der angesteuerten LED und `color` definiert die zu verwendende Farbe. Nach dem `init()` Aufruf werden alle LEDs ausgeschaltet, um einen „sauberen“ Stand zu haben. Das wird mit den Funktionen `clearAll()`und `show()` erreicht. Die Methode `show()`spielt eine große Rolle, denn erst nach ihrem Aufruf werden alle vorherigen Änderungen auch übernommen und die LEDs letztendlich angesteuert. Letzte Zeile in der `setup()` Funktion setzt für die nachfolgenden Aufrufe die zu verwendende Farbe der LEDs.

#include <DDBooster.h>

// create booster object
DDBooster booster;
// we have 20 leds
int led_count = 20;
// we start with the first led
int index = 0;
// this color will be used for the turn lights
byte color[] = {0xFF, 0xBB, 0};

void setup() {
  // tell the booster about the number of leds
  booster.init(led_count);
  // turn all leds off to have a clear state
  booster.clearAll();
  booster.show();
  // save the color we want to use in the color buffer
  booster.setRGB(color[0], color[1], color[2]);
}

void loop() {
}

Die ganze „Magie“ passiert nun in der `loop()` Funktion. Bei jedem Aufruf wird jeweils für eine LED an der aktuellen Position die Farbe gesetzt und per `show()` zur Anzeige gebracht. Danach wird untersucht, ob die aktuelle Position der letzten Stelle in der LED-Reihe entspricht. Bei 20 LEDs wäre das 19, da die Zählung immer mit 0 beginnt. Falls das der Fall ist, wird der Index wieder auf 0 (die erste LED) zurückgesetzt und alle LEDs ausgeschaltet. Zusätzlich wird eine Pause von 500 Millisekunden zwischen der Durchläufen eingelegt. Da die Funktion `clearAll()` intern die Farbe auf RGB(0,0,0) setzt, um alle LEDs auszuschalten, muss das Farbregister des DD-Boosters erneut mit der richtigen Farbe befüllt werden. [An der Stelle wäre es wahrscheinlich sinnvoll, wenn die Bibliothek das Wiederherstellen des Farbregisters nach dem Aufruf der `clear`-Methoden automatisch selbst macht. Das wird für die nächste Version angepasst.]
Und falls die aktuelle Position das Ende nicht erreicht hat, wird sie einfach um eins erhöht, damit beim erneuten `loop`-Durchlauf die nächste LED gesetzt wird. Eine Pause von 10ms am Ende legt fest wie schnell der Blinker blinkt.

#include <DDBooster.h>

// create booster object
DDBooster booster;
// we have 20 leds
int led_count = 20;
// we start with the first led
int index = 0;
// this color will be used for the turn lights
byte color[] = {0xFF, 0xBB, 0};

void setup() {
  // tell the booster about the number of leds
  booster.init(led_count);
  // turn all leds off to have a clear state
  booster.clearAll();
  booster.show();
  // save the color we want to use in the color buffer
  booster.setRGB(color[0], color[1], color[2]);
}

void loop() {
  // we always set one led per loop run
  booster.setLED(index);
  booster.show();

  // if we arrive the last led, reset all and wait a little bit
  // if not increment index to go set next led on next loop run
  if (index == led_count - 1) {
    index = 0;
    booster.clearAll();
    booster.show();
    delay(500);
    // set the color back
    booster.setRGB(color[0], color[1], color[2]);
  } else {
    index++;
  }

  // control the speed of the turn light
  delay(10);
}

Mit der Bibliothek werden zwei Beispiele mitgeliefert: WaterDrop und das gerade besprochene TurnSignal. Künftig sind weitere Beispiele und evtl. auch Funktionen geplant. Die Aktualisierung geschieht dann einfach über den Library Manager der Arduino Entwicklungsumgebung.

Zum Schluss noch die beiden Beispiele als Videos.

 

9 Gedanken zu „Digi-Dot-Booster am Arduino – ganz einfach