ArduinoForum.de - Das deutschsprachige Forum rund um den Arduino
Neopixel - LEDS leuchten obwohl sie es nicht sollten - Druckversion

+- ArduinoForum.de - Das deutschsprachige Forum rund um den Arduino (https://www.arduinoforum.de)
+-- Forum: Arduino-Allgemein (/arduino-Forum-Arduino-Allgemein)
+--- Forum: Hardware u. Schaltungen (/arduino-Forum-Hardware-u-Schaltungen)
+--- Thema: Neopixel - LEDS leuchten obwohl sie es nicht sollten (/arduino-Thread-Neopixel-LEDS-leuchten-obwohl-sie-es-nicht-sollten)

Seiten: 1 2 3 4 5 6 7 8 9 10


Neopixel - LEDS leuchten obwohl sie es nicht sollten - Mauser - 24.11.2020 00:34

Moin,

ich habe mir eine Matrix aus w2812 LEDs gebastelt (15*18=270 LED). Jede LED ist einzeln ansprechbar.
An der Verdrahtung kann es somit nicht liegen.
Auf dieser Matrix möchte ich das Spiel Snake realisieren. Ich habe es auch geschafft. Die Schlange ist über eine IRFernbediedung steuerbar und wächst sofern sie ein random-gespawntes Pixel aufnimmt. Allerdings habe ich folgendes Problem.
Es gehen wahllos LEDs an, in den verschiedensten Farben. Diese LEDs bzw die Farben habe ich im Code nicht ein einziges Mal verwendet. Ebenso ist die Helligkeit bei diesen LEDs auf maximum. Dabei handelt es sich um 1-2 LED Streifen (sind ca 15 Pixel die aufleuchten und das im Farbwechsel)

Der ganze Code ist hier zu finden
https://pastebin.com/cFpS5s7W

ich hoffe ich habe es verständlich auskommentiert.
Soweit ich das beurteilen kann liegt der Fehler in Zeile 164. Die Länge des Weges (dieser enthält die "Bewegungsdaten" der Schlange) kann ich als konstante angeben, dabei wächst natürlich die Schlange nicht. Wird die Kommentierung aufgehoben liegt das o.g. Problem vor und die Schlange wächst. Steuerung funktioniert auch einwandfrei. Problem sind nur die zufällig aufleuchtenden Lichter. Ich habe schon einiges Versucht den Fehler zu finden, leider ohne Erfolg. Daher möchte ich euer Schwarmwissen nutzen.
Vielen Dank für die Hilfe!


RE: Neopixel - LEDS leuchten obwohl sie es nicht sollten - Tommy56 - 24.11.2020 11:34

Wo in Deinem Beitrag siehst Du eine Projektvorstellung?

Stelle Deinen Sketch bitte direkt hier ins Forum. Benutzte dazu Codetags.
Wie das geht, steht hier.
Das kannst Du auch noch nachträglich ändern.

Welchen MC benutzt Du?

Gruß Tommy

@Mod: Bitte verschieben


RE: Neopixel - LEDS leuchten obwohl sie es nicht sollten - hotsystems - 24.11.2020 11:54

(24.11.2020 00:34)Mauser schrieb:  Ich habe schon einiges Versucht den Fehler zu finden, leider ohne Erfolg.

Was genau hast du versucht ?
Wie hast du die Spannungsversorgung angeschlossen ?
Was für ein Netzteil verwendest du ?


RE: Neopixel - LEDS leuchten obwohl sie es nicht sollten - Mauser - 24.11.2020 14:20

(24.11.2020 11:34)Tommy56 schrieb:  Wo in Deinem Beitrag siehst Du eine Projektvorstellung?

Stelle Deinen Sketch bitte direkt hier ins Forum. Benutzte dazu Codetags.
Wie das geht, steht hier.
Das kannst Du auch noch nachträglich ändern.

Welchen MC benutzt Du?

Gruß Tommy

@Mod: Bitte verschieben

Hallo Tommy,

danke für die Info, code wird nun hoffentlich so angezeigt.

Code:
#include <IRremote.h>
#include <Adafruit_NeoPixel.h>

decode_results results;
#define LED_PIN    6
#define LED_COUNT 270
#define Zeilen_Zahl 1
#define Spalten_Zahl 15
#define RECV_PIN 11
IRrecv irrecv(RECV_PIN);

int weg[270]; // Hier befindet sich der Weg den die Schlange geht

int letzteZeile[15] = {255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 267, 268, 269, 270}; // Zur Abfrage angelegt bei vertikaler+ Bewegung
//int zeile = 0;


int i = 0;
int n = 0;
int zahler; // Zähler der die Durchläufe von LOOP zählt
int dot;    // Futter für die Schlange
int lange = 4; // Länge des Weges den die Schlange geht
int Eingabe; // Variable der IR Fernbedienung zur Steuerung
int Ergebnis; // Variable der IR Fernbedienung zur Steuerung
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_RGB);
void weg_einschalten(); // Die LED in Weg einschalten
void weg_verschieben(); // Die LED in Weg verschieben
void weg_0_ausschalten(); // Letzte Position in Weg ausschalten
void laufen_lassen(); // Automatische Bewegung der Schlange bei Ergebnis
void essen_aufnehmen(); // Schlange wachsen lassen
void setup() {

  strip.setBrightness(5);
  strip.show();
  Serial.begin(9600);
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
  irrecv.enableIRIn();
  //  while (i <= LED_COUNT) { // Matrix initialisieren
  //    for (int s = 0; s <= 14; s++) { // s = spaltenzähler
  //      matrix[zeile][s] = i; // zeile = zeilenzähler
  //      i = i + 1; // i = laufindex bis Anzahl LEDs
  //    }
  //    zeile = zeile + 1; // zeile = zeilenzähler
  //  }
  //  i = 0;

  //  while (i <= LED_COUNT) {
  //    for (int s = 0; s <= 14; s++) { // s = spaltenzähler
  //      matrix[zeile][s] = i; // zeile = zeilenzähler
  //      Serial.print(matrix[zeile][s]);
  //      i = i + 1; // i = laufindex bis Anzahl LEDs
  //    }
  //    Serial.println();
  //  }



}

