Shop-Wechsel

Der Warenkorb wird nicht übernommen.

Zum Privatkunden Shop

LED-Bausätze

Programmierung unter Linux?

Beiträge zu diesem Thema: 11

ELV Bausatz 5x5x5-RGB-Cube RGBC555, ohne LEDs und ohne Netzteil

Artikel-Nr.: 105043

zum Produkt
Programmierung unter Linux?
Antwort als hilfreich markieren
0Positive Markierungen
Antwort als nicht hilfreich markieren
0Negative Markierungen
Melden Sie diesen Beitrag
21.04.2013, 18:25
Hallo, ich habe vor den Cube (allerdings als Matrix, vielleicht 14×9 mit einem fehlenden Pixel) in Kombination mit einem Raspberry Pi für eine per WLAN steuerbare Effektbeleuchtung verwenden. Dazu müsste die Elektronik, speziell der "Echtzeitmodus" allerdings aus einem GNU/Linux ansteuerbar sein.

Dazu meine Fragen: Wie genau läuft die Kommunikation PC ←→ Cube ab? Was für ein USB-Controller wird verwendet? Gibt es vielleicht schon einen einfachen Linux-Treiber?
Aw: Programmierung unter Linux?
Antwort als hilfreich markieren
0Positive Markierungen
Antwort als nicht hilfreich markieren
0Negative Markierungen
Melden Sie diesen Beitrag
21.04.2013, 18:30
Ach, gerade gefunden, es ist ein CP2102 USB-UART, der vom Kernel 3.x direkt unterstützt wird. Lesen hilft ja manchmal wirklich!

Dennoch bleibt die Frage wie genau bzw in welchem Format dann die Daten zum Würfel übertragen werden. Vielleicht hat ja jemand schon was in der Richtung gebaut?
Aw: Programmierung unter Linux?
Antwort als hilfreich markieren
0Positive Markierungen
Antwort als nicht hilfreich markieren
0Negative Markierungen
Melden Sie diesen Beitrag
23.04.2013, 08:30
Hallo felix.st,

das Protokoll und alles was man braucht ist im Journal Artikel aus 5/12 zu lesen http://www.elv.de/controller.aspx?cid=726&detail=41339

Ansonsten kann man einige Funktionen aus der Demoanwendung abschauen.

Ich selber habe den Cube bisher nur unter Windows verwendet (mit C++ und Visual Studio 2008) unter Zuhilfenahme der Demoanwendung.

Viele Grüße
Tanthalas

Unter Windos habe ich folgendes für den Verbindungsaufbau genutzt:

HANDLE serialport
COMMTIMEOUTS timeouts;
DCB port;
// open the comm port.
serialport = CreateFileA(portname,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);

if ( INVALID_HANDLE_VALUE == this->serialport)
{
cout << "ERROR: opening serialport" << endl;
}

// get the current DCB, and adjust a few bits to our liking.
memset(&port, 0, sizeof(port));
port.DCBlength = sizeof(port);
if ( !GetCommState(this->serialport, &port))
{
cout << "ERROR: getting comm state." << endl;
CloseHandle(this->serialport);
this->serialport = INVALID_HANDLE_VALUE;
}

if (!BuildCommDCB(L"baud=128000 parity=n data=8 stop=1", &port)){
cout << "ERROR: building comm DCB." << endl;
CloseHandle(this->serialport);
this->serialport = INVALID_HANDLE_VALUE;
}

if (!SetCommState(this->serialport, &port)){
cout << "ERROR: adjusting port settings" << endl;
CloseHandle(this->serialport);
this->serialport = INVALID_HANDLE_VALUE;
}
Aw: Programmierung unter Linux?
Antwort als hilfreich markieren
0Positive Markierungen
Antwort als nicht hilfreich markieren
0Negative Markierungen
Melden Sie diesen Beitrag
23.04.2013, 13:16
Hallo felix.st,

Dein Projekt klingt ja mehr als interessant.

