Habe eine frag an euch ihr kennt euch bestimmt aus....
Ich habe eine matrix mit 24x75 ws2812b stripes gebaut
Habe einen arduino Uno und einen mega.
Bei 675 LED läuft mit dem mega noch alles gut aber ab 750 kommt es zu Verzögerungen wenn ich den Effekt Wechsel dauert es da schon mal 5 Sekunden bis er wechselt.... Ich benutze jinx
Ich denke das der mega zu langsam ist für 1800 LEDs
Kann der teensy das besser und wenn welche Version brauche ich für 1800 LEDs
Gibt es nur die Teeny Platinen ungelötet?
108A Spitzenstrom, wenn's dem µC komisch wird und Er allen LEDs sagt, daß nun Sommer befohlen ist, hat schon was.
Wenn Du den Sketch mit 675 LEDs kompilierst, läuft's noch, bei 750 wird's komisch?
Pro LED brauchst Du 3 Byte Speicher - wie viel ist denn davon noch über, wenn Du den Sketch compilierst?
Müsste nachlesen, die Bits werden aber verflixt schnell übertragen ... 800kbps
Du willst 1800 x 3 x 8 / 800000 = 0,054 Sekunden - 20 'Bilder die Sekunde' - an der Geschwindigkeit ändert auch ein schnellerer Prozessor Nichts, da die Geschwindigkeit vom Protokoll der WS2812 vorgegeben wird.
Ich habe die Matrix komplett am laufen 24 reihen mit 74 led und das klappt alles soweit mit dem Arduino Mega!
Von Jinx! wird alles an die Matrix gesendet und die Matrix gibt es wieder nur ist es so das es lange verzögerung gibt....
wenn ich z.b laufschrift an habe und auf etwas anderes wechsel z.b. Fading Pixel oder Metaballs es ist egal die Verzögerung ist sehr lange bis der wechsel kommt und die geschwindigkeit der Effekte ist auch langsamer im gegensatz zu 600 Pixeln!
bei 600 Pixeln ist keine verzögerung und die geschwindigkeit der effekte ist auch normal und die 600 Pixel hatte ich mit dem Arduino Uno angesteuert und dem Glediator sketch von Solderlab.
Der sketch von Solderlab funktioniert aber so nicht mit dem Mega worauf ich bei google auf diesen aufmerksam geworden bin
//##############################################################################
//##############################################################################
// #
// Glediator to WS2812 pixel converter #
// by R. Heller #
// V 1.0 - 07.01.2014 #
// wwww.SolderLab.de #
// #
// Receives serial data in Glediator protocol format @ 1 MBit/s #
// and distributes it to a connectect chain of WS2812 pixels #
// #
// Adjust the correct DATA PIN and the correct NUMBER OF PIXELS you are using #
// in the definitions section below before uploading this sketch to your #
// Arduino device. #
// #
// Maxiumim number of supported pixeles is 512 !!! #
// #
// In the Glediator software set output mode to "Glediator_Protocol", #
// color order to "GRB" and baud rate to "1000000" #
// #
//##############################################################################
//##############################################################################
//##############################################################################
// #
// Definitions --> Make changes ONLY HERE #
// #
// To find out the correct port, ddr and pin name when you just know the #
// Arduino's digital pin number just google for "Arduino pin mapping". #
// In the present example digital Pin 6 is used which corresponds to "PORTD", #
// "DDRD" and "6", respectively. #
// #
//##############################################################################
#define DATA_PORT PORTA
#define DATA_DDR DDRA
#define DATA_PIN 0 //This relates to PDA0 (PIN 22 on the Mega 2560)
#define NUMBER_OF_PIXELS 1776
//##############################################################################
// #
// Variables #
// #
//##############################################################################
unsigned char display_buffer[NUMBER_OF_PIXELS * 3];
static unsigned char *ptr;
static unsigned int pos = 0;
boolean go = 0;
//##############################################################################
// #
// Setup #
// #
//##############################################################################
void setup()
{
// Set data pin as output
DATA_DDR |= (1<<DATA_PIN);
// Initialize UART
UCSR0A |= (1<<U2X0);
UCSR0B |= (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0);
UCSR0C |= (1<<UCSZ01) | (1<<UCSZ00) ;
UBRR0H = 0;
UBRR0L = 1; //Baud Rate 1 MBit (at F_CPU = 16MHz)
ptr=display_buffer;
//Enable global interrupts
sei();
}
//##############################################################################
// #
// Main loop #
// #
//##############################################################################
void loop()
{
if (go==1)
{
cli();
ws2812_sendarray(display_buffer, NUMBER_OF_PIXELS * 3);
sei();
go=0;
}
}
//##############################################################################
// #
// UART-Interrupt-Prozedur (called every time one byte is compeltely received) #
// #
//##############################################################################
ISR(USART0_RX_vect)
{
unsigned char b;
b=UDR0;
if (b == 1) {pos=0; ptr=display_buffer; return;}
if (pos == (NUMBER_OF_PIXELS*3)) {} else {*ptr=b; ptr++; pos++;}
if (pos == ((NUMBER_OF_PIXELS*3)-1)) {go=1;}
}
//##############################################################################
// #
// WS2812 output routine #
// Extracted from a ligh weight WS2812 lib by Tim (cpldcpu@gmail.com) #
// Found on wwww.microcontroller.net #
// Requires F_CPU = 16MHz #
// #
//##############################################################################
void ws2812_sendarray(uint8_t *data,uint16_t datlen)
{
uint8_t curbyte,ctr,masklo;
uint8_t maskhi = _BV(DATA_PIN);
masklo =~ maskhi & DATA_PORT;
maskhi |= DATA_PORT;
while (datlen--)
{
curbyte = *data++;
asm volatile
(
" ldi %0,8 \n\t" // 0
"loop%=:out %2, %3 \n\t" // 1
"lsl %1 \n\t" // 2
"dec %0 \n\t" // 3
" rjmp .+0 \n\t" // 5
" brcs .+2 \n\t" // 6l / 7h
" out %2,%4 \n\t" // 7l / -
" rjmp .+0 \n\t" // 9
" nop \n\t" // 10
" out %2,%4 \n\t" // 11
" breq end%= \n\t" // 12 nt. 13 taken
" rjmp .+0 \n\t" // 14
" rjmp .+0 \n\t" // 16
" rjmp .+0 \n\t" // 18
" rjmp loop%= \n\t" // 20
"end%=: \n\t"
: "=&d" (ctr)
: "r" (curbyte), "I" (_SFR_IO_ADDR(DATA_PORT)), "r" (maskhi), "r" (masklo)
);
}
}
//##############################################################################
// #
// End of program #
// #
//##############################################################################
Der sketch wird Hochgeladen :
Der Sketch verwendet 928 Bytes (0%) des Programmspeicherplatzes. Das Maximum sind 253952 Bytes.
Globale Variablen verwenden 5342 Bytes (65%) des dynamischen Speichers, 2850 Bytes für lokale Variablen verbleiben. Das Maximum sind 8192 Bytes.
ist es normal das die Geschwindigkeit so einbricht?Ein bisschen Potenzial hat der Mega doch noch wenn ich das so sehe aber kenne mich auch nicht so gut aus
@Helium
Setze deine Sketch bitte in Code-Tags, Schaltfläche </> oben links im Editorfenster.
Das kannst du auch noch nachträglich machen.
Dann können alle, auch mobile User deinen Sketch besser lesen und du bekommst mehr Hilfe.
Hab jetzt keine Lust und Zeit, den ganzen Code durchzulesen ... aber im Sourcecode steht ausdrücklich: "// Maxiumim number of supported pixeles is 512 !!!".
Das wird seine Gründe haben.
Vlt. ist irgendwo ein ungeeigneter Datentyp verwendet oder ein zu kleines Array, evtl. ist auch der UART-Buffer zu klein ...
Helium:
Der sketch wird Hochgeladen :
Der Sketch verwendet 928 Bytes (0%) des Programmspeicherplatzes. Das Maximum sind 253952 Bytes.
Globale Variablen verwenden 5342 Bytes (65%) des dynamischen Speichers, 2850 Bytes für lokale Variablen verbleiben. Das Maximum sind 8192 Bytes.
ist es normal das die Geschwindigkeit so einbricht?Ein bisschen Potenzial hat der Mega doch noch wenn ich das so sehe aber kenne mich auch nicht so gut aus
Danke für eure Hilfe
Helium
Hey,
Wenn du 5342 Bytes verwendet hast kommen auf jedenfall nochmal 1800 Byte hinzu für die LED Farben pro Pixel. Dann hast du schon 7142 Bytes verwendet und wer weis ob du nicht nochmal irgendwo ein paar Bytes hinzu kommen. Ich habe jetzt nicht den gesamten Sketch gelesen aber meine IDE hat mir immer eine Fehlermeldung gebracht das ab 75% des dynamischen Speichers zu Fehlfunktionen führen kann, bzw. das der Arduino einbricht.
In den 5342 RAM sind bereits der Speiche für die 1776 WS2812 drin.
Jedes WS2812 braucht 3 Byte für die 3 Farben. Wenn der Bildbuffer nicht bereits drin wären bräuchte es weitere 5328 Byte.
Ich weis aber warum ich auf diese Idee gekommen bin, und zwar bei der Bibliothek NeoPixel von Adafruit werden die 3 Bytes für jede WS2812 nicht in der IDE angezeigt sondern erst nachher.
MfG bdorer