Um die Bilder auf dem RasPi zu bearbeiten, nutzen Sie ein Malprogramm wie etwa Kolourpaint [5]. Der Befehl aus Listing 1 hat es bereits bei der Installation von Java und der Tools mit auf den Mini-Rechner gebracht. Da Malprogramme sich mit Schriften in einer so kleinen Größe schwertun, hilft eine Tabelle mit den für das Panel passenden Zeichen [6].
Das eigentliche Programm (Listing 2) entspricht in weiten Teilen dem Beispiel aus dem Artikel in der letzten Ausgabe; es sind lediglich das Öffnen der Bilddatei und der Laufschrifteffekt hinzugekommen. Den Namen der zu öffnenden Datei übergeben Sie dem Java-Programm einfach als Argument. Zwei Beispieldateien finden Sie im Download-Bereich zu diesem Artikel.
Listing 2
Ticker.java
import com.github.mbelling.ws281x.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Ticker{
private static int buffer [][][] = new int[64][8][3];;
private static void writeBufferToMatrix(Ws281xLedStrip matrix) {
int i=0;
for (int x=0 ; x<64 ; x++){
if ((((i)/8)%2)==0){
for (int y=0 ; y<8 ;y++) {
matrix.setPixel(i,buffer[x][y][0],buffer[x][y][1],buffer[x][y][2]);
i++;
}
} else {
for (int y=7 ; y>-1;y--) {
matrix.setPixel(i,buffer[x][y][0],buffer[x][y][1],buffer[x][y][2]);
i++;
}
}
}
matrix.render();
}// writeBufferToMatrix
public static void main( String[] args ){
Ws281xLedStrip matrix = new Ws281xLedStrip(512,18,800000,10,16,0,false,LedStripType.WS2811_STRIP_GRB,false);
BufferedImage image=null;
try {
image = ImageIO.read(new File(args[0]));
} catch (IOException e) {
e.printStackTrace();
}
while(true) {
for (int i = 0; i < image.getWidth(null) - 64; i++) {
try {Thread.sleep(80); } catch (Exception e) { }
for (int x = 0; x < 8; x++) {
for (int y = 0; y < 64; y++) {
java.awt.Color c = new java.awt.Color(image.getRGB(y+i,x));
buffer[y][x][0] = c.getRed();
buffer[y][x][1] = c.getGreen();
buffer[y][x][2] = c.getBlue();
}//y
}//x
writeBufferToMatrix(matrix);
}//i
}// while
}//main
}//class
Um den Effekt einer Laufschrift zu erreichen, schreibt die Software die Farbinformationen der einzelnen Pixel aus dem Bild in den Puffer. Ist er komplett gefüllt, gibt ihn das Programm auf das Display aus. Den Bereich im Bild, den es kopiert, verschiebt es immer um ein Pixel nach rechts (Variable i). Auf diese Weise entsteht der Effekt einer Laufschrift.
Um das Beispielprogramm auf dem RasPi zu erzeugen, verwenden Sie die Anweisung aus der ersten Zeile von Listing 3. Das gebaute Java-Programm starten Sie mit dem Kommando aus der zweiten Zeile.
Listing 3
Programm übersetzen und starten
$ javac -cp /home/pi/rpi-ws281x-java/build/libs/rpi-ws281x-java-2.0.0-SNAPSHOT.jar:. Ticker.java $ sudo java -cp /home/pi/rpi-ws281x-java/build/libs/rpi-ws281x-java-2.0.0-SNAPSHOT.jar:/home/pi/apache-log4j-2.13.3-bin/log4j-api-2.13.3.jar:/home/pi/apache-log4j-2.13.3-bin/log4j-core-2.13.3.jar:. Ticker Ticker_Weihnachten.png $ nohup sudo java -cp /home/pi/rpi-ws281x-java/build/libs/rpi-ws281x-java-2.0.0-SNAPSHOT.jar:/home/pi/apache-log4j-2.13.3-bin/log4j-api-2.13.3.jar:/home/pi/apache-log4j-2.13.3-bin/log4j-core-2.13.3.jar:. Ticker Ticker_Weihnachten.png &
TIPP
In Listing 3 sind zum besseren Verständnis die nötigen Klassenpfade immer komplett mit angegeben. Es wäre eleganter, stattdessen die Variable CLASSPATH zu verwenden.
Wünschen Sie eine dauerhafte Ausgabe der Laufschrift, trennen Sie den Aufruf mit dem Unix-Kommando nohup vom Terminal ab und legen das Programm mit & in den Hintergrund (Listing 3, letzte Zeile). Zum Beenden benötigen Sie dann das Kommando kill mit der entsprechenden Prozess-ID.
Fazit
Das hier gezeigte Panel ist ein echter Hingucker. Die Kosten lassen sich wegen des gedruckten Gehäuses etwas schwierig einschätzen, liegen aber keinesfalls über denen eines fertig gekauften Pendants. Da Sie das Programm zum Ansteuern selbst in Java schreiben, sind Sie allerdings viel flexibler als bei gekauften Lösungen. Zudem besteht die Möglichkeit, das Display selbst zu vergrößern, indem Sie LED-Module mit einer 32×32-Matrix verwenden. Es macht auf jeden Fall viel Spaß, das Panel zu bauen und zu programmieren.
Das hier gezeigte Programm soll nur als Beispiel dienen. Es beschränkt sich auf eine rudimentäre Fehlerbehandlung und ist nicht besonders tolerant gegen Fehlbedienung. Diese Schwächen eignen sich als Ansatzpunkte für eigene Experimente. (agr)
Infos
- WS2812: Martin Mohr, “Kunterbunt”, RPG 10/2020, S. 50, https://www.raspi-geek.de/44949
- WS2812-Modul: https://de.aliexpress.com/item/4000225133465.html
- Tischnetzteil: https://www.reichelt.de/tischnetzteil-30-w-5-v-6-a-mw-gst60a05-p171051.html
- Imager: https://www.raspberrypi.org/downloads/
- Kolourpaint: http://kolourpaint.sourceforge.net
- Tabelle mit dem 5×7-Zeichensatz: https://mil.ufl.edu/3744/docs/lcdmanual/characterset.html