void loop() {
  if (irrecv.decode(&results)) {


    //Serial.println(results.value,DEC); // gebe den Code in Dezimalzahlen aus
    irrecv.resume();                    // Warte auf nähsten Wert
    Eingabe = results.value;

  }
  if (results.value == 16734885) { // Horizontal+
    Ergebnis = 1;
    //Serial.println(Ergebnis);
  }
  if (results.value == 16730805) { // Vertikal +
    Ergebnis = 2;
    //Serial.println(Ergebnis);
  }
  if (results.value == 16716015) { //Horizontal -
    Ergebnis = 3;
    //Serial.println(Ergebnis);
  }
  if (results.value == 16718055) { // Vertikal -
    Ergebnis = 4;
    //Serial.println(Ergebnis);
  }

  zahler = zahler + 1; // Nach dem 40 Durchlauf wird 1x Fressen gespawnt
  weg[0] = n; // Aktuelle Position des Kopfes ist gleich LED Nr. n
  if (zahler == 40) { // Fressen spawnen
    dot = random(0, 270);
    strip.setPixelColor(dot, 100, 100, 0);
    strip.show();
    zahler = 0;
  }

  weg_einschalten();  //Die LED in Weg einschalten
  essen_aufnehmen();  // Schlange wachsen lassen
  weg_verschieben();  //Die LED in Weg verschieben
  laufen_lassen();    //Automatische Bewegung der Schlange bei Ergebnis
}

