Arduino Alternative f. LED Projekt

OP (Firma: Privat) #3392092
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é
Angehängte Dateien:
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.
Gast
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.
Gast
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" ...
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).
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
}
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
}
OP (Firma: Privat)
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
Gast
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.
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.