Wie hast Du das mit der Matrix vor, erstellt Du Dir eine eigene neue Leiterplatte oder verdrahtest Du die RGB-LEDs einzeln auf einem LED-Träger?

Wenn Du magst kannst Du Deine Ergebnisse uns ja gerne mitteilen.
Ich bin nicht verrückt… Meine Mutter hat mich testen lassen. (Sheldon Cooper)
Aw: Programmierung unter Linux?
Antwort als hilfreich markieren
0Positive Markierungen
Antwort als nicht hilfreich markieren
0Negative Markierungen
Melden Sie diesen Beitrag
23.04.2013, 14:15
Es wird wohl noch eine Weile dauern, bis ich das Projekt in Angriff nehmen kann, aber der Plan sieht vor, eine größere Spanplatte mit regelmäßigen Bohrungen zu versehen und die LEDs dann frei zu verdrahten.
Über genaue Maße und Anordnung mache ich mir dann Gedanken, wenn es soweit ist. Ich werde aber das Projekt dokumentieren und auch hier posten :)
Aw: Programmierung unter Linux?
Antwort als hilfreich markieren
0Positive Markierungen
Antwort als nicht hilfreich markieren
0Negative Markierungen
Melden Sie diesen Beitrag
24.04.2013, 15:44
Das mit der Spanplatte macht Sinn, so hast Du alle Möglichkeiten offen.
Freue mich schon auf Deine Projektdoku.

Kennst Du die "Wordclock" von Mikrocontroller.net?
Klick mich :-)

Wenn man die Firmware des RGBC555 anpassen würde, könnte man daraus eine gute Grundlage dafür schaffen.
Ich bin nicht verrückt… Meine Mutter hat mich testen lassen. (Sheldon Cooper)
Aw: Programmierung unter Linux?
Antwort als hilfreich markieren
0Positive Markierungen
Antwort als nicht hilfreich markieren
0Negative Markierungen
Melden Sie diesen Beitrag
25.04.2013, 13:26
Über die Uhr war ich vor einiger Zeit schonmal gestolpert, intressanter Ansatz, aber ich denke der RGBC555 ist etwas überdimensioniert dafür. Man braucht ja deutlich weniger Ausgänge (der Cube hat 125x3 Farben macht 375 Kanäle... für die Uhr genügen 25 Kanäle)
Wobei es natürlich extrem cool wäre, die Buchstaben der Uhr einzeln in bunt zu beleuchten (immerhin 110 Buchstaben) der Effekte wegen.
Aber für ne Uhr wär' mir der Aufwand zu groß :p
Aw: Programmierung unter Linux?
Antwort als hilfreich markieren
0Positive Markierungen
Antwort als nicht hilfreich markieren
0Negative Markierungen
Melden Sie diesen Beitrag
14.07.2013, 15:03
#include <fcntl.h>
int main()
{
int fd;
fd = open("/dev/cube", O_RDWR | O_NOCTTY | O_NONBLOCK) ; // ( cube wurde über udev angelegt, normal wäre es /dev/ttyUSB(0-x) )
unsigned char test = { 0x02,0x00,0x01,0x4e,0x2f,0x80 }; // Normalmode
/* { 0x02,0x00,0x01,0x44,0x2f,0xbc } // Demomode
{ 0x02,0x00,0x01,0x50,0x2f,0xc4 } // Previewmode
{ 0x02,0x00,0x01,0x76,0xaf,0x13 } // Version
*/
if ( write(fd, test, 6) != 6 )return -1;
close(fd);
return 0;
}

// Der Cube wird durch den cp210x.c Treiber (od. Modul) erkannt, wenn er mit dem ID-Changer umgestellt wurde
// (nicht versuchen die BAUD über Termios Struct auf 128000 einzustellen, das funktioniert nicht)
// Termios Struct hat vorgegebene BAUD Werte, um 128000 einstellen zu können, falls überhaupt möglich, ist viel mehr Aufwand nötig
Aw: Programmierung unter Linux?
Antwort als hilfreich markieren
0Positive Markierungen
Antwort als nicht hilfreich markieren
0Negative Markierungen
Melden Sie diesen Beitrag
14.07.2013, 20:56
(kaum hatte ich den Beitrag geschrieben ...)