void weg_einschalten() { // Die LED in Weg einschalten
  for (int w = 0; w < lange; w++) {
    strip.setPixelColor(weg[w], 100, 0, 0);
    strip.show();
  }
}
void weg_verschieben() { // Die LED in Weg verschieben

  int wegzw[270];
  for (int w = 0; w < lange; w++) { // Weg kopieren
    wegzw[w] = weg[w];
  }

  for (int w = 0; w < lange; w++) { // Weg nach rechts verschieben
    weg[w + 1] = wegzw[w];
  }

  weg[0] = n; // Kopf der Schlange ist Pixel Nr. n

  delay(500);
}
void laufen_lassen() {

  switch (Ergebnis) {
    case 1:// horizontaler Lauf+
      n = n + 1;
      if (n == 15)
        n = 0;
      break;
    case 2: // vertikaler Lauf+
      for (int m = 0; m <= 14; m++) { // vertikale Achse zurücksetzen
        if (n == letzteZeile[m])
          n = letzteZeile[m] - 18 * 15;
        //Serial.println(n);
      }
      n = n + 15;
      break;
    case 3: // horizontaler Lauf-
      n = n - 1;
      if (n == 0)
        n = 15;
      break;
    case 4: //vertikaler Lauf-
      for (int m = 0; m <= 14; m++) { // vertikale Achse zurücksetzen
        if (n == letzteZeile[m])
          n = letzteZeile[m] + 18 * 15;
      }
      n = n - 15;
      break;
  }
  weg_0_ausschalten(); // letzte Position des Schlangenendes ausschalten
  return n;
}
void weg_0_ausschalten() { // setzt letzten Eintrag in weg[lange] zurück
  int off;
  off = weg[lange];
  strip.setPixelColor(off, 0, 0, 0);
}
void essen_aufnehmen() { // Schlange wachsen lassen

  if (weg[0] == dot) {    // Wenn Kopf der Schlange == Fressen ist, Länge der Schlange++

    //lange=lange+1;      // Sofern Länge nicht auskommentiert ist, gehen wahllos LEDs an.

    strip.setPixelColor(dot, 0, 0, 0); // LED die Futter anzeigt ausschalten
    strip.show();
  }

}

Ich nutze einen Arduino Uno. Ich werde gleich noch ein paar Bilder hochladen um mein Problem zu verdeutlichen. Dir schonmal danke für die Antwort.

LG Mauser


RE: Neopixel - LEDS leuchten obwohl sie es nicht sollten - Mauser - 24.11.2020 14:43

(24.11.2020 11:54)hotsystems schrieb:  
(24.11.2020 00:34)Mauser schrieb:  Ich habe schon einiges Versucht den Fehler zu finden, leider ohne Erfolg.

Was genau hast du versucht ?
Wie hast du die Spannungsversorgung angeschlossen ?
Was für ein Netzteil verwendest du ?

Hallo hotsystems,

Ich habe damit angefangen die Unterfunktionen die in Loop aufgerufen werden auszuklammern um den Fehler einzugrenzen. Das hat mich dann auf den Befehl "Lange = Lange 1" gebracht. Ich habe zudem die Lange auf die Konstanten 3, 5, 10 abgeändert und das verlief ohne Probleme. Weiterhin habe ich mir das Array Weg[x] ausgeben lassen. Hier standen keine Merkwürdigen Elemente drin, sondern nur die Pixel die aktuell Eingeschaltet sein sollten.

Zur Spannungsversorgung nutzze ich den USB Port meines PCs. Bevor ich mit dem Programmieren angefangen habe, hatte ich alle 270 LED der Matrix über den 5V Anschluss einschaltten können. Demnach erschien mir das erstmal auszureichen.

Die spätere Stromversorgung wird über ein 5V Netzteil ablaufen.

Zur Schaltung möchte ich folgendes erläutern.

- Der PWM Pin 6 des Arduino ist mit dem Datenkontakt der ersten W2812 LED verbunden
- Der 5V Pol des Uno geht auf den Pluspol der ersten LED sowie auf den des IR-Sensor Moduls (Anschluss R)
- Der Ground Pol des Arduino ist mit dem Minuspol der ersten LED verbunden und mit dem IR-Sensor Modul (Anschluss G)
- PWM Pin 11 des Arduino ist mit dem Datenpol des IR-Sensor verbunden.

- Bei den LED handelt es sich um LED Streifen. Der ursprüngliche Streifen war 300 LED lang, ich habe diesen mehrmals aufgeteilt. Die letzte LED des ersten Streifens ist mit der ersten LED des zweiten Streifens verbunden usw. Ansprechbar sind alle LEDs.

Ich werde im nächsten Post mein Projekt vorstellen und 2 Bilder hochladen. Ich danke dir schoneinmal für deine Antwort.

LG Mauser


RE: Neopixel - LEDS leuchten obwohl sie es nicht sollten - Mauser - 24.11.2020 15:00

Projektvorstellung

Ich habe mir von Amazon folgende W2812 LED bestellt.

https://www.amazon.de/-/en/gp/product/B01AZKFXHE/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&psc=1

