Pages: [1]   Go Down
Author Topic: LOL Shield - Zusammenbau und Programmierung - Wer hat eins?  (Read 709 times)
0 Members and 1 Guest are viewing this topic.
Germany S-H
Offline Offline
Faraday Member
**
Karma: 134
Posts: 2849
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
hat irgendjemand schon mal ein LOL Shield (LOL = Lots of LEDs) zusammengelötet?

Es handelt sich dabei um Selbstbau-Shields, die als Bausatz vertrieben werden, bestehend aus Platine, 126 LEDs derselben Farbe und Pin-Headern. Da hat man ordentlich was dran zu löten, bis es fertig ist. Danach hat man ein Shield mit 126 einzeln ansprechbaren LEDs, die über Charlieplexing angesprochen werden.

Nachdem diese Shield-Bausätze seit neuestem auch von China-Versendern zu einem Spottpreis von knapp 11 EUR verfügbar sind, habe ich mir mal den Spaß gemacht und eins bestellt und gestern zusammengelötet.

Habt ihr Erfahrungen damit? Wie ist Eure Meinung zum LOL-Shield?

Mein Eindruck ist derzeitig sehr zwiespältig.

Einerseits habe ich schon vor dem Kauf gesehen, dass an Arduino-Boards mit einer PIN-13 LED immer auch "Geister-LEDs" mit schwach aufleuchten sollen, was man umgehen kann, wenn man entweder ein Board ohne PIN-13 LED verwendet oder die PIN-13 LED aus dem Board herauslötet.

Andererseits dachte ich aber auch, dass die LOLshield-Library ja wohl leicht auf die Verwendung anderer Pins anpaßbar sein müßte, aber Pustekuchen, so einfach ist das gar nicht. Eigentlich wollte ich die Library nur anpassen, so dass an einem UNO-Board (ich möchte die PIN-13 LED behalten) statt PIN-13 dann Analog-0/Pin-14 verwendet wird. Aber die LOL-Shield Library scheint so hardwarenah mit Hilfe der Controller-Register programmiert zu sein, dass ich es nicht zusammenbringe.

Aufgrund der hardwarenahen Programmierung mit Registern scheint das LOL-Shield auch nicht mal zum MEGA2560 kompatibel zu sein.

Jetzt bin ich am Überlegen, ob ich mir selbst irgendwas zum Charlieplexen an Code schreibe, das ohne die LOLShield-Library funktioniert und mir erlaubt, mir die verwendeten Pins am Arduino selbst frei auszusuchen.

Irgendwelchen alternativen Code für das LOL-Shield, der ohne die LOLShield-Library funktioniert, hat nicht zufällig irgendwo schon mal jemand entwickelt? Über Google konnte ich immer nur Code finden, der die LOLShield Library für das LOLShield verwendet. Und die Library scheint die Verwendung der von Pin-2 bis Pin-13 ziemlich fest und ohne eigene Änderungsmöglichkeit eingebaut zu haben.

Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 248
Posts: 21156
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mit dem Arduino R3 müßte da Problem der Led an Pin 13 nicht vorhanden sein, da ein OpAmp dieses entkoppelt.
Die LED anzusteuern müßte kein Problem sein da für jedes Led ein Ausgang LOW und ein anderer Ausgang HIGH gemacht werden muß; alle anderen Pins müssen hochohmig, sprich Eingänge sein. Die Arbeit wird nur sein rauszubekommen welches LED wie beschaltet ist und welche beiden Ausgänge jedes ansteuert.
Das Problem wird sein eine matematische Funktion zu erhalten um für jedes LED die Ansteuerung zu errechnen, um nicht eine Wertetabelle zu benötigen.
Die Matrix müßte 12 Pins brauchen wobei mögliche 6 LED nicht bestückt sind.

Grüße Uwe 
« Last Edit: March 08, 2013, 12:42:44 pm by uwefed » Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 248
Posts: 21156
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hab mir das File Charliplexing.cpp in der Bibliothek angeschaut und dort gibt es dieses Array:

Code:
typedef struct LEDPosition {
    uint8_t high;
    uint8_t low;
};

