Hallo Leute, könnt ihr mir helfen, ich lese und probiere seit Stunden, bekomme aber diese einfache Aufgabe nicht gelöst: Prinzipiell soll ein Pin einen linken Blinker anschalten, ein zweiter Pin soll den rechten Blinker einschalten; sind beide Pins ohne Signal, soll das Standlicht leuchten. Versuchsaufbau an einem Nano von Elegoo. Die LEDs sind WS2812b in einem Stripe. Aktuell leuchtet nur eine LED als Standlicht (statt 2) und egal welcher PIN auf LOW gezogen wird- die eine LED wird bunt, aber nicht orange und schon gar nicht blinkend. ```cpp #include <Adafruit_NeoPixel.h> #ifdef _AVR_ #include <avr/power.h> #endif #define PIN 4 //Linke LED //die beiden PINs für die LED-Stripes #define PIN 5 //Rechte LED #define LINKSPIN A4 //die beiden PINs für das LOW-Signal #define RECHTSPIN A5 int Sensor1 = 0; int Sensor2 = 0; #define NUMPIXELS 10 //Anzahl der LEDs in dem Stripe Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); void setup() { pinMode(LINKSPIN, INPUT); pinMode(RECHTSPIN, INPUT); digitalWrite(LINKSPIN, HIGH); //10KOhm-R an 5V digitalWrite(RECHTSPIN, HIGH); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pixels.begin(); } void BLINKENLINKS() { for(int i=0; i<11; i++) { pixels.setPixelColor(i, pixels.Color(250,0,10)); delay(50); digitalWrite(4, HIGH); } } void BLINKENRECHTS() { for(int i=0; i<11; i++) { pixels.setPixelColor(i, pixels.Color(250,0,10)); delay(50); digitalWrite(5, HIGH); } } void STANDLICHT() { for(int i=0; i<11; i++) { pixels.setPixelColor(i, pixels.Color(250,250,250)); digitalWrite(4, HIGH); digitalWrite(5, HIGH); } } void loop() { pixels.clear(); Sensor1 = digitalRead(LINKSPIN); Sensor2 = digitalRead(RECHTSPIN); if((Sensor1 == LOW) && (Sensor2 == HIGH)) { //links blinken BLINKENLINKS(); pixels.show(); } else if((Sensor2 == LOW) && (Sensor1 == HIGH)) { //rechts blinken BLINKENRECHTS(); pixels.show(); } else { //Standlicht STANDLICHT(); pixels.show(); } } ```
:
Verschoben durch Moderator
Uuund wie sieht deine Hardware dazu aus? Fotos und Schaltplan wären hilfreich. Ansonsten: Serielle Schnittstelle für Debugging nutzen. Funktionieren einfache Farben mit dem Strip, ohne irgendwelche andere Logik in der Firmware?
:
Bearbeitet durch User
Hallo Michael, es sind 2 WS2812b stripes mit je 10? das hier: >#define PIN 4 //Linke LED //die beiden PINs für die LED-Stripes >#define PIN 5 //Rechte LED geht nicht! der letzte #define gewinnt, PIN ist somit 5. und somit wird die class pixels mit "PIN 5" initialisiert. >Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); ich kenne diese lib nicht, bin aber sicher das du sie für jeden stripe instanzieren kannst. ie #define PIN_4 //Linke LED //die beiden PINs für die LED-Stripes #define PIN_5 //Rechte LED Adafruit_NeoPixel pixels_links(NUMPIXELS, PIN_4, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel pixels_rechts(NUMPIXELS, PIN_5, NEO_GRB + NEO_KHZ800); und ja, eine kleine zeichnung wär hilfreich. mfG Peter
ach je, die digitalWrite() auf 4 bzw 5 in deinen funktionen, was sollen die machen? entweder ist da eine neopixel dran oder eine normale LED. zeichnung wär nötig zur klärung.
Moin, Ich möchte die Gelegenheit benutzen, daran zu erinnern, daß, wenn man mit fertigen Modulen und Bibliotheken am Besten so vor geht, indem man die HW und SW genauso wie der Entwickler als "Referenzdesign" erstmalig so in Betrieb nimmt. Im Falle dieses Versuchs, alles diesbezüglich von Adafruit dokumentiert sorgfältig durchzugehen. Schritt eins ist immer die mitgelieferten Beispiele zu testen und erst danach mit eigenen Exkursionen zu beginnen. Erst wenn die Anordnung wie beschrieben (ordnungsgemäß) funktioniert, dann selber mit eigenen Adaptionen anzufangen. Zweitens schlage ich vor die Modul Drahtverbindungen als Stromlaufplan wie in den Anschlußbestimmungen auf Papier zu zeichnen oder ECAD herzustellen, so daß man einen guten Überblick hat und etwaige Schaltfehler leichter und schneller erkennen kann. Steckbrett Aufbauten sollten erst auf Papier geplant werden. Auch hilft es mit fertig konfektionierten Drahtbrücken Kits mit verschiedenen Längen anstatt mit wild abgeschnittenen Drähten zu verdrahten. Man sollte sich nach Möglichkeit Gedanken über sachgerechte Anordnung der Komponenten und Verdrahtung machen. Dann erst aufbauen und verdrahten. Nicht einfach loslegen. Systematisch vorgehen. Drittens, wenn es schon erstmalig nicht funktionieren sollte, ausschalten. Dokus durchgeben, jede Verbindung auf Herz und Nieren auf Probleme zu untersuchen. Bei fremden Bibliotheken nach augenscheinliche erfolgreiche Berichte im Internet suchen. Bei TWI/I2C IMMER nachprüfen ob die Module die vorschriftsmäßigen Pullup Rs aufweisen. Meist funktionieren Werte im Bereich von 2-5KOhm. Man wird nicht glauben wollen, wie leicht sich der Fehlerteufel einschleichen kann. Das passiert auch alten Hasen. Immer prüfen und wissen - nicht glauben. Im Falle des Falles ist ALLES verdächtig. Hier im Forum wurde schon oft gepredigt, uC minimalistisch ausreichend Hersteller Vorschriften gemäß zu beschalten. Vernünftig platzierte und geeignete Abblock Cs sind nie ein Luxus. Im Datenblatt immer alle Herstellervorgaben bezüglich Betrieb einhalten. Wenn man das alles beachtet, erspart man sich oft viel Leid und Frust. Gerhard
:
Bearbeitet durch User
Seriell? Ein Stripe alleine funktioniert wie gewünscht, ich scheitere an "zwei Outputs", also ich finde einfach keine Lösung, zwei Outputs anzusprechen, ich hab alle möglichen Anweisungen mal in das Void geschrieben, mal in den Loop, mal am Anfang, mal am Ende- keine Ahnung was wo an falscher Stelle steht, ich bin grad erst am Verstehen 😉.
Michael schrieb: > Seriell? > Ein Stripe alleine funktioniert wie gewünscht, ich scheitere an "zwei > Outputs", also ich finde einfach keine Lösung, zwei Outputs > anzusprechen, ich hab alle möglichen Anweisungen mal in das Void > geschrieben, mal in den Loop, mal am Anfang, mal am Ende- keine Ahnung > was wo an falscher Stelle steht, ich bin grad erst am Verstehen 😉. Edit: Während ich hier auf die erste Antwort reagiere, bekomme ich bereits neue Antworten- danke für so viel Input.
Ja es sind 2 Stripe im Versuchsaufbau mit je 10 LED. Die Adafruit-Bibliothek ist eine Standard-Bib für alle digitalen LEDs, auf der Arduino-Benutzeroberfläche integriert. Peter C. schrieb: > geht nicht! der letzte #define gewinnt, PIN ist somit 5. > und somit wird die class pixels mit "PIN 5" initialisiert Ahh ok, ich hab mir schon den Kopf zerbrochen, zumal ich den Pins nicht mal Namen zuordnen kann, das es dann immer zu Fehlern kommt (also "#define PIN 4" geht, #define Links 4" geht nicht). Peter C. schrieb: > Adafruit_NeoPixel pixels_links(NUMPIXELS, PIN_4, NEO_GRB + NEO_KHZ800); > Adafruit_NeoPixel pixels_rechts(NUMPIXELS, PIN_5, NEO_GRB + NEO_KHZ800); Das werde ich ausprobieren. Das System verbietet mir mehr als 2 Antworten je 30 Minuten...🧐
> Forum: Projekte & Code > > Hier könnt ihr Projekte, Schaltungen oder Codeschnipsel vorstellen. > Projekte bitte nur mit Code oder Schaltplan posten (falls ihr nur > Fotos vorstellen möchtet, bitte in "Zeigt her eure Kunstwerke"). > > Bitte hier keine Fragen posten. Ist vermutlich nötig, das in "einfachem Deutsch" neu zu formulieren.
Michael schrieb: > Das System verbietet mir mehr als 2 Antworten je 30 Minuten...🧐 Machen wir gerade deine Hausaufgaben für dich`?
Michael schrieb: > #define NUMPIXELS 10 Michael schrieb: > for(int i=0; i<11; i++) { > pixels.setPixelColor(i, pixels.Color(250,0,10)); Keine Ahnung ob die lib das abfängt, aber du definierst 10 LEDs und schreibst auf 11.
A. Z. schrieb: > Keine Ahnung ob die lib das abfängt, aber du definierst 10 LEDs und > schreibst auf 11.
1 | void Adafruit_NeoPixel::setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b) |
2 | {
|
3 | if (n < numLEDs) |
4 | {
|
5 | ...
|
6 | }
|
7 | }
|
Erster Blick sagt ja. Trotzdem unschön.
Peter C. schrieb: > die digitalWrite() auf 4 bzw 5 in deinen funktionen, was sollen die > machen? Ich vermute stark er will damit die Pullups aktivieren. Keine Ahnung ob das bei der Arduino Lib so auch geht. Solange es nicht verprüft wird und nur auf das Datenregister geschrieben wird...vielleicht. Ich kenne das aber auch eher so:
1 | pinMode(LINKSPIN, INPUT_PULLUP); |
A. Z. schrieb: > Keine Ahnung ob die lib das abfängt, aber du definierst 10 LEDs und > schreibst auf 11. Ja es soll ein Wisch-Licht sein, also jede LED durchzählen, die KLEINER ALS 11 ist. Das ist praktisch, wenn man nicht alle LEDs ansprechen will. Sebastian R. schrieb: > Machen wir gerade deine Hausaufgaben für dich`? Wie kann ich das verstehen? N. M. schrieb: > Ich vermute stark er will damit die Pullups aktivieren Nein, damit wollte ich die LEDs ansprechen. Habe ja viele Möglichkeiten durchprobiert, "digitalWrite" war eine davon. Peter C. schrieb: > Adafruit_NeoPixel pixels_links(NUMPIXELS, PIN_4, NEO_GRB + NEO_KHZ800); > Adafruit_NeoPixel pixels_rechts(NUMPIXELS, PIN_5, NEO_GRB + NEO_KHZ800); Das war die Lösung, einen Herzlichen Dank dafür. Für jede LED an einem PIN muss ich eine eigene Formel schreiben, auf diese Idee wäre ich nie gekommen :D
Michael schrieb: > Ja es soll ein Wisch-Licht sein, also jede LED durchzählen, die KLEINER > ALS 11 ist. Das ist praktisch, wenn man nicht alle LEDs ansprechen will. Was dir donvido sagen will ist, 0bis 10 sind aber schon bereits 11 Pixel. Du hast die 0 nicht meitgezählt, das ist ja das erste Pixel. p.s. Das ist ein sehr beliebter Fehler, macht garantiert jeder mal. Du bemerkst es ja gar nicht, das dann noch eine 11. LED angesteuert wird. Die Daten fallen einfach am Ende hinten raus und kommen nirgends an.
Michael schrieb: > digitalWrite(4, HIGH); > digitalWrite(5, HIGH); Wozu soll das gut sein? Die Kommunikation mit den LEDs muss seriell stattfinden.
Michael schrieb: > Für jede LED an einem > PIN muss ich eine eigene Formel schreiben, auf diese Idee wäre ich nie > gekommen :D du kommst aber auch nicht auf die Idee alle 20 LEDs mit einem Pin zu bedienen, für linken Blinker LED 0-9 und für rechten Blinker LED 10-19 Geht alles in einem Stripe, man muss nur die Daten passend rausschieben, inklusive LED Fading / Nachleuchten.
Michael schrieb: > ich lese und probiere seit Stunden, > bekomme aber diese einfache Aufgabe nicht gelöst Wie kommst du zu dem Urteil, dass die Aufgabe einfach zu lösen ist, wenn du es selber nicht in annehmbarer Zeit hin bekommst. Wieso maßt du dir bei diesem Stand deiner Fähigkeiten an, dies beurteilen zu können? scnr
Michael schrieb: > die eine LED wird bunt, aber nicht orange und > schon gar nicht blinkend Die eine LED sind doch eigentlich 10 LEDs, oder? Michael schrieb: > pixels.Color(250,0,10) Wenn ich mich recht erinnere ist das ganz viel rot mit ganz wenig blau dazu; kein Wunder, daß das nicht orange wird. > pixels.Color(250,128,0) Das sollte in Richtung orange gehen; wenn dabei eine ganz andere Farbe rauskommt müßtest Du die Konstante NEO_GRB in der Initialisierung anpassen, dann haben die einzelnen Pixel eine andere Farbreihenfolge. Aber bei pixels.Color(R, G, B) ist die Reihenfolge der Farbanteile immer rot, grün, blau. Michael schrieb: > delay(50); Damit verzögerst Du zwar das füllen des Pixelbuffers, aber davon bekommen die LEDs nichts mit. > digitalWrite(5, HIGH); Das ist hier sowieso unsinnig. Wenn Du an dieser Stelle stattdessen > pixels.show(); schreibst, dann färben sich die LEDs zumindest schon mal eine nach der anderen um.
:
Bearbeitet durch User
Benjamin K. schrieb: > p.s. Das ist ein sehr beliebter Fehler, Ja das hatte ich gar nicht auf dem Schirm Steve van de Grens schrieb: > Wozu soll das gut sein? Stammt noch aus verschiedenen Versuchen, habe ich gelöscht Joachim B. schrieb: > du kommst aber auch nicht auf die Idee alle 20 LEDs mit einem Pin zu > bedienen, Doch, die Idee hatte ich schon, aber dann würde ich es mir noch schwerer machen, da die Blinker ja gespiegelt funktionieren sollen (beim wischen wichtig, von innen nach außen zu leuchten und würden beide Blinker in einer Linie hängen, müsste ich einen Rückwärtszähler für den zweiten Blinker einbauen und soweit bin ich noch nicht) Rainer W. schrieb: > Wie kommst du zu dem Urteil, dass die Aufgabe einfach zu lösen ist Naja innerhalb der Programmierwelt sollte diese Aufgabe einfach sein- für Planlose wie mich aber dann doch nicht Michi S. schrieb: > Die eine LED sind doch eigentlich 10 LEDs, oder? Ja, ich beschreibe den Stripe mit 10 LED als ein Leuchtmittel. Könnten am Ende auch nur 5 oder 50 sein Michi S. schrieb: > Wenn ich mich recht erinnere ist das ganz viel rot mit ganz wenig blau > dazu; kein Wunder, daß das nicht orange wird. Das ist ein RBG-Stripe, also 250 Rot, 10 Grün. Das Problem des "wilden Blinkens und Leuchtens" ändert sich zu "korrekte Anzeigeweise", wenn ich den Minuspol des Stripe anfasse und so mit mir erde- dieses Phänomen habe ich auch noch nicht verstanden- Stripe und Nano sind miteinander geerdet. Michi S. schrieb: > Michael schrieb: >> delay(50); > > Damit verzögerst Du zwar das füllen des Pixelbuffers, aber davon > bekommen die LEDs nichts mit. Welche Alternative dazu gibt es? Michi S. schrieb: >> digitalWrite(5, HIGH); > > Das ist hier sowieso unsinnig. Übersehen aus alten Versuchen, habe es gelöscht. Danke für euer Feedback.
Michael schrieb: > ändert sich zu "korrekte Anzeigeweise", wenn ich den Minuspol des Stripe > anfasse Zeige Fotos von Aufbau, insbesondere dem Verlauf der Stromversorgung.
Steve van de Grens schrieb: > Zeige Fotos von Aufbau, Die Farben sind im Video kaum erkennbar, aber der obere Stripe mit 10 LEDs blinkt korrekt in Organge, der kleine Stripe darunter mit nur 3 LED blinkt stets in zufälligen Farben, bis ich die Lötstelle mit dem Finger berühre, dann blinkt er auch wie gewünscht. Das macht der zweite kurze Stripe mit 3 LEDs ebenfalls. Der Nano läuft über 5V USB, der Stripe über ein 12V-Netzteil.
Michael schrieb: > Der Aufbau: Ok, Arduino GND hängt also am GND des 4. Stripe, und am GND vom USB. 1. Wieviel Potentialeifferenz hast du zwischen USB GND und 4. Stripe GND? Wird es stabiler, wenn du den Arduino aus +12V und dem GND am 4. Stripe versorgst? 2. Wieviel Potentialdifferenz hast du zwischen GND vom 4. Stripe und GND vom 1. Stripe? Denn (merke!) bei hohen Strömen machen Kabel Spannungsabfall! LG, Sebastian
Ich habe nach Fotos vom Aufbau gefragt, insbesondere dem Verlauf der Stromversorgung. Das Video zeigt nichts davon. Die Fehler stecken meistens dort, wo man nicht hin schaut, weil man es nicht für nötig hält.
:
Bearbeitet durch User
Michael schrieb: > Die LEDs sind WS2812b in einem Stripe. Als Versorgung für den WS2812b kenne ich nur 5V. In deinem Bild sehe ich aber als Versorgung für diesen Stripe 12V. Da stimmt doch was nicht....
Sebastian W. schrieb: > Ok, Arduino GND hängt also am GND des 4. Stripe, und am GND vom USB. Alle GND sind miteinander verbunden, alle 12V auch (Sternenform), aber wenn ich das so gezeichnet hätte, würde man nichts mehr erkennen. Steve van de Grens schrieb: > Ich habe nach Fotos vom Aufbau gefragt, insbesondere dem Verlauf der > Stromversorgung. Das habe ich ja mit dem Zeichnung realisiert, denn in real sind die Leitungen natürlich länger und ich wüsste nicht, wie ich das filmen sollte, so dass man noch durchblickt Bernd K. schrieb: > Als Versorgung für den WS2812b kenne ich nur 5V. In der Tat ist es ein WS2811, also immer 3 LEDs werden von einem IC versorgt, also leuchten immer 3 LEDs, wenn ich eine anspreche.
Was passiert, wenn Du die LED Stränge untereinander austauscht. Folgen dann die Symptome? Vielleicht hast Du auch nur einen schlechten WS2811. Tausche versuchsweise auch mal den Problem Ausgang mit einem anderen Pin.
Michael schrieb: > Das habe ich ja mit dem Zeichnung realisiert, denn in real sind die > Leitungen natürlich länger und ich wüsste nicht, wie ich das filmen > sollte, so dass man noch durchblickt Dann bleibt als nur zu raten. An deinen GND Leitungen fällt Spannung ab, welche das Daten-Signal verzerrt. Du musst an jeder Lichterkette zwei GND Leitungen verlegen, eine zur Stromversorgung und eine für das Daten-Signal. Siehe http://stefanfrings.de/ws2812/index.html
Ich habe die Stripe, die Probleme machen, ausgetauscht- jetzt läuft es. Vielleicht mal zu stark geknickt. Die Stripe befinden sich in einem vergossenem Kunststoffschlauch, kann deshalb die Leiterbahnen nicht überprüfen. Danke für eure Hilfe. Gruß Micha
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.