Bitte ab 05/2019 die neue wwFlipGFX.h benutzen

wwFlip.h Arduino Library für Flip-Dot Module

Zur Ansteuerung meiner Flip-Dot Platinen habe ich eine Arduino Library geschrieben. Sie ist universell für alle mir bekannten KRUEGER und BROSE Module einsetzbar. Sie enthält die folgenden Befehle:

// generelle Funktionen -------------------------------------------------------
 wwFlip(...)              // Konfiguration unterschiedlicher Flip-Dot Hardware
.begin()                 // Startet die Library
.orientSet(1-4)          // setzt die physikalische Orientierung des Moduls

// Funktionen zum Schaltverhalten der Dots ------------------------------------
.setCoilSetDuration(t)   // Dauer des Flip-Impuls für das farbig Flippen
.setCoilResetDuration(t) // Dauer des Flip-Impuls für das schwarz Flippen
.setCoilFlipDuration(t)  // Dauer des Flip-Impuls für set und reset  
.dotPowerOn()            // Flip-Spannung auf Treiber aufschalten
.dotPowerOff()           // Flip-Spannung von Treiber abschalten

// Funktionen zum direkten Schalten der Dots auf dem Display ------------------
.setDot(x,y)             // Dot an Position x,y farbig flippen (gelb, weiß, rot)
.resetDot(x,y)           // Dot an Position x,y schwarze flippen
.char4x7(n,x,y)          // Ziffer n(0-9) als 4x7 Bild an x,y flippen
.setAll(t)               // alle Dots farbig flippen (gelb, weiß, rot)
.resetAll(t)             // alle Dots schwarze flippen

// Funktionen zum Schalten der Dots über eine rechnerinterne Matrix ------------
// Diese Funktionen verhindern das erneute Schalten bereits richtig gesetzter Dots
.mSetDot(x, y);          // Dot in der Matrix setzen
.mResetDot(x, y);        // Dot in der Matrix löschen
.mChar4x7(n,x,y)         // Ziffer n(0-9) als 4x7 Bild an x,y in Matrix schreiben
.mUpdate();              // Neue Matrix auf Display ausgeben, alt/neu "tauschen"
.mClean(n);              // Löscht die angegebene Matrix

.dataNew;                // Adresse der neu zu beschreibenden MAtrix
.dataOld;                // Adresse der Matrix, die den aktuellen Dot-Zustand hält
 

Alle Aktionen für eine Flip-Dot Anwendung basieren auf diesen Grundbefehlen.

Fonts und Bilder darstellen

Das Darstellen von Zeichensätzen und Bildern geschieht natürlich immer auf Pixel-Basis. Dazu definiert man Variablen, die z.B. das Pixelabbild einer Ziffer oder eines ganzen Fonts repräsentieren. Dabei können recht große Datenumfänge generiert werden, die dem kleinen Speicher des Arduino zu schaffen machen könnten. Meine Freunde haben dagegen immer wieder den Wunsch geäußert, fertige Fonts aus der Library nutzen zu können.

Bisher können per .char4x7(n,x,y) nur Ziffern in einem 4x7 Font genutzt werden. Dies werde ich demnächst erweitern. Wer Speicherplatz benötigt, kann über die wwFlipConfig.h alle oder einzelne Fonts aus der Library ausschließen.

// Um Speicherplatz zu sparen, diese Zeile bitte mit // inaktiv setzen
// dann können .char4x7() und .mChar4x7() allerdings nicht mehr genutzt werden
#define font4x7 1

Library in die Arduino IDE einbinden

Zum Einbinden der wwFlip.h wählt man in der Arduino IDE den Menüpunkt Sketch -> Bibliothek einbinden -> -ZIP-Bibliothek hinzufügen.... Im sich öffnenden Dateimanager wählt man die von mir erhaltene wwFlip.zip Datei. In meinem Windows 8 System führt das im Oktober 2018 dazu, dass der Ordner C:\Users\Rainer\Documents\Arduino\libraries\wwFlip angelegt und mit dem Inhalt der Library gefüllt wird. Im Library Ordner findet man die Beispiele und die wwFlipConfig.h Datei.

Einbinden der wwFlip.h in die Arduino IDE

Einbinden der wwFlip.h in die Arduino IDE

Natürlich benötige auch das DS3231 Uhrenmodul eine passende Library. Bei Github findet man diverse Angebote. Ich habe in meine Beispielen die RtcDS3231.h von Makuna verwendet. Sie wird genau so wie oben beschrieben in die Arduino IDE eingebunden.

Setup in der wwFlipConfig.h

Meine BROSE Flip-Dot und KRUEGER Flip-Dot Arduino Software habe ich 2018 in einer Library zusammengefasst. Die Hardwarekonfiguration stellt man vor der Benutzung 1x in der wwFlipConfig.h ein.

Für den, der nur ein Modul von mir erhalten hat, stelle ich das alles schon richtig in der ZIP Datei ein. Man muss dann in diesem Abschnitt nicht weiter lesen!

Bei mir hat Arduino die Config Datei unter C:\Users\Rainer\Documents\Arduino\libraries\wwFlip\src abgelegt - ansonsten einfach mal auf dem PC nach wwFlipConfig.h suchen.

Speicherort der wwFlipConfig.h

Speicherort der wwFlipConfig.h

Die Config Datei kann mit jedem Texteditor geöffnet und bearbeitet werden. Ich empfehle dazu das notepad++ .Neuere Versionen der wwFlipConfig.h können von diesem Bild abweichen - die Funktionalität bleibt dabei die gleiche.

/***************************************************************************
wwFlipConfig.h

Rainer Radow
30171 Hannover, Germany

2018-10-31 FlipDot und FlipEck zusammengefasst
********************************************************************************/
// Zwischen KRUEGER und BROSE kann nur in der wwFlipConfig.h umgestellt werden
// Auch MODULANZAHLMAX kann nur hier in der Config eingestellt werden
// Die Modulgröße kann später im Arduino-Code per .dotSetu(...) gewählt werden
// Wer nur eine Modulgröße besitzt, stellt es am besten hier in der config.h ein

// Voreinstellung für BROSE - für KRUEGER aus der folgenden Zeile // entfernen
//#define flipKrueger 1  // die eckigen KRUEGER Flip-Dots

#ifndef flipKrueger  
  #define flipBrose 1  // die zumeist runden BROSE Flip-Dots
#endif

#define MODULANZAHLMAX 1  // Maximal mögliche MODULANZAHL. default = 1
// Über diesen Parameter wird die Feldgröße für den Dot-Speicher festgelegt
// Im Scetch kann man dann Displays bis zu dieser Größe konfigurieren.
// Mehr Module = mehr von der Library benötigter Speicherplatz.

#define MODULANZAHL 1     // Anzahl der verwendeten Module. default = 1

// Ab hier wird nach KRUEGER und BROSE Flip-Dots unterschieden 
#ifdef flipKrueger  //========================================= KRUEGER Flip-Dots
  #define ORIENTIERUNG 1    // default = 3, möglich = 1,2,3,4
  // Standard Orientierung für ein liegendes Modul mit der Elektronik rechts
  // kann im Arduinocode jederzeit geändert werden.
  
  #define XANZAHLPROMODUL 16 // Anzahl von Dots pro Modul in X Richtung 
  #define YANZAHLPROMODUL 24 // bzw in Y Richtung, unabhängig von der Orientierung
  
#elif flipBrose == 1//=========================================== BROSE Flip-Dots
  #define ORIENTIERUNG 1    // default = 1, möglich = 1,2,3,4
  // Standard Orientierung mit der Elektronik unten
  // kann im Arduinocode jederzeit geändert werden  
  
  #define brose28x19   // passt zur Not für alle BROSE Platinen (siehe Text unten)
  //#define brose14x19
  //#define brose21x7  // 21x7 Modul mit einfach bestückter Platine
  //#define brose21x16
  //#define brose28x10
  //#define brose28x16
  // In der zum Modul passenden Zeile bitte // entfernen
  // default = #define brose28x19 - funktioniert außer bei 21x7 immer
  //Ursprung x=1/y=1 nicht unbedingt links/oben in der Ecke
#endif
// ==============================================================================

Für 1 KRUEGER Modul müssen lediglich vor #define flipKrueger 1 die beiden Striche // entfernt werden.

Für 1 BROSE Modul muss lediglich im unteren Teil das richtige Modul durch Entfernen der Striche // gesetzt werden. Es darf immer nur ein MODUL gesetzt sein! Bis auf die 21x7 Module sind alle meine wwFlip-Platinen gleich aufgebaut und arbeiten mit dem Setup #define brose28x19. Da aber die BROSE-Module unterschiedlich verschaltet sind, liegt dann x=1/y=1 nicht immer links/oben in der Ecke.

Je nach Einbausituation des Moduls kann man den Ursprung für x und y softwaretechnisch so einstellen, dass er sich links oben befindet. Das geht auch während der Programmausführung, wodurch interessante Effekte erzielt werden können.

Arduino NANO Treiber

Die serielle Schnittstelle der Chinesischen Nanos sind auf manchen Rechnern nicht ganz einfach zu installieren.


erklärung kommt hier demnächst - ansonsten einfahc mich ansprechen!

Arduino NANO Board auswählen

Die Library ist speziell für den Arduino Nano geschrieben, da sie dessen Hardware-Timer zur Steuerung der Flip-Dauer verwendet. Bevor man die in der Library enthaltenen Beispiele in der Arduino IDE sehen kann, muss man unter "Werkzeuge" den Nano auswählen.

Aber Achtung: in der Arduino IDE ab 1.8.7 wird zwischen altem und neuem Bootloader unterschieden. Die meisten China Nanos haben (2018) bei ihrer Geburt den alten Bootloader erhalten. Der auffälligste Unterschied des neuen Bootloaders besteht in der doppelten Baudrate (115.200) bei der Programmierung. Bricht die Programmierung nach dem Befehlt Overriding Baud Rate: 115200 ab, sollte man die Einstellung "Alter Bootloader" ausprobieren!.

Für die wwFlip Library muss der Arduino Nano mit ATmega328P ausgewählt sein

Für die wwFlip Library muss der Arduino Nano mit ATmega328P ausgewählt sein

Programmbeispiel

Hat man den Arduino NANO unter Werkzeuge ausgewählt, kann man in der IDE unter Datei - Beispiele - wwFlip diverse Programmbeispiele laden und auf dem Flip-Dot Display laufen lassen.

Nach Auswahl des Nanos sind die Beispiele für die wwFlip Library in der IDE sichtbar<br>(ich füge laufend etwas Neues hinzu!)

Nach Auswahl des Nanos sind die Beispiele für die wwFlip Library in der IDE sichtbar
(ich füge laufend etwas Neues hinzu!)

Das sehr einfach gehaltene Beispiel wwFlipdot-basic-test gibt einen ersten Einblick in die Programmierung mit der wwFlip.h. Bis auf die Zeile ww.setCoilFlipDuration(600) sollte dieser Code für sich sprechen.

// ******************************************************************************
// wwFlipdot-basic-test
// 2018-05-20
//
// c by Rainer Radow, 30171 Hannover, Germany
// radow.org
// ******************************************************************************
#include "wwFlip.h"  // wwFlip.h einbinden
wwFlip ww;           // Erzeugung des Objekts ww als Exemplar der Klasse wwFlip
                     // hierüber sprechen wir alle Funktionen der wwFlip.h an.
// ==============================================================================
void setup() {       // Arduino übliche setup() Funktion
  ww.begin();        // Startet die Vorbereitung des ww Objekts
  ww.dotPowerOn();   // schaltet die Flippspannung auf die Treiberbausteine
  ww.setCoilFlipDuration(600); // setzt die Stromdauer pro Flipp in Mikrosekunden
  
  ww.setAll(2);      // setze alle Dots im Modul mit einer Verzögerungszeit von 
                     // 2 Millisekunden zwischen jedem Flip
  delay(100);        // warte 100 Millisekunden
  ww.resetAll(0);    // lösche alle Dots so schnell es geht, ohne Verzögerung
  delay(100);        // warte 100 Millisekunden
}
// ==============================================================================
void loop() {         // Arduino übliche loop() Funktion
  ww.setDot(1, 1);    // flippt das Dot X=1,  Y=1 auf die farbige Seite
  ww.resetDot(10, 1); // flippt das Dot X=10, Y=1 auf die schwarze Seite
  delay(500);         // warte 500 Millisekunden
  
  ww.resetDot(1, 1);  // flippt das Dot X=1,  Y=1 auf die schwarze Seite
  ww.setDot(10, 1);   // flippt das Dot X=10, Y=1 auf die farbige Seite
  delay(500);         // warte 500 Millisekunden
}
// ==============================================================================
// ==============================================================================

Vorwahl der Flippdauer

Für ein vollständiges Flippen eines Dots muss der Eisenkern in der Flip-Dot Spule so intensiv ummagnetisiert werden, dass das neue Magnetfeld ausreicht, um das Dot gegen alle mechanischen Widerstände in der Achse und in der Luft, sowie gegen die Schwerkraft in seine neue Position zu bewegen und dort dauerhaft fest zu halten. Die in den Eisenkern geleitete Energie ergibt sich aus dem Innenwiderstand der Spule, der angelegten Spulenspannung und der Dauer des Stromflusses.

Über den Programmcode können wir die Dauer des Stromfluss pro Flipp einstellen. Lassen wir den Strom nur sehr kurz fließen, flippt das Dot vielleicht nicht um - wir erhalten aber ein sehr reaktionsschnelles Display. Kaputtgehen kann dabei nichts! Lassen wir den Strom länger fließen, flippen die Dots sicher um. Die Hard- und Software des wwFlip verhindern dabei, dass wir die Spulen durch ein zu langes Bestromen zerstören.

Wegen der unterschiedlichen mechanischen und elektrischen Eigenschaften der Module muss man für SEIN Modul immer erst die richtige Flippdauer durch Tests ermitteln, die danach als Standard zu verwenden ist. Durch ein bewusstes Reduzieren der Flippdauer kann man künstlerische Effekte erzielen.

.setCoilFlipDuration(t);
// setzt die Stromdauer pro Flipp zu t Mikrosekunden
// 1µS = 1 Mikrosekunde = 0,000 001 Sekunden
// 1000 Mikrosekunden = 1 Millisekunde = 0,001 Sekunden
 
// Für die schnellen KRÜGER Module ist t auf eine DURATIONALLOWED = 1000 begrenzt

// Für die BROSE Module ist t auf eine DURATIONALLOWED = 2000 begrenzt.

Die BROSE Module sind so aufgebaut, dass die benötigte Flippenergie mehr oder weniger lageunabhängig ist. Die KRUEGER Module sind dies durch ihren mechanischen Aufbau mit halber Klappe jedoch nicht. Deshalb gibt es zwei weitere Befehle, die unterschiedliche Flippdauern für das schwarz Stellen und das farbig Stellen festlegen. Bei einem "liegenden" KRUEGER Modul stellen wir dann für das Heraufklappen eine längere Zeit ein, als für das Herunterklappen.

.setCoilResetDuration(t) // Dauer des Flip-Impuls für das schwarz Flippen
.setCoilFlipDuration(t)  // Dauer des Flip-Impuls für set und reset 
// setzt die Stromdauer pro Flipp zu t Mikrosekunden
// 1µS = 1 Mikrosekunde = 0,000 001 Sekunden
// 1000 Mikrosekunden = 1 Millisekunde = 0,001 Sekunden
 
// Für die schnellen KRÜGER Module ist t auf eine DURATIONALLOWED = 1000 begrenzt

// Für die BROSE Module ist t auf eine DURATIONALLOWED = 2000 begrenzt

Hilfe bei unwilligen Dots

Magnetische Probleme

Flip-Dot Module haben ein magnetisches Gedächtnis - das ist der Trick, es kann aber auch der Fluch sein. Hat man die Module über längere Zeit nicht bewegt, scheint es, dass sie nicht mehr so gerne aus der Lagerposition herausflippen möchten. Vielleicht hat sie vorher auch jemand mit einer größeren Spannung und/oder Energie flippen lassen, als man selbst das jetzt tut. Dieser Effekt kann also auch auftreten, wenn man sehr unterschiedliche Werte für die CoilFlipDuration verwendet. In diesem Video sieht man einige "faule" Dots, die immer etwas länger zum Umschalten benötigen:

Dies bedeutet aber keine dauerhafte Schädigung der Module. Meiner Erfahrung nach muss man die Eisenkerne nur ein paar mal hin und her "schütteln", damit sie sich wieder neutral verhalten. Dazu wiederholt man in einer Schleife die Befehle setAll(t) und resetAll(t) mit an das Modul angepassten Variationen der Wartezeit t. Weiterhin kann man in solch einer Schleife auch laufend die CoilFlipDuration verändern. Wenn das alles nichts hilft, sollte man nach mechanischen Ursachen fahnden.

Mechanische Probleme

Die KRUEGER Flip-Dot Module sind generell sehr unanfällig gegen mechanische Störungen. Bei langer Lagerung haften die Klappen manchmal am Grundkörper. Ein einmaliger kleiner "Schubs" genügt hier. Aber Vorsicht, das was wir da als kleine Platte sehen, ist der aus Magnetpulver gepresste Permanentmagnet. Bei ruppiger Behandlung bricht hier auch schon einmal eine Ecke ab.

Man kann die Plastikgrundkörper eines jeden Dots mit den darauf befindlichen Klappen leicht auswechseln. Sie sind in den Spalten-Blechrahmen nur eingeklippst. Man schraubt dazu vorher am besten die ganze Spalte vom Modul ab. Es ist zu beachten, dass die Klappen in einer Spalte immer abwechselt mit den Nordpol und dann mit dem Südpol schwarz lackiert sind. Dies wahrscheinlich zur Vermeidung einer gegenseitigen magnetischen Beeinflussung der Dots untereinander? Beim Austauschen der Dots ist also deren Polung zu beachten.

Einzelteile der Krüger Flip-Dot Module:<br>Dot-Grundkörper, magnetische Platte, Spule und Spaltenblech

Einzelteile der Krüger Flip-Dot Module:
Dot-Grundkörper, magnetische Platte, Spule und Spaltenblech

Die einfachsten mechanischen Probleme bei den BROSE Modulen stellen teilweise aus den Führungen herausgerutschte Achsen und Verschmutzungen an den Dots oder den Achsen dar. Die BROSE Dots kann man sehr leicht und unproblematisch aus den schwarzen Plastikgehäusen ausklipsen, begutachten und wieder einklipsen - das alleine hilft manchmal schon! Achtung! Dots nur mit sauberen und fettfreien Fingern einsetzen, damit es keine Abdrücke auf der mattschwarzen Dotfläche gibt.

Ausgeflippte Dots können einfach wieder eingesetzt werden (Radow © 2017-03-27)

Ausgeflippte Dots können einfach wieder eingesetzt werden (Radow © 2017-03-27)

Bei neuen BROSE Modulen sind die gestanzten Achsen teilweise zu lang. Das erkennt man daran, dass sie sich nur recht schwer drehen lassen bzw. klemmen. Diese Achsen kürzt man mit der Nagelfeile vorsichtig - bitte nur ganz vorsichtig Stück für Stück und zwischendurch immer testen - sonst sind die Achsen auch schnell zu kurz!

Weiterhin habe ich sehr scharfkantige oder ungleichmäßig abgenutzte Achsen gesehen. Hier muss man sich das Ganze unter der Lupe anschauen und ggf. auch wieder mit der Nagelfeile nacharbeiten. Das Abrunden der Achsen kann generell die Flippfeudigkeit der Dots erhöhen. Bei ganz störrischen Dots könnte man sie per Programmcode 2x hintereinander in die gleiche Richtung flippen lassen - das war bei meinen Modulen bisher aber noch nie nötig.

!!! Seite wird gerade überarbeitet - 31.10.2018 ... !!!

3 KRUEGER Flip-Dot Module nebeneinander schalten

Mechanischer Aufbau mit meinen wwFlip-Modulen

Die KRUEGER 16 x 24 Module können stehend in beliebiger Anzahl seitlich aneinandergereiht werden. Die sich ergebende Dot-Matrix ist dann 24 Pixel hoch und n* 16 Pixel breit. Hier zeige ich einen Aufbau mit drei Modulen. Zunächst steckt man auf das linke Modul die Platine mit dem Arduino und der Uhr. Von hinten gesehen ist das dann natürlich das rechte Modul.

In die Mitte steckt man das Modul mit dem 5V DC/DC Wandler. Nur an dessen Rundstecker schließt man die Spannungsversorgung von 12 bis 24 Volt. So ist der Weg des Stroms zu allen Pixeln relativ gleich lang. Außen rechts (links von hinten gesehen) platziert man ein Modul ohne jegliche Aufsätze. Wenn man als Basis eine Platine mit Arduino UND Booster besitzt, verwendet man als Erweiterung zwei Module ohne weitere Aufsätze. Die Platine mit dem Arduino muss aber immer von hinten gesehen rechts sitzen, da diese das Schieberegistersignal an die Folgemodule aussendet. Wenn alles schön ausgerichtet steht, setzt man je einen Brückenstecker auf die Übergänge zu den Folgemodulen.

3x Krüger Flip-Dot Modul Rückseite

3x Krüger Flip-Dot Modul Rückseite

Softwareanpassung für 3 Module

Will man mehr als ein Modul vom Arduino NANO ansteuern lassen, muss man das in der wwFlipConfig.h einstellen. Auf meinem Windows 8 Rechner findet sich diese Datei der wwFlip Library im Ordner C:\Users\Rainer\Documents\Arduino\libraries\wwFlip\src. Sonst einfach mal nach wwFlipConfig.h auf dem Rechner suchen.

Innerhalb der wwFlipConfig.h erhöht man MODULANZAHLMAX und MODULANZAHL auf 3. Das war es auch schon. Für die Software ist das Display damit in x Richtung 3x 16 Dots = 48 Dots breit. Die Funktionen setDot und resetDot erreichen danach jeden Punkt im Wertebereich X=1 - X=48 und Y=1 - Y=24.

...
#define MODULANZAHLMAX 1  // Maximal mögliche MODULANZAHL. default = 1
// Über diesen Parameter wird die Feldgröße für den Dot-Speicher festgelegt.
// Im Sketch kann man dann Displays bis zu dieser Größe konfigurieren.
// Mehr Module = mehr von der Library benötigter Speicherplatz.

#define MODULANZAHL 1     // Anzahl der verwendeten Module. default = 1
...

3 Stück 16x24 KRUEGER Flip-Dot Module

Achtung - Video bitte bis zum Ende schauen - es wird immer schneller. Im Video beträgt die Versorgungsspannung 24 Volt.

keine Verfolgung durch soziale Medien

Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0