const LEDPosition ledMap[126] = {
    {13, 5}, {13, 6}, {13, 7}, {13, 8}, {13, 9}, {13,10}, {13,11}, {13,12},
    {13, 4}, { 4,13}, {13, 3}, { 3,13}, {13, 2}, { 2,13},
    {12, 5}, {12, 6}, {12, 7}, {12, 8}, {12, 9}, {12,10}, {12,11}, {12,13},
    {12, 4}, { 4,12}, {12, 3}, { 3,12}, {12, 2}, { 2,12},
    {11, 5}, {11, 6}, {11, 7}, {11, 8}, {11, 9}, {11,10}, {11,12}, {11,13},
    {11, 4}, { 4,11}, {11, 3}, { 3,11}, {11, 2}, { 2,11},
    {10, 5}, {10, 6}, {10, 7}, {10, 8}, {10, 9}, {10,11}, {10,12}, {10,13},
    {10, 4}, { 4,10}, {10, 3}, { 3,10}, {10, 2}, { 2,10},
    { 9, 5}, { 9, 6}, { 9, 7}, { 9, 8}, { 9,10}, { 9,11}, { 9,12}, { 9,13},
    { 9, 4}, { 4, 9}, { 9, 3}, { 3, 9}, { 9, 2}, { 2, 9},
    { 8, 5}, { 8, 6}, { 8, 7}, { 8, 9}, { 8,10}, { 8,11}, { 8,12}, { 8,13},
    { 8, 4}, { 4, 8}, { 8, 3}, { 3, 8}, { 8, 2}, { 2, 8},
    { 7, 5}, { 7, 6}, { 7, 8}, { 7, 9}, { 7,10}, { 7,11}, { 7,12}, { 7,13},
    { 7, 4}, { 4, 7}, { 7, 3}, { 3, 7}, { 7, 2}, { 2, 7},
    { 6, 5}, { 6, 7}, { 6, 8}, { 6, 9}, { 6,10}, { 6,11}, { 6,12}, { 6,13},
    { 6, 4}, { 4, 6}, { 6, 3}, { 3, 6}, { 6, 2}, { 2, 6},
    { 5, 6}, { 5, 7}, { 5, 8}, { 5, 9}, { 5,10}, { 5,11}, { 5,12}, { 5,13},
    { 5, 4}, { 4, 5}, { 5, 3}, { 3, 5}, { 5, 2}, { 2, 5},
};
mit den Pins für jede LED. Wenn Du statt dem Pin 13 das Pin 14 verwenden willst, brauchst Du nur die 13 durch die 14 auszutauschen. Ein Editor macht Dir das ja automatisch.

Die hartwarenahe Programmierung der TimerRegister, Interrupt und Ports ist einem Helligkeitsregelung der LED geschuldet.

Grüße Uwe
« Last Edit: March 08, 2013, 01:01:12 pm by uwefed » Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 134
Posts: 2849
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mit dem Arduino R3 müßte da Problem der Led an Pin 13 nicht vorhanden sein, da ein OpAmp dieses entkoppelt.

Danke für die Info! Das muß ich mal testen, wenn ich einen R3 zur Verfügung habe.

Die LED anzusteuern müßte kein Problem sein da für jedes Led eine ausgang LOW und ein anderer Ausgang HIGH gemacht werden muß; alle anderen Pins müssen hochohmig sprich Eingänge sein.

Ist schon klar, die Ansteuerung habe ich inzwischen raus. Allerdings bin ich mir über die erlaubten Zeitscheiben nicht so ganz im klaren, das Shield hängt die LEDs ja ohne Vorwiderstand an 5Volt, und man darf ja wohl nur sehr kleine Zeitscheiben mit dem hohen Strom durch die LED (und den Controller-Pin!) jagen, bevor wieder eine längere Pause eingelegt werden muß.

Konform zum Kontroller-Datenblatt wird der Betrieb aber wohl trotzdem nicht, denn selbst wenn jede LED nur 10 Mikrosekunden geschaltet wird, werden in den 10 Mikrosekunden wohl mehr Strom aus dem Controller-Pin gesaugt als 40 mA. Zu messen traue ich mich das nicht, wieviel Strom da tatsächlich fließt, denn zum Messen müßte ich die LED ja für mehrere Sekunden statisch an den Controller durchschalten, was wohl leicht zum Durchschmoren der LED oder eines Controller-Pins führen könnte.

Zu Anfang hatte ich es so, daß ich eingeschaltete LEDs mit 10 Mikrosekunden Anzeigedauer durchschalte bis das aktive Muster durch ist. Das ist natürlich Quatsch, denn dadurch ist die Refreshrate des Musters von der Anzahl der aktiven LEDs im Muster abhängig, und bei Mustern mit wenigen aktiven LEDs leuchten diese um so heller.

Jetzt steuere ich ein- wie ausgeschaltete LEDs mit je 10 Mikrosekunden Schaltdauer, das macht bei 126 LEDs dann 1260 Mikrosekunden plus Verarbeitungszeit, also eine Bildwiederholrate von gut 50 pro Sekunde.

