WS2812B Arduino+Raspi+Glediator

Hallo Liebe Arduino Geminde,

Aufbau:
Ich habe mir eine LED Matrix (17x17) mit den WS2812B Led’s gebaut.
Diese Steuere ich über ein 5V/20A Netzteil an. Die Led’s werden über 3 Punkte eingespeist

Erste einspeisung beim ersten Strip zweite beim 6 und die Dritte einspeisung über den 12 Strip.
Der Arduino Nano wird ebenfalls über das Netzteil mit Spannung versorgt und der Datenbus geht vom

DataPin 5 auf die Leds (wurde vorher mit nem 330er Widerstand versehen zum Schutz der Led’s)

Außerdem habe ich einen Raspberry 3 B+ wo ich das Programm Glediator verwende (falls nicht bekannt es ist ein Steuerprogramm extra für LED Matrixen). Der Raspi wurde über die Serielle USB schnittstelle direkt mit dem Nano an dem Mini USB anschluss verbunden.

Der Port des Nanos wird erkannt im Programm.

Problem:
Glediator bietet auf der Website einen Arduino Code an womit der Arduino die Daten von dem Programm
verarbeiten und es and die Led’s übertragen kann.
Blöd nur das der Code nur für die WS2811/WS2812 Gedacht ist und dieser auf meinem Arduino nicht läuft.

Nach ein wenig Suchen habe ich ein Video gefunden der wo er ebenfalls mit den WS2812B arbeitet einen
Code verwendet der für die Led’s funktioniert.
Gemacht getan, Led’s blinken so wie es sollen.

Dann habe ich ein wenig mit dem Programm rumgespielt aber mein Problem ist das ich eine Art Störfrequenzen auf die Led’s bekomme. Soll heißen wenn ich beispielsweise einen Text über die Matrix Laufen lasse, das willkürlich die Leds in unterschidlichsten Farben aufblitzen und wieder aus gehen (Led’s die ich garnicht ansprechen will)

Nun weiß ich nicht ob es an meinem Code liegt (da ich mit C/C++ noch nicht so vertraut bin was die Ansteuerung von direkter Hardware angeht) oder möglicherweise an dem Netzteil (welches direkt neben den Led’s liegt) und durch ein Enstehendes Magnetfeld dementsprechend Störfrequenzen auf irgend eine Art und Weise überträgt.

Mein Code sieht wie folgt aus:

#include <FastLED.h>

#define NUM_LEDS 289

const int dataline = 6;
CRGB leds[NUM_LEDS];



void setup() {
Serial.begin(1000000);
LEDS.addLeds<WS2812B, dataline>(leds, NUM_LEDS);

for (int p=0;p < NUM_LEDS;p++){
leds[p] = CRGB::Black;
FastLED.show();}  
}

int serialReadBlocking(){
  while(!Serial.available()) {}
  return Serial.read();
}


void loop() {
while (serialReadBlocking() != 1) {}

  for (long i=0; i < NUM_LEDS; i++) {
    leds[i].r = serialReadBlocking();
    leds[i].g = serialReadBlocking();
    leds[i].b = serialReadBlocking();    
  }
FastLED.show();
}

Ich bin dankbar für jede Idee,
mfg Arzeg

Vor längerer Zeit hat jemand so ein Problem mit Stützkondensatoren und viel geerdeter Alufolie in den Griff bekommen.

Hallo,

ich würde auf Timing-Probleme im Zusammenspiel mit der RasPi-Software vermuten.
Die Serielle kann prinzipiell 1MBaud zusammen mit einem FTDI. CP210x habe ich noch nicht so benutzt, sollten es aber auch können. CH34x weiß ich jetzt nicht.
Die Daten müssen aber auch vom AVR noch einsortiert und dann per FastLED.show() zu den LEDs. Das dauert auch einige Zeit. Da ohne Quittungen übertragen wird muß die RasPi-Software also für die nötigen Pausen zwischen den Blöcken sorgen und das Zusammenspiel USB-Wandler, serieller Buffer usw. muß auch passen.
Dazu müßte ich aber die RasPi-Software kennen...
Bei 289 LEDs ist auch der Ram auf dem Nano schon recht knapp.

Gruß aus Berlin
Michael

Ich habe mir eine LED Matrix (17x17) mit den WS2812B Led's gebaut.
Diese Steuere ich über ein 5V/20A Netzteil an. Die Led's werden über 3 Punkte eingespeist