Diese 300 LED Kette habe ich mehrfach aufgetrennt um eine LED Matrix zu kreiren. Die Matrix ist 18 Zeilen tief und 15 LEDs breit. In Summe stehen somit 270 Led zur Verfügung. Hier möchte ich das Spiel Snake realisieren. Um die LED gezielt anzusteuern nutze ich einen Arduino UNO. Der Bediener kann später über eine IR Fernbedienung die Snake steuern.

Dazu folgendes Bild im Anhang.
Auf diesem Bild ist also die Matrix zu sehen, sowie die Lötkontakte. Die erste LED des ersten Streifens ist mit dem Arduino verbunden. Die letzte LED des ersten Streifens ist mit der ersten LED des zweiten Streifens verbunden usw. Auf der Rückseite der Holzplatte habe ich einen Bereich für die Verkabelung ausgefräst, das ganze wird dann einfach mit einer Holzplatte verdeckt. Zur späteren Spannungsversorgung möchte ich ein 5V Netzteil verwenden mit einem USB-Mini Anschluss. Ein Arduino Nano soll später die Rechenarbeit ausführen. (Hoffe das es so geht)
Damit die Verkabelung an der Vorderseite nicht mehr zu sehen sein wird, ist ein Holzgitter geplant, dass ich über die LEDs legen möchte, um jeden Pixel ein Quadrat ausleuchten zu lassen. das ganze wird dann von einer "milchigen" Plexiglasplatte verdeckt, welche ich evtl. mit einer Spiegelfolie auskleiden werde. Die Matrix soll als Spiegel mit Beleuchtung, aber auch als Spiel dienen. Dabei ist mir das Spiel Snake in den Sinn gekommen, sowie Tetris. Das Programm für das Spiel Snake ist so gut wie fertig.

Problem
Dazu eine Erklärung zu dem Bild.
In der ersten Zeile wandert die Grüne-Snake von links nach rechts (horizontal +). Jeden 40 Durchlauf des LOOP Teils spawnt ein Pixel in der Farbe Gelb.
Nimmt der Kopf der Schlange diesen Pixel auf verlängert sich deren Größe um +1; Das alles funktioniert schon. Jetzt das schon oben beschriebene Problem.
Die bunten Lichter die in der Mitte der Matrix zu sehen sind, sollten eigentlich nicht leuchten. Ich habe absolut keine Ahnung wieso. Der Code ist im vorherigen Beitrag zu sehen. Wird hier der Befehl Länge=Länge+1 ausgeklammert, leuchten die bunten Lichter nicht.

Und da würde ich euch gerne um Hilfe bitten.

LG Mauser


RE: Neopixel - LEDS leuchten obwohl sie es nicht sollten - Tommy56 - 24.11.2020 15:17

So beim drüberschauen finde ich nichts, was diesen Effekt erzeugt.
Du wirst also wohl den Weg gehen müssen, über serielle Ausgaben der Variablenwerte herauszufinden, wo Dein Sketch falsch abbiegt.

Mir ist aber aufgefallen, dass Du manchmal etwas ungünstig agierst:
Code:
// Dein Code
void weg_einschalten() { // Die LED in Weg einschalten
  for (int w = 0; w < lange; w++) {
    strip.setPixelColor(weg[w], 100, 0, 0);
    strip.show();
  }
}

// ist effektiver, weil nur 1 Mal die Interrupts gesperrt werden
void weg_einschalten() { // Die LED in Weg einschalten
  for (int w = 0; w < lange; w++) {
    strip.setPixelColor(weg[w], 100, 0, 0);
  }
  strip.show();
}

Hast Du das schon mit der IR-Fernbedienung getestet, weil Du dazu später schreibst? In den meisten Fällen vertragen sich WS2812 und IR-Empfang nicht miteinander, da das Zeitverhalten von show() sehr zeitkritisch ist und deshalb in dieser Zeit die Interrupts gesperrt werden. Deshalb kann dann über IR nichts empfangen werden.

Gruß Tommy


RE: Neopixel - LEDS leuchten obwohl sie es nicht sollten - hotsystems - 24.11.2020 15:23

Dir ist hoffentlich klar, dass du ca. 16 A für deine Matrix (270 x 60mA) benötigst. Da reicht es def. nicht, die mit dem Arduino zu speisen. Auch nur ein Spannungsanschluß ist viel zu wenig. Aus meiner Erfahrung ist es nötig, die Spannung alle 2 Zeilen einzuspeisen.
Nur so wird das stabil funktionieren.