Zwei Input und zwei Output

OP #7528037
Lesenswert?

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.

1
#include <Adafruit_NeoPixel.h>
2
#ifdef __AVR__
3
#include <avr/power.h> 
4
#endif
5

6
#define PIN 4 //Linke LED    //die beiden PINs für die LED-Stripes
7
#define PIN 5 //Rechte LED
8

9
#define LINKSPIN A4    //die beiden PINs für das LOW-Signal
10
#define RECHTSPIN A5 
11
int Sensor1 = 0;
12
int Sensor2 = 0;
13

14
#define NUMPIXELS 10   //Anzahl der LEDs in dem Stripe
15
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
16

17

18
void setup() {
19
  pinMode(LINKSPIN, INPUT);
20
  pinMode(RECHTSPIN, INPUT);
21
  digitalWrite(LINKSPIN, HIGH); //10KOhm-R an 5V
22
  digitalWrite(RECHTSPIN, HIGH);
23
  pinMode(4, OUTPUT);
24
  pinMode(5, OUTPUT);
25
  pixels.begin();
26
}
27

28
void BLINKENLINKS() {
29
  for(int i=0; i<11; i++) { 
30
    pixels.setPixelColor(i, pixels.Color(250,0,10));
31
    delay(50);
32
    digitalWrite(4, HIGH);
33
  }
34
} 
35
void BLINKENRECHTS() {
36
  for(int i=0; i<11; i++) { 
37
    pixels.setPixelColor(i, pixels.Color(250,0,10));
38
    delay(50);
39
    digitalWrite(5, HIGH);
40
  }
41
}
42
void STANDLICHT() {
43
  for(int i=0; i<11; i++) { 
44
    pixels.setPixelColor(i, pixels.Color(250,250,250));
45
    digitalWrite(4, HIGH);
46
    digitalWrite(5, HIGH);
47
  }
48
}
49

50

51
void loop() {
52
  pixels.clear();
53
  Sensor1 = digitalRead(LINKSPIN);
54
  Sensor2 = digitalRead(RECHTSPIN);
55

56
  if((Sensor1 == LOW) && (Sensor2 == HIGH)) {     //links blinken
57
    BLINKENLINKS();
58
    pixels.show();
59
  }
60
  else if((Sensor2 == LOW) && (Sensor1 == HIGH)) {    //rechts blinken
61
    BLINKENRECHTS();
62
    pixels.show();
63
  }
64
  else {                                 //Standlicht
65
    STANDLICHT(); 
66
    pixels.show();
67

68
  }
69
}
#7528058
Lesenswert?

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

#7528066
Lesenswert?

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

OP #7528072
Lesenswert?

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 😉.

Angehängte Dateien:
OP #7528075
Lesenswert?

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.

OP #7528101
Lesenswert?

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...🧐

#7528115
Lesenswert?

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.

#7528208
Lesenswert?

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);
OP #7528334
Lesenswert?

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

#7528379
Lesenswert?

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.

#7528686
Lesenswert?

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.

1
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.

OP #7529085
Lesenswert?

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:

1
digitalWrite(5, HIGH);

Das ist hier sowieso unsinnig.

Übersehen aus alten Versuchen, habe es gelöscht.

Danke für euer Feedback.

OP #7529119
Lesenswert?

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.

Angehängte Dateien:
#7529139
Lesenswert?

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

Gast #7529141
Lesenswert?

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.

OP #7529551
Lesenswert?

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.

Gast #7529561
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren