Forum: Mikrocontroller und Digitale Elektronik Zwei Input und zwei Output


von Michael (micha1980)


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.

```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
von Sebastian R. (sebastian_r569)


Lesenswert?

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
von Peter C. (peter_c49)


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

von Peter C. (peter_c49)


Lesenswert?

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.

von Gerhard O. (gerhard_)


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

: Bearbeitet durch User
von Michael (micha1980)


Angehängte Dateien:

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

von Michael (micha1980)


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.

von Michael (micha1980)


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

von Harald K. (kirnbichler)


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.

von Sebastian R. (sebastian_r569)


Lesenswert?

Michael schrieb:
> Das System verbietet mir mehr als 2 Antworten je 30 Minuten...🧐

Machen wir gerade deine Hausaufgaben für dich`?

von A. Z. (donvido)


Lesenswert?

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.

von N. M. (mani)


Lesenswert?

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.

von N. M. (mani)


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);

von Michael (micha1980)


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

von Benjamin K. (bentschie)


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.

von Steve van de Grens (roehrmond)


Lesenswert?

Michael schrieb:
> digitalWrite(4, HIGH);
> digitalWrite(5, HIGH);

Wozu soll das gut sein?
Die Kommunikation mit den LEDs muss seriell stattfinden.

von Joachim B. (jar)


Lesenswert?

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.

von Rainer W. (rawi)


Lesenswert?

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

von Michi S. (mista_s)


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.

>     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
von Michael (micha1980)


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:
>>     digitalWrite(5, HIGH);
>
> Das ist hier sowieso unsinnig.
Übersehen aus alten Versuchen, habe es gelöscht.

Danke für euer Feedback.

von Steve van de Grens (roehrmond)


Lesenswert?

Michael schrieb:
> ändert sich zu "korrekte Anzeigeweise", wenn ich den Minuspol des Stripe
> anfasse

Zeige Fotos von Aufbau, insbesondere dem Verlauf der Stromversorgung.

von Michael (micha1980)


Angehängte Dateien:

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.

von Michael (micha1980)


Angehängte Dateien:

Lesenswert?

Der Aufbau:

von Sebastian W. (wangnick)


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

von Steve van de Grens (roehrmond)


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.

: Bearbeitet durch User
von Bernd K. (bmk)


Lesenswert?

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

von Michael (micha1980)


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.

von Gerhard O. (gerhard_)


Lesenswert?

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.

von Steve van de Grens (roehrmond)


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

von Michael (micha1980)


Lesenswert?

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
Noch kein Account? Hier anmelden.