Also Ansteuerung im Prinzip auch ohne LOLShield-Library möglich.

Die Arbeit wird nur sein rauszubekommen welches LED wie beschaltet ist und welche beiden Ausgänge jedes ansteuert.
Das Problem wird sein eine matematische funktion zu erhalten um für jedes LED die ansteuerung zu errechnen um nicht eine Wertetabelle zu benötigen.

Die Daten entnehme ich der Original-Library, da ist ein Array enthalten.

Die Matrix müßte 12 Pins brauchen wobei mögliche 6 LED nicht bestückt sind.

So isses. Das Shield arbeitet rein mit 12 Datenleitungen (im Original mit PIN-2 bis PIN-13). Einen Anschluß für "Ground" oder "5V" benötigt das Shield überhaupt nicht, um zu funktionieren.

Mal schauen, was man damit machen kann. Wenn man das Shield mit frei wählbaren 12 Pins benutzen kann, dürfte der Nutzen jedenfalls höher sein, als wenn immer und ständig Digital-2 bis Digital-13 komplett von dem Shield unabänderbar blockiert werden.

Mit einem freien Digital-2 oder -3 könnte man z.B. ein DCF-Funkuhrenmodul mit einer Interruptroutine betreiben. Oder Daten über ein Funkmodul empfangen.

P.S.: Die Library ist über eine reine Anpassung des Arrays NICHT mit anderen Pins zum Laufen zu bekommen, denn aus dem Array werden zwar die Pin-Nummern rausgezogen, von der Library geschaltet werden aber direkt Controller-Register und Ports. Und da reichen meine Kenntnisse nicht aus, da die richtigen Stellen zu finden, wo was an den Registern und Ports manipuliert werden muß, damit es wieder passt.
Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 248
Posts: 21156
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Charliplexing braucht auf allen Pins Vorwiderstände und zwar halb so groß wie aus der Berechnung des LED-Stromes resultieren. Dies weil immer 2 Widerstände in Reihe geschaltet sind. Da immer nur 2 Pins aktiv sind kann der max mögliche Strom von 40mA gewählt werden. Auche die LED verkraften den Überstrom.

Auf der Platine von: http://jimmieprodgers.com/2009/12/my-development-process/ sind Vorwiderstände drauf. wei zB:
http://farm5.staticflickr.com/4060/4442079045_5d084c4190_o.jpg
https://content.solarbotics.com/products/photos/8b44e3fdc3e9e9f36492d38d732122c5/med/39260-protocomp.jpg

Andere Versionen der Platine von jimmieprodgers sind ohne Vorwiderstände, ebenso die bei Watterott verkauft werden (olimex.com).

Ich finde das gefährlich für den Arduino. Natürlich sind die LED ohne Vorwiderstände heller und wenn man mit Charliplexing alle LED einschalten will braucht man 126 Zeitfenster um jede LED kurz einzuschelten. Wenn man dann noch mehrere Bilder Hintereinender zeigen will, dann kommt man bei 25 Bilder pro Sekunde auf eine Einschaltzeit von ca 0,3mS.

Zum Messen des LED-Stroms braucht Du nur den Stromverbrauch des Arduino messen. einmal als nullwert mit allen LED aus und das zweite Mal mit allen LED ein. Die Differenz ist der LED-Strom.

Quote
Jetzt steuere ich ein- wie ausgeschaltete LEDs mit je 10 Mikrosekunden Schaltdauer, das macht bei 126 LEDs dann 1260 Mikrosekunden plus Verarbeitungszeit, also eine Bildwiederholrate von gut 50 pro Sekunde.

Da ist 10µS die LED an und 140µS zum Umschalten aus.

Quote
P.S.: Die Library ist über eine reine Anpassung des Arrays NICHT mit anderen Pins zum Laufen zu bekommen, denn aus dem Array werden zwar die Pin-Nummern rausgezogen, von der Library geschaltet werden aber direkt Controller-Register und Ports. Und da reichen meine Kenntnisse nicht aus, da die richtigen Stellen zu finden, wo was an den Registern und Ports manipuliert werden muß, damit es wieder passt.
Du hast Recht; das war mein Fehler. Außer den Pins im Array ist auch der Port zu ändern. Da D0 bis D7 auf Port D liegen und D8  bis D13 auf Port B ist es einfacher den ganzen Block D2 bis D7 auf A0 bis A5, Port C zu verlegen anstatt einzelne Pins auszutauschen.