die Baud lassen sich doch über die termios struktur einstellen
aber nur über ioctl zugriff
ein
man tty_ioctl
führte zum erfolg
viele grüße
Aw: Programmierung unter Linux?
Antwort als hilfreich markieren
0Positive Markierungen
Antwort als nicht hilfreich markieren
0Negative Markierungen
Melden Sie diesen Beitrag
17.07.2013, 08:41
Hallo, die Methode zum Einstellen der nötigen Baudrate
(128000) mit Linux hat bei mir wie folgt funktioniert:

#include <fcntl.h>
#include <sys/ioctl.h>
#include "asm/termbits.h"
#include <cstdlib> // nur für die -perror-exit Funktion //
struct ktermios tio;
int main()
{
int fd;
fd = open("/dev/cube", O_RDWR | O_NOCTTY | O_NONBLOCK) ; // ( cube wurde über udev angelegt, normal wäre es /dev/ttyUSB(0-x) )

int r;
r = ioctl(fd, TCGETS2, &tio); if (r) { perror("TCGETS2"); exit(-1); }

tio.c_ispeed = 128000;
tio.c_ospeed = 128000;
tio.c_cflag &= ~(CBAUD|CIBAUD);
tio.c_cflag |= BOTHER;
r = ioctl(fd, TCSETS2, &tio); if (r) { perror("TCSETS2"); exit(-1); }

return 0;
}

wichtig hierbei ist die ktermios Struktur oder man könnte auch termios2 verwenden. Ein Einstellen der Baudrate war bei mir nötig, falls ein anderes Gerät mit dem gleichen Treiber u. einer anderen Baudrate zuvor angesteckt wurde. Meine Tests nehme ich mit gentoo vor. Einen entsprechenden Header (termbits.h) konnte ich auch auf meiner Ubuntu Installation finden. Die cpp cstdlib ist nur für die if (r) abfrage benötigt u. könnte ggf. auch weggelassen werden (die c version müßte stdlib.h sein.
Aw: Programmierung unter Linux?
Antwort als hilfreich markieren
0Positive Markierungen
Antwort als nicht hilfreich markieren
0Negative Markierungen
Melden Sie diesen Beitrag
09.03.2017, 23:19
nur so bekomme ich den rgb cube 555 unter linux zum laufen in eigenen anwendungen in c++:

1. cube umschalten in vcp-modus:

- - nicht mit dem offiziellen id changer. dieser läuft bei mir weder unter win 10 noch xp, sodern mit "CP210x Programmer":

http://cp210x-program.sourceforge.net/

anwendung:

rgb cube 555 in den VCP-Modus versetzen:

./cp210x-program --write-cp210x -m 001/006 \
--set-product-string="RGBC555 VCP-Mode" \
--set-max-power=50 \
--set-bus-powered=no \
--set-vendor-id=10C4 \
--set-product-id=EA60

rgb cube 555 in den normalen Modus (für die offizielle Konfigurations-SW) versetzen:

./cp210x-program --write-cp210x -m 001/009 \
--set-product-string="RGBC555" \
--set-max-power=50 \
--set-bus-powered=no \
--set-vendor-id=18EF \
--set-product-id=E024

die zahlen -m 001/009 sind usb bus nr und gerätenr. diese müssen vorher ermittelt werden, etwa mit "lsusb".

2. udev-regel anlegen (siehe https://www.elv.de/topic/cube-4-raspberry-pi.html), damit der cube unter /dev/cube registriert wird. damit bei programm cube-rpi nict immer "dev/ttyUSB0" eingetippt werden muss

3. Das programm cube-rpi (siehe https://www.elv.de/topic/cube-4-raspberry-pi.html) in eigener console starten und nichts eingeben

4. eigenes c/c++-programm starten (etwa aus oben angegebenen code als vorlage)