Hallo liebes Forum, ich habe eine Fachfrage und bestimmt habt ihr die passenden Antworten! Kurz zur Einleitung, ich habe zusammen mit paar Freunden eine LED Wand gebaut, ganz simpler Aufbau. (Laptop mit der Steuerungssoftware Gladiator, einem Arduino Duemilanove Controller und dann ganz viele einzelne LED Pixel mit WS2801 Chip) Nun haben wir aber das Problem, dass der Controller zu langsam ist, wenn wir mehr als 300 solche Pixel einsetzen. Meine Frage an euch (Ich bin leider nicht so vom Fach:-) ) was würdet ihr uns für einen schnelleren Controller empfehlen ? Ich würde mich riesig freuen wenn ihr etwas postet. vielen Dank René
Rene Oelsch schrieb: > Meine Frage an euch (Ich bin leider nicht so vom Fach:-) ) was würdet > ihr uns für einen schnelleren Controller empfehlen ? Das liegt nicht am Controller sondern an der Software.
kurze Gegenfrage: das Programm, basiert das auf Arduino-Bibliotheken? Denn Arduino-Bibliotheken und Laufzeit-Speed sind schon mal 2 Dinge, die sich meistens von vorne herein schon beissen. Die Arduino-Bibliotheken sind zwar zum schnellen Entwickeln von Software, insbesondere für Ungeübte, wunderbar geeignet. Will man aber performante Anwendungen, dann sind sie ein Klotz am Bein.
Rene Oelsch schrieb: > was würdet ihr uns für einen schnelleren Controller empfehlen ? Z.B. einen PC? Gruss Harald
Mehrere Artnet zu SPi Umsetzer, Artnet läuft über Ethernet und kann einfach geswitched werden. Deine Software unterstützt mehrere Artnet Universen, die einzelnen Pixel können dann da draufgemapped werden.
DJ? Da kommen ja einem fast die tränen... Wo sind die ganzen Vinyl-mixer hin? Heutzutage gibts ja nur noch möchtegern-DJs, die den Bass n bisschen hochdrehen und die Beschallung mit ner Verstärkerstufe von MC Crypt oder so nem chinakracher machen und dann meinen, sie hätten was drauf. Ich kann diesen Virtual-DJ mist überhaupt nicht leiden. Entweder man macht`s richtig oder lässt es bleiben. Sry musste mal raus. Ich bin der selben Meinung wie Eumel und Karl Heinz.
Komplett fertig, wie der Arduino mit Processing programmierbar: http://www.heroicrobotics.com/products/pixelpusher (aus einem Kickstarter-Projekt hervorgegangen: http://www.kickstarter.com/projects/1319139499/pixelpusher)
Kann das Problem hier überhaupt das uC Board sein, das hat doch mit 300 Pixeln überhaupt kein Problem? Ist das nicht eher die Gladiator Software oder die Übertragung der Software ans Board?
Die LED können mit bis zu 25Mhz getaktet werden. Hier macht wohl endlich mal ein ARM sinn, oder? Wenn der Arduino die Daten über die Hardware-SPI sendet ist zumindest die Software mal nicht schuld. Wobei ich selbst kein FAN von den Arduino Bibliotheken bin. 28 Takte für ein "digital write" ...
Wenn du bei Arduino bleiben möchtest nimm einen Due, der läuft mit 84MHz statt deiner 16MHz
Dann ist ja nicht das Board das Problem, sondern die Software auf dem Board. Allerdings sagte ja oelschi Eingangs, dass er nicht vom Fach ist, also bleibt ihm nur ein schnelleres Board. Bei Arduinos kenne ich mich allerdings nicht aus (und will es auch gar nicht).
:
Bearbeitet durch User
Rene Oelsch schrieb: > Meine Frage an euch (Ich bin leider nicht so vom Fach:-) ) was würdet > ihr uns für einen schnelleren Controller empfehlen ? Arduino Due Mehr als doppelt so schnell und kompatibel.
Die Software heisst übrigens GLEDIATOR, falls sich jemand wundert. Ich habe mir mal die "firmware" angeschaut. Unten der relevante SPI-Code. Das muss eine der langsamsten Software-SPI Implementationen sein, die ich bisher gesehen habe. Unterstützt Arduino kein Hardware-SPI? Blöd ist allerdings, dass die Daten per UART in den Controller gelangen. Da lässt sich nicht mehr viel machen...
1 | void shift_out_data() |
2 | {
|
3 | |
4 | for (int i=0; i<Num_Pixels; i++) |
5 | {
|
6 | byte r = display_buffer[i*3+0]; |
7 | byte g = display_buffer[i*3+1]; |
8 | byte b = display_buffer[i*3+2]; |
9 | |
10 | for (byte j=0; j<8; j++) |
11 | {
|
12 | digitalWrite(CKI, LOW); |
13 | if (b & (byte)(1<<(7-j))) {digitalWrite(SDI, HIGH);} else {digitalWrite(SDI, LOW);} |
14 | digitalWrite(CKI, HIGH); |
15 | }
|
16 | |
17 | for (byte j=0; j<8; j++) |
18 | {
|
19 | digitalWrite(CKI, LOW); |
20 | if (r & (1<<(7-j))) {digitalWrite(SDI, HIGH);} else {digitalWrite(SDI, LOW);} |
21 | digitalWrite(CKI, HIGH); |
22 | }
|
23 | |
24 | for (byte j=0; j<8; j++) |
25 | {
|
26 | digitalWrite(CKI, LOW); |
27 | if (g & (1<<(7-j))) {digitalWrite(SDI, HIGH);} else {digitalWrite(SDI, LOW);} |
28 | digitalWrite(CKI, HIGH); |
29 | }
|
30 | |
31 | }
|
32 | |
33 | digitalWrite(CKI, LOW); |
34 | delayMicroseconds(800); //Latch Data |
35 | |
36 | }
|
Udo schrieb: > SE schrieb: >> 28 Takte für ein "digital write" ... > > ich hab über 100 Takte dafür gemessen. Problem erkannt, Problem gebannt. Lass den Arduino Quatsch weg und machs direkt in C. gruß cyblord
Arduino digitalWrite, das sind tatsächlich mehr als 2 Taktzyklen.
1 | void digitalWrite(uint8_t pin, uint8_t val) |
2 | {
|
3 | uint8_t timer = digitalPinToTimer(pin); |
4 | uint8_t bit = digitalPinToBitMask(pin); |
5 | uint8_t port = digitalPinToPort(pin); |
6 | volatile uint8_t *out; |
7 | |
8 | if (port == NOT_A_PIN) return; |
9 | |
10 | // If the pin that support PWM output, we need to turn it off
|
11 | // before doing a digital write.
|
12 | if (timer != NOT_ON_TIMER) turnOffPWM(timer); |
13 | |
14 | out = portOutputRegister(port); |
15 | |
16 | uint8_t oldSREG = SREG; |
17 | cli(); |
18 | |
19 | if (val == LOW) { |
20 | *out &= ~bit; |
21 | } else { |
22 | *out |= bit; |
23 | }
|
24 | |
25 | SREG = oldSREG; |
26 | }
|
Tim schrieb: > Arduino digitalWrite, das sind tatsächlich mehr als 2 Taktzyklen. Aber nur um Faktor 50 mehr ;-)
Hallo, erstmal Danke für die vielen Kommentare. Also wir könnten mit einem Arduino Due natürlich viel mehr Adressieren. Könnte es eigentlich sein, das unser verwendeter Arduino einfach nur zu wenig RAM hat ? Ich bin über die Links sehr erfreut :-) http://www.heroicrobotics.com/products/pixelpusher Das werden wir uns anschauen, könnte vielleicht noch viel besser sein als unsere Lösung. Über die Einführung von Artnet haben wir auch schon nachgedacht, würde bestimmt Sinn machen. # Ich steck halt absolut nicht im Code, würdet ihr mir also von der Arduino Sache abraten ? Auf der Seite von Glediator (sorry das ich dies oben falsch geschrieben habe) wird allerdings keine Firmeware für einen Due angeboten. Diese wäre allerdings zur Zeit der schnellste Arduino oder ? Wenn ich natürlich wüsste wie ich die Software Glediator mit dem Pixelpusher verbinden kann, dann wäre das meine Favorisierte Lösung. Kann mir da jemand einen Tip geben ? Danke für eure Unterstützung
:
Bearbeitet durch User
Wie oben deutlich gezeigt ist die Arduino Software nicht sonderlich performant. Also gibt es doch nur vier möglichkeiten: - Ihr nutzt Hardware-SPI (ich hoffe die Arduino Jungs haben das eingebaut) - Ihr behaltet die Software und nehmt nen schnelleren Controller - Ihr programmiert in AVR Studio (o.a.). Das erfordert aber mehr kenne von dem Mikrocontroller und (ANSI-)C. Anstatt "digitalWrite(SDI, HIGH);" --> "PORTB |= (1 << SDI);" - Ihr schwenkt auf eine komplett andere Plattform um. Zum UART: Der ATMega--8 untertsützt bis zu 1Mbaud UART.
cyblord ---- schrieb: > Udo schrieb: >> SE schrieb: >>> 28 Takte für ein "digital write" ... >> >> ich hab über 100 Takte dafür gemessen. > > Problem erkannt, Problem gebannt. Lass den Arduino Quatsch weg und machs > direkt in C. > > gruß cyblord ... ich hätte dich auch vermisst.
F. Fo schrieb: > cyblord ---- schrieb: >> Udo schrieb: >>> SE schrieb: >>>> 28 Takte für ein "digital write" ... >>> >>> ich hab über 100 Takte dafür gemessen. >> >> Problem erkannt, Problem gebannt. Lass den Arduino Quatsch weg und machs >> direkt in C. >> >> gruß cyblord > > ... ich hätte dich auch vermisst. Haja, und man schaue sich die gepostete Funktion (shift_out_data()) mal an. Das könnte man 1:1 so in reinem C runterschreiben. Es wäre kein bisschen komplizierter aber um Größenördungen schneller. Also was soll sowas? gruß cyblord
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.