Forum: Mikrocontroller und Digitale Elektronik PixelStick Nachbau mit MSP430 und WS2812b Bildverarbeitung


von Benjamin B. (benjamin_b320)


Lesenswert?

Hallo Zusammen

Also da es mein Erster Beitrag ist, stell ich mich noch kurz vor:
Ich heisse Benjamin und bin 20 Jahre alt. Momentan in der Elektroniker 
Lehre, begeisterter Fotograf und Drohnennpilot .
Programmiert habe ich bis jetzt vor allem mit dem Arduino. In der Schule 
haben wir nun mit Konsolen Anwendungen gestartet, aber halt noch die 
Basics.


Nun zu meinem Projekt:
Ich möchte einen PixelStick nachbauen. Dies ist für die Nachtfotografie 
sehr interessant um Grafiken, oder Farbmuster darzustellen.
Dies geschieht mit einer Langzeit Belichtung, während man den Stab 
(zuerst) in einer Vorgegebener Zeit über eine Distanz bewegt. Die 
Distanz ist Grafikbreite die man darstellen will.
Später soll noch ein oder sogar zwei Beschleunigungssensoren dazu 
kommen... Aber mal Sekundäre Idee.
(PS. sie währen mit I2C angeschlossen)

Die LEDs sind alle Seriell Angesteuert und brachen 30µS zum die Daten zu 
übernehmen. Bei 288 LEDs (zwei mal 1Meter) muss ich 8.96mS pro Zeile 
einrechnen um jeder LED/Pixel die entsprechende Farbe zu zuordnen.

Mit den LEDs habe ich schon mit dem Arduino gearbeitet und schon selbst 
110 Stücke angesteuert.
Diese Funktionieren mit einem 24bit Mustter: 0b000000001111111100000000. 
Die ersten 8 für Rot, die zweiten 8 für Grün und die letzten 8 für Blau. 
In diesem Beispiel würden sie also Grün leuchten.

Auch der Strom ist berechnet und kommt auf 17.28A wenn alle LEDs Weis 
eingeschaltet sind.
Dafür verwende ich einen LiPo Akku mit 7.4V mit einem 100 W DC DC 
Wandler um auf 5V zu kommen, da ich keine 41.4W unnötig verbraten 
möchte.

Die Grafik wird schon auf 288 Pixelhöhe als PNG Grafik auf einer SD 
Karte gespeichert.
Das bedeutet bevor ich anfange zu rechnen muss ich überprüfen ob die 
Höhe stimmt. Ansonsten muss ich eine Fehlermeldung generieren.
Meine Idee war das ich zuerst alle Pixel Auslese und in RGB Arrays mit X 
und Y Koordinaten abspeichere.
(Oder zumindest einen Puffer von -+2 bis 3 Zeilen)
Bei Meinen Beispiel Bild währen es ca 124'000 Pixel also 373'000 RGB 
Werte die mit den Entsprechenden Koordinaten versehen werden müssen.

So weit so gut.


Nur wie bekomme ich diese RGB Werte? Ich müsste die RGB werte jeweils 
Zeile für Zeile auslesen und abspeichern.

Als Ergebnis würde ich gerne etwas wie R[Y][X]; G[Y][X] und B[Y][X] 
erhalten.
Den die LED Ausgabe wird mit dem Befehl  LED[Nummer] = DRGB(R, G, B);

Ich hoffe sehr das ich alle Benötigten Infos drin habe. Auf Antworten 
Freue ich mich.

Grüsse
Benjamin

von I2C Überleger (Gast)


Lesenswert?

Gute Projektbeschreibung erstmal!

Aber was genau ist denn nun die Frage:
- Wie Du per Arduino eine SD-CARD ausliest?
oder
- WIE Du das PNG-Datenformat entschlüsselst?

Grundsätzlich würde ich ein anderes Datenformat nehmen, z.B. BMP.
Das ist simpel beherrschbar und bei 24Bit-BMP liegen die Daten
schon unkomprimiert in der richtigen Reihenfolge im Bitmap vor,
wenn das Bitmap zuvor um 90Grad gedreht wurde.

PNG kann wegen der Komprimierung sehr tricky werden.

Denn für Deine Echtzeitanwendung hast Du per Arduino weder Zeit noch 
Speicherplatz genug, um das ganze Bitmap zwischenzuspeichern.

von Benjamin B. (benjamin_b320)


Lesenswert?

Ich Gedenke das Projekt weiterhin hier zu Dokumentieren, falls es 
jemanden Interessiert.

Die Erfahrung die ich habe, habe ich alle auf Arduino Basis gesammelt.
Nun möchte ich, da ich in der Lehre bin, mit einem MSP430 anpacken. Den 
dieser verwenden wir auch viel im Geschäft.


> Wie Du per Arduino eine SD-CARD ausliest?

Korrektur: mit einem MSP430.
Hier habe ich mir überlegt auf eine Library zurück zu greifen.


>WIE Du das PNG-Datenformat entschlüsselst?

Ich denke wohl eher BMP.

Das grosse Fragezeichen steht bei mir vor allem beim Auslesen der 
Grafik.



Vielen Dank schon mal im Voraus.

von I2C Überleger (Gast)


Lesenswert?

Das BMP-Format ist ja tausendfach dokumentiert und simpel.
Allerdings solltest Du die Bilder unkomprimiert speichern,
BMP kann komprimiert und unkomprimiert genutzt werden.

Ist also Sache Deines Bildbearbeitungsprogramms,
es halt erstmal unkomprimiert und in RGB zu speichern.

Danach ist es einfach, als Einstieg:
https://www.itwissen.info/BMP-bitmap-file-format-Bitmap-Dateiformat.html

von Markus (Gast)


Lesenswert?

Die WS2812b sind für solche Anwendungen aber nicht so gut geeignet, da 
deren Wiederholrate recht gering ist (siehe hier
https://learn.adafruit.com/adafruit-neopixel-uberguide/the-magic-of-neopixels). 
400Hz mögen viel klingen, aber das kann sich in lustigen Mustern 
bemerkbar machen. Ich weiß ja nicht, wie weit Dein Projekt ist, aber 
überleg Dir das nochmal mit den LEDs, nimm lieber die SK9822/APA102C 
LEDs.

Und bezüglich des Datenformates kann ich mich nur meinen Vorrednern 
anschließen. Vergiss das mit dem PNG-Decoder auf dem MSP. Das braucht 
viel zu viel Ressourcen, und SD-Karten sind auf jeden Fall groß genug 
für Deine Zwecke, um die Bilddaten unkomprimiert zu speichern. 
Unkomprimiert kannst Du die dann Stück für reinstreamen, wenn du sie 
benötigst.

Gruß,

Markus

von Benjamin B. (benjamin_b320)


Lesenswert?

Hallo Markus

> 400Hz mögen viel klingen, aber das kann sich in lustigen Mustern
> bemerkbar machen.

Ich vermute mal das es für mich in diesem Projekt nicht zentral sein 
wird.
Den bei der Fotografie mit dieser Technik habe ich eine Belichtungszeit 
von mindestens 5 Sekunden.

>Ich weiß ja nicht, wie weit Dein Projekt ist, aber
>überleg Dir das nochmal mit den LEDs,...

Leider ist das zu diesem Zeitpunkt leider schon zu Spät. Das meiste 
Material, darunter auch die LEDs sind schon unterwegs oder verbaut.

Ich habe nun ein wenig mit BMP experimentiert. Ich habe bei Adobe 
Photoshop als BMP für Windows mit 24Bit und Adobe RGB 1998 ohne 
Komprimierung ein Bild exportiert.
Naja  das was ich bekommen habe ist weder in Hex noch in Dec oder Binär, 
nichts was mir irgendetwas Sinnvoll vorkommt.

Ich habe ein für mich zufällige zusammengeworfen von Sonderzeichen, 
Grossbuchstaben und Zahlen erhalten.
Betrachte ich die Daten falsch?

Kurz umgeschaut habe ich auch Webseite gefunden um Bilddateien direkt in 
Hex Array zu Wandeln. Was natürlich auch eine Möglichkeit wäre.
Ich selbst würde es bevorzugen diese Werte selbst zu ermitteln.

Die Webseite wäre z.B. 
http://www.digole.com/tools/PicturetoC_Hex_converter.php



Habt ihr eine gute Libery für den Zugriff auf eine SD Karte?

von I2C Überleger (Gast)


Lesenswert?

Benjamin B. schrieb:
> Ich habe ein für mich zufällige zusammengeworfen von Sonderzeichen,
> Grossbuchstaben und Zahlen erhalten.
> Betrachte ich die Daten falsch?

Sorry, was hattest Du denn erwartet?
Dass da ein ASCII-Text kommt in der Art
"Ein grüner Baum vor blauem Himmel..."?

Das sind natürlich reine Binärdaten mit den Farbwerten.
Ob DU die nun als ASCII, DEC, HEX interpretierst ist völlig schnuppe, es 
sind und bleiben binäre Farbwerte, im Wertebereich von 0-255.
Natürlich können da zufällig auch Werte bei sein, die sich als ASCII 
interpretieren lassen.

Diese Daten musst Du irgendwie zu den LED schaufeln, 3 Byte je Pixel 
wenn es unkomprimiertes 24Bit RGB ist.

Dabei natürlich die Header-Daten überspringen, bzw. denen die 
X/Y-Ausdehnung entnehmen und jeweils die Enden der Pixelzeilen 
kalkulieren, damit das Bild am Ende nicht zum Trapez wird.

von Alex G. (dragongamer)


Lesenswert?

Oder du baust dir ein eigenes Datenformat für die Bilder die du auf die 
microsd Karte ablegst. Die Library OpenCv für computer lädt beliebige 
Bilddateien und ermöglicht direkt zugriff auf die Bytewerte in Form 
eines Arrays das man nach belieben in eine Datei schreiben kann.

BMP ist aber in der tat mit wenig Einarbeitung beherschbar und sollte 
auch kaum overhead haben.


Benjamin B. schrieb:
> Ich vermute mal das es für mich in diesem Projekt nicht zentral sein
> wird.
> Den bei der Fotografie mit dieser Technik habe ich eine Belichtungszeit
> von mindestens 5 Sekunden.
So kannst du nicht rechnen. Du hälst deinen Stab ja nicht still!

Nehmen wir mal an du willst einen Text mit dem Teil darstellen. Dazu 
würdest du den Stab aufrecht, horizontal einmal quer über das gesamte 
Bild bewegen.
Im optimalfall könntest du also binnen 5 Sekunden, 2000Pixel horizontal 
darstellen da 5 mal 400hz.
Könnte grade so für ansehliche Ergebnisse reichen, würde ich schätzen.

: Bearbeitet durch User
von Benjamin B. (benjamin_b320)


Lesenswert?

I2C Überleger schrieb.
> Sorry, was hattest Du denn erwartet?
> Dass da ein ASCII-Text kommt in der Art
> "Ein grüner Baum vor blauem Himmel..."?

Nein so sicher nicht, ich habe naiv geglaubt das es schön Dezimal oder 
in HEX zumindest eine Regelmässigkeit aus zu machen sei.

Nun ich bin nochmals mit 4x4Pixel Grafiken am üben und zu 
interpretieren. Den erst wen ich das Aufbauprinzip verstanden habe kann 
ich an die Programmierung gehen.



Alex G. schrieb.
> Nehmen wir mal an du willst einen Text mit dem Teil darstellen. Dazu
> würdest du den Stab aufrecht, horizontal einmal quer über das gesamte
> Bild bewegen.
> Im optimalfall könntest du also binnen 5 Sekunden, 2000Pixel horizontal
> darstellen da 5 mal 400hz.
> Könnte grade so für ansehliche Ergebnisse reichen, würde ich schätzen.

Richtig. Da gebe ich dir vollkommen Recht.

Aber mal kurz Nachgerechnet:
Ich habe meinen Stab mit 288 Pixel Höhe. Bei einem Bild mit ist das 
Seitenverhältnis oft 2:3. Dies bedeutet das ich eine Kantenlänge von 432 
Pixel bekomme, auf eine Distanz von 3 Meter.
Auch ist zu beachten das ich im Dunkel nicht gern und gut mal 5+ mehr 
Sekunden muss belichten.

Da ich eine Auflösung von 144 LEDs Pro Meter habe (Gegeben durch den LED 
Streifen) würden 2000Pixel für eine Grafik von 13.8 Meter reichen.
Für diese Anwendung genügt die Geschwindigkeit der LEDs sicher.

Wegen der Qualität der Angezeigter Grafik: Die LEDs haben auch ein 
Streulicht, welche die Grafik mit einem ungewollten "Weichfilter" 
versehen.


Danke viel mal für diese Überlegungen. Komme immer näher an das Ziel.

Grüsse
Benjamin

von Borislav B. (boris_b)


Lesenswert?

Ich würde mir vermutlich einen Bildconverter für den PC schreiben 
(Python, C#, was auch immer Dir liegt). Da wäre es ein leichtes die 
Pixel aus jedem beliebigen Format auszulesen, und dann als Rohwerte nach 
deinen wünschen in eine neue Datei (.raw) zu speichern.

von Teo D. (teoderix)


Lesenswert?

Benjamin B. schrieb:
> Ich habe meinen Stab mit 288 Pixel Höhe.

288 LEDs a max. 60mA = ?
Ich hoffe das ist auch mit in die Planung eingeflossen!?

von Benjamin B. (benjamin_b320)


Lesenswert?

Teo D. schrieb:
> 288 LEDs a max. 60mA = ?
> Ich hoffe das ist auch mit in die Planung eingeflossen!?


Benjamin B. schrieb:
>> Auch der Strom ist berechnet und kommt auf 17.28A wenn alle LEDs Weis
>> eingeschaltet sind.
>> Dafür verwende ich einen LiPo Akku mit 7.4V mit einem 100 W DC DC
>> Wandler um auf 5V zu kommen, da ich keine 41.4W unnötig verbraten
>> möchte.

Für den Übergang habe ich mir einen fast Militär Stecker ausgesucht der 
20A verträgt.
Schlussendlich habe ich einen 86.3W Scheinwerfer auf einem Stab. Um auch 
die Energie in Form von Wärme los zu kriegen, werden die Streifen in 
einem Aluminiumprofil montiert.

Was ich mir überlege ist mehr wegen dem Signal-Kabel. Dieses wird ich 
wohl abschirmen müssen um Störungen zu vermeiden.


Borislav B. schrieb:
> Ich würde mir vermutlich einen Bildconverter für den PC schreiben
> (Python, C#, was auch immer Dir liegt). Da wäre es ein leichtes die
> Pixel aus jedem beliebigen Format auszulesen, und dann als Rohwerte nach
> deinen wünschen in eine neue Datei (.raw) zu speichern.


Ich würde gerne das Bild nur richtig Exportieren müssen. Wenn dann vor 
dem Start zuerst seine Zeit braucht um die Bilddatei zu lesen macht mir 
das nichts.
Ich muss diese jedoch genügend schnell abrufen können.


Grüsse
Benjamin

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.