Erste einspeisung beim ersten Strip zweite beim 6 und die Dritte einspeisung über den 12 Strip.

Ich habe jetzt nicht verstanden wie Du die WS2812 mit Spannung versorgst. Miß mal die Spannungsversorgung in verschiedenen Punkten, da ich vermute daß 3 Einspeisepunkte zuwenig sind und die Spannung absinkt und Du darum dieses Aufleuchten hast. Ich würde da jede Strippe einspeisen zB die Masse an einer Seite und die 5V von der anderen Seite. Wie Dick sind die Kabel vom Netzteil zur Matrix?

Die WS2812B sind ziemlich kompatiebel mit den WS2812. Man hat getrennte Spannungsversorgung für die LED und für den Kontroller. Die Datenübertragung ist geich.

Grüße Uwe

Wurde Gnd vom LED Netzteil mit Gnd vom Arduino verbunden?

Wie lang ist die Datenleitung zu den LEDs? Geschirmt?

Sind die Kabel ordentlich verlötet oder ist das eine Steckbrettinstallation?

Diese Fragen fallen mir auf die Schnelle ein, basierend auf der Problembeschreibung.

Grüße, Helmuth

Also erstmal vielen dank für die zügigen antworten,
bin aktuell etwas im uni stress daher jetzt erst die rückmeldung meinerseits.

agmue:
Vor längerer Zeit hat jemand so ein Problem mit Stützkondensatoren und viel geerdeter Alufolie in den Griff bekommen.

Hatte ich auch schon überlegt, die idee werde ich mal im Hinterkopf behalten.

uwefed:
Ich habe jetzt nicht verstanden wie Du die WS2812 mit Spannung versorgst. Miß mal die Spannungsversorgung in verschiedenen Punkten, da ich vermute daß 3 Einspeisepunkte zuwenig sind und die Spannung absinkt und Du darum dieses Aufleuchten hast. Ich würde da jede Strippe einspeisen zB die Masse an einer Seite und die 5V von der anderen Seite. Wie Dick sind die Kabel vom Netzteil zur Matrix?

Die WS2812B sind ziemlich kompatiebel mit den WS2812. Man hat getrennte Spannungsversorgung für die LED und für den Kontroller. Die Datenübertragung ist geich.

Grüße Uwe

Ne, am Spannungsabfall liegts nicht. habe überall konstant 5V die 17 Stripes sind ja auch nicht so lang. Der Abstand von led zu led beträgt nur 3,3cm.

Der Querschnitt von den Leitungen ist meiner meinung nach mit 0,75mm² auch mehr als ausreichend.

Da stellt sich mir dann nur die frage wenn die vom aufbau beinahe identisch sind, weshalb der "Original Code" von Glediator der auf der Seite zu finden ist, nicht Funktioniert (Werde den gleich auch mal rein schreiben).

Helmuth:
Wurde Gnd vom LED Netzteil mit Gnd vom Arduino verbunden?

Wie lang ist die Datenleitung zu den LEDs? Geschirmt?

Sind die Kabel ordentlich verlötet oder ist das eine Steckbrettinstallation?

Diese Fragen fallen mir auf die Schnelle ein, basierend auf der Problembeschreibung.

Grüße, Helmuth

GND ist mitm Arduino Verbunden. Die Datenleitung vom Nano zu den LEDs sind grade mal ~10cm, wo auch direkt das Netzeil neben liegt. Daher die Idee mit dem Magnetfeld und den Störfrequenzen. Abgeschirmt sind diese nicht (die Idee mit der Alufolie werde ich noch ausprobieren).

Die Matrix ist ordentlich Verlötet. Der aufbau mit dem nano ist auf dem Steckbrett dazu möchte ich aber noch sagen das bevor ich die Geschichte mit der Software und dem Raspi gemacht habe (also nur die Matrix und den Nano) alles reibungslos Funktioniert hat (trotz Steckbrettinstallation) und als das mit dem Raspi kahm wurde beim Steckbrett nichts geändert.

Ich danke euch nochmal vielmals für die Ideen und Vorschläge ein ding hätte ich noch. Aktuell Verbinde ich den Raspi und den Nano über USB zu Mini-USB. Es wäre ja auch möglich die direkt über die Pins anzusprechen da Michael sagte dass das zusammenspiel des USB-Wandler passen muss. Welches über die Pins ja dann wegfallen würde.

Grüße, Arzeg

PS: Der Code von der Glediator Website kommt im nöchsten Post da sonst die Nachricht zu lang wird :smiley:

//##############################################################################
//##############################################################################
//                                                                             #
// 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          PORTD
#define DATA_DDR           DDRD						
#define DATA_PIN           6							
#define NUMBER_OF_PIXELS   289


//##############################################################################
//                                                                             #
// Variables                                                                   #
//                                                                             #
//##############################################################################

unsigned char display_buffer[NUMBER_OF_PIXELS * 3];
static unsigned char *ptr;
static unsigned int pos = 0;

volatile unsigned char 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(USART_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 Querschnitt von den Leitungen ist meiner meinung nach mit 0,75mm² auch mehr als ausreichend.

Da ist Deine Meinung leider falsch
man rechent mit ca 7A pro mm^2 Darum braucht es bei 20A schon über 2,5mm^2

An 1 m Kabel mit Querschnitt 0.75mm^2 fallen fast 1V ab.

Grüße Uwe

Hi

Querschnitt zu maximaler Strombelastbarkeit, Haushalt (230V/400V AC)
1.5  16A
2.5  20A
4    25A
6    35A
10   50A
16   63A

Wobei die 1,5mm² seit einiger Zeit durch besonders kluge Köpfe auf 13,5A reduziert wurden - was aber auch eigentlich egal ist, da Lichtschalter eh nur für 10A ausgelegt sind und somit die entsprechenden Kreise somit nur 10er Sicherung aufweisen.

... also Theoretsich ... zumindest :wink:

Im KFZ-Bereich sind die Absicherungen anders (nicht unbedingt sicherer) - dort bin ich aber nicht sonderlich firm drin.

Die obigen Ströme sind auch in Hinblick auf den Spannungsabfall so gewählt worden - nicht nur, wegen der Leitererwärmung!
Da bei 230V '1 oder 2 V' nicht sonderlich ins Gewicht fallen, sollte man im Kleinspannungsbereich Da ein besonderes Augenmerk drauf richten - wenn hier von 5V 2V fehlen, kommt 'Hinten' praktisch nichts mehr an - mit Dem man was anfangen könnte.

MfG

Mit 3 Einspeisepunkten und 1-2m Kabellänge geht das aber noch.. Spannungsfall im Falle das alle LEDs weiß leuchten von maximal 0,5V.

Das wird erst witzig bei 144 LEDs auf den Meter.

uwefed:
Da ist Deine Meinung leider falsch
man rechent mit ca 7A pro mm^2 Darum braucht es bei 20A schon über 2,5mm^2

An 1 m Kabel mit Querschnitt 0.75mm^2 fallen fast 1V ab.

Grüße Uwe

Die 20A werden ja nur auf Vollast genutzt. Was das Netzteil bzw wieviel Ampere bei den LEDs fließt wenn die in Betrieb sind habe ich um ehrlich zu sein noch nicht gemessen. Allerdings kann ich sagen das ich an verschiedenen stellen auf der Matrix an den LEDs die Spannung gemessen habe und diese überall konstant bei 5V lagen (alles andere hätte mich auch gewundert da ich sonst viel früher ein Problem gehabt hätte)

Grüße Arzeg

Arzeg:
Die 20A werden ja nur auf Vollast genutzt.

Bei Glühbirnen würde ich Dir zustimmen. Bei per PWM gedimmten LEDs könnte es auch anders sein. Ein Beispiel:

Der gesammte Streifen ist auf 10% weiß eingestellt. Durch PWM werden die LEDs ein- und ausgeschaltet. 10% der Zeit alle LEDs ein, 90% aus. Das bedeutet, zu 10% der Zeit möchten die LEDs vollen Strom haben.

Wenn Du die Versorgungsspannung auf Wechselspannung überprüfst, könntest Du einen entsprechenden Hinweis bekommen. Ein Multimeter geht nur bedingt, ein Scope wäre besser.

Auch die Synchronisierung von RasPi und Arduino solltest Du nicht aus den Augen verlieren. Wenn der Arduino die LEDs mit Infos versorgt, kann er keine Daten empfangen. Werden dennoch welche gesendet, gehen sie verloren oder werden falsch interpretiert. Dafür sehe ich im Arduino keine Vorkehrungen. Glediator kenne ich nicht.