In der Interrupt-routine ISR(TIMER2_OVF_vect) { in Charliplexing.cpp müßtest Du die Ports ändern und auch noch die Berechnung der einzuschaltenen Pins da Port D die niederwertigsten Bits nicht verwendet (Pin 0 und 1) port C dagegen die höherwertigsten beiden Bits nicht verwendet.

Grüße Uwe
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 134
Posts: 2849
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Andere Versionen der Platine von jimmieprodgers sind ohne Vorwiderstände, ebenso die bei Watterott verkauft werden (olimex.com).

Ja, diesbezüglich gibt es keinen Unterschied zu meinem China-Billigbausatz: Keine Vorwiderstände.

Ich finde das gefährlich für den Arduino.

Ist es ja auch. Beim Programmieren ohne die Library muß man verdammt genau darauf aufpassen, dass keine LED zu lange geschaltet bleibt, bei Versorgung der LEDs mit 5 Volt ohne Vorwiderstand.

Zum Messen des LED-Stroms braucht Du nur den Stromverbrauch des Arduino messen. einmal als nullwert mit allen LED aus und das zweite Mal mit allen LED ein. Die Differenz ist der LED-Strom.

Danke für den Tipp! Kann ich nur momentan nicht umsetzen, denn ich habe nur ein einfaches Multimeter und versorge alle Arduinos über USB-Strom. Entweder zum Programmieren vom PC aus oder als Fertiggerät von einem USB-Netzgerät aus. Da komme ich mit meinem Multimeter nicht so einfach dazwischen.

Außer den Pins im Array ist auch der Port zu ändern. Da D0 bis D7 auf Port D liegen und D8  bis D13 auf Port B ist es einfacher den ganzen Block D2 bis D7 auf A0 bis A5, Port C zu verlegen anstatt einzelne Pins auszutauschen.

Mit Port- und Pinarrays herumzuspielen, das hebe ich mir mal für eine potentiell weniger kritische Schaltung auf. Muß ja nicht gerade mit dieser Schaltung sein, wo ein Fehler gleich das Shield und den Controller zum Schmoren bringen kann.
;-)

[Nachtrag vom 10.03.2013]
Hier noch als Nachtrag verschiedene Infos:

Geister LEDs am UNO:
Wie von Uwe vorhergesagt, gibt es die dunkel mitleuchtenden Geister-LEDs auf dem LOL-Shield nicht beim "UNO R3" und dazu kompatiblen Board-Designs. Getestet hier mit einem "Tosduino UNO R3". Das Problem der Geister-LEDs bezieht sich also rein auf andere Board-Designs mit PIN-13 LED, aber NICHT auf die R3-Boards. Daher ist die Original LOLshield-Library uneingeschränkt und ohne gelegentlich auftretende geisterhafte LEDs zu verwenden, wenn man einen UNO R3 verwendet.

Stromverbrauch:
Ich konnte zwar keine direkte Strommessung machen, aber ich habe hier ein Energiekosten-Messgerät, das auch Standby-Verbräuche einigermaßen genau messen kann, und das habe ich einmal den Verbrauch meines Arduino mit LOL-Shield messen lassen, um daraus den Stromverbrauch zurückzurechnen.

Mit Original-LOLShield Library ergibt sich folgender Verbrauch:
Alle LEDs aus: 0,427 W / 5V =  85 mA
Alle LEDs ein: 0,803 W / 5V = 161 mA
==> LED-Betrieb mit 161-85 =  76 mA

Mit meiner eigenen Charlieplexing-Ansteuerung (je 10 us Einschaltzeit):
Alle LEDs aus: 0,429 W / 5V =  86 mA
Alle LEDs ein: 0,594 W / 5V = 119 mA
==> LED-Betrieb mit 119-86 =  33 mA

Wie man sehen kann, ist der Verbrauch mit der selbstgeschriebenen Ansteuerung deutlich geringer. Man sieht auch deutlich, dass die LEDs mit der eigenen Ansteuerung nicht so hell leuchten wie mit der originalen Library. Dafür ist rein rechnerisch der LED-Strom mit 33 mA noch deutlich unterhalb der erlaubten 40 mA pro Pin, während die original LOLShield-Library die Pins während der (zugegebenermaßen kurzen) Einschaltdauer mit 76 mA bis fast zum doppelten des maximal erlaubten belastet.

Hinweis: Die LOLshield Library hat wohl auch eine Funktion, um die Helligkeit herunterzuregeln.

Na ja, mal schauen, ob sich doch noch jemand meldet, der ein solches Shield hat und etwas damit machen möchte.

« Last Edit: March 10, 2013, 12:45:19 pm by jurs » Logged

Pages: [1]   Go Up
Jump to: