Besseres Verständnis der Optokoppler

Hallo zusammen! Ich bin neu in der Arduinoswelt und ich brauche eure Hilfe.

Ich habe ein AC Digital Bussignal zwischen 0-24V und ich möchte dieses Signal als Eingang in Arduino einfügen.
Es ist sehr wichtig, dass es Isolation in der Schaltung gibt. Deshalb möchte ich Optokoppler nutzen. Die Werte von Widerstände waren nicht berechnet, ich möchte erst nur die Idee überprüfen. Ich werde später auch einen Spannungsteiler in der Schaltung hinzufügen!
Könnt ihr mich sagen, ob das falsch ist und wenn ja, warum?

Ich entschuldige für mein Deutsch und vielen Dank im Voraus!

Hallo,
leider ist der Inhalt des Bildes nicht zu erkennen.
Was möchtest du mit dem Signal, welches du an den Arduino anschließen möchtest, erreichen?

Optokoppler ist vermutlich richtig, braucht nicht unbedingt einen Spannungsteiler, aber auf jeden Fall einen Strombegrenzungs-Vorwiderstand.

Wenn du den Opto-Ausgang an einen INPUT_PULLUP Pin hängst, brauchst du nur einen kleinen Eingangsstrom und hast einen breiten Bereich für deinen Vorwiderstand im Optokoppler-Eingang.

z.B. 20k .. 1k für ca 1 .. 20 mA IF

...und was ist das für ein Signal ( Frequenz ) ?

HotSystems:
leider ist der Inhalt des Bildes nicht zu erkennen.
Was möchtest du mit dem Signal, welches du an den Arduino anschließen möchtest, erreichen?

Im Anhang könnt ihr jetzt vielleicht die Schaltung gucken!

Ich möchte nur wissen, wann die Spannung ist null (oder LOW) für mehr als ungefähr 3 Sekunden.
Wenn die Dauer ist größer als 3 Sekunden, ich möchte, durch Programmierung, ein LED zu leuchten.
Es sieht einfach aus, aber ich habe fast keine Erfahrung.

michael_x:
...und was ist das für ein Signal ( Frequenz ) ?

Hallo Michael, Datenfrequenz ist 47kHz.

Datenfrequenz ist 47kHz.

Eine Idee:
pulseIn(7, LOW); würde einen Wert um die 20 liefern bei 50 kHz, oder nach 1 sec einen Timeout, mit Wert 0.

Nach 3 mal Timeout hintereinander sind deine 3 sec um und du schaltest die LED ein.
Sobald pulseIn etwas >0 liefert, LED aus und Timeout Zähler auf 0 setzen.

Kannst den Timeout auch kleiner vorgeben und entsprechend weiter zählen, um genauer zu sehen, was los ist.

michael_x:
Eine Idee:
pulseIn(7, LOW); würde einen Wert um die 20 liefern bei 50 kHz, oder nach 1 sec einen Timeout, mit Wert 0.

Nach 3 mal Timeout hintereinander sind deine 3 sec um und du schaltest die LED ein.
Sobald pulseIn etwas >0 liefert, LED aus und Timeout Zähler auf 0 setzen.

Kannst den Timeout auch kleiner vorgeben und entsprechend weiter zählen, um genauer zu sehen, was los ist.

Gute Idee, danke! Ich kann sie vorschlagen, aber eigentlich muss ich mit die erste Idee fortfahren, weil sie akzeptiert schon von meinem Supervisor ist.

Ist die Verdrahtung von der obige Schaltung richtig?
Sollte ich normalerweise auch 5V von Arduino irgendwo verbinden?
Wann verbindet man das Base pin und warum?

Ich entschuldige für die viele einfache Frage. Ich versuche Optokopplers ganz verstehen.

Das Bild kann man nicht erkennen.

Du musst den Emitter des Fototransistors auf GND legen. Der Kollektor kommt über einen 10k Widerstand an die 5V des Arduinos und auf den Eingangspin (Pullup-Widerstand).

So:

Das ist eine ganz normale Emitterschaltung im Ausgang. Wenn der Transistor sperrt, liegt der Pin über den Pullup an 5V. Wenn die LED angeht schaltet der Transistor durch und zieht den Pin auf Masse.

Perfekt! Ich muss dann noch den Emitter mit 5V verbinden!

So, zum Schluss, meine Verdrahtung ist:
Anode: ist verbindet mit 0-24V und ein Widerstand.
Cathode: ist verbindet mit GND der Quelle.

Emitter: ist verbindet mit GND von Arduino.
Kollektor: ist verbindet erst mit eine Widerstand und dann mit 5V von Arduino und Digital pin von Arduino.

  1. Aller klar bis jetzt?
  2. Soll ich erwarten eine groß Spannungsreduzierung im Optokopplersausgang und wie hoch?
  3. Ob ich möchtet auch einen Spannungsteiler addieren, sollte ich den Widerstand in Kollektor mit dem Spannungsteiler wechseln oder werde ich 3 Widerstände in Kollektorspin haben?

Gute Idee, danke! Ich kann sie vorschlagen, aber eigentlich muss ich mit die erste Idee fortfahren

Was ist deine erste Idee ?
Wie willst du einfach 47kHz Pulse an einem Input-Pin erkennen?

Ich muss dann noch den Emitter mit 5V verbinden!

? Was meinst du damit ?

Kollektor: ist verbindet erst mit eine Widerstand und dann mit 5V von Arduino und Digital pin von Arduino.

Das kann der Input-Pin selbst, ohne externen Widerstand, wenn du
pinMode(7, INPUT_PULLUP); angibst. ( Sind etwa 30k statt Serenifly's 10k Widerstand, aber das macht nichts )

  1. Ob ich möchtet auch einen Spannungsteiler addieren, sollte ich den Widerstand in Kollektor mit dem Spannungsteiler wechseln oder werde ich 3 Widerstände in Kollektorspin haben?

? Was meinst du damit ?

  1. Soll ich erwarten eine groß Spannungsreduzierung im Optokopplersausgang und wie hoch?

Kannst du dir als Schalter vorstellen: Signal am Eingang schaltet den Transistor durch, und liefert 0,3V am Kollektor ( LOW )
kein Signal am Eingang: Transistor sperrt und hat 5V am Kollektor ( HIGH )

michael_x:
Was ist deine erste Idee ?
Wie willst du einfach 47kHz Pulse an einem Input-Pin erkennen?

Entschuldigung Michael, gerade habe ich verstanden was du meintest, ich dachte etwas anderes!

Das ist genau was ich brauche!!
So,
erst pulseIn(7, LOW);
und dann

duration = pulseIn(pin, LOW);
If (duration = 3000000)
   digitalWrite(13, HIGH);   // turn the LED on
end

usw, oder?

adavradou:

duration = pulseIn(pin, LOW);

If (duration = 3000000)
  digitalWrite(13, HIGH);  // turn the LED on
end




usw, oder?

Oder!

Du programmierst hier in C++, da sind Vergleichsoperatoren anders ('==' statt '='), und es gibt kein 'If' oder 'end'.

Ist wohl auch sehr unwahrscheinlich genau 3000000 zu treffen

unsigned long duration = pulseIn(pin, LOW);
if (duration >= 3000000UL) {
   digitalWrite(13, HIGH);   // turn the LED on
}

Vielen Dank für eure Hilfe alle!
Ich probiere noch ein Mal für ein erkennbar img.

Whandall:
Oder!

unsigned long duration = pulseIn(pin, LOW);

if (duration >= 3000000UL) {
  digitalWrite(13, HIGH);  // turn the LED on
}

Whandall, du bist natürlich richtig, ich schäme mich..

Darf ich fragen, was würden wir für ein negativ Signal -24V - 0 machen? Würde ein Optokoppler, wie er, mit unbekannt Polarität genug sein?
http://www.mouser.com/ds/2/427/ild620-103075.pdf

Sereniflys Bild ist immer noch leichter lesbar:

Eine Schaltplan aus Strichen ist leichter lesbar als ein Fritzing - Bild.
Ich persönlich mag auch ascii-Grafik (mit Notepad erstellt und in code- oder tt-Tags gepackt), andere haben Ruckzuck eine Zeichnung auf Papier mit dem Handy fotografiert.

24V Pulse     +  o------ R1 ----o--+    C o----o   D7 Input_PULLUP
( 40khz                            v   /
  oder                             -  |
  Pause)      -  o--------------o--+   \ 
                                        E o----o   GND 
                                     Opto       Arduino

Wenn du die Polarität des Eingangs nicht kennst, oder Angst vor Verpolung hast, ist so ein bipolarer ILD620 natürlich praktisch.

Mit Arduino-Programmierung und dem loop() - Konzept und mit C im allgemeinen solltest du etwas Erfahrung sammeln.

Trickreich ist, dass das Programm in manchen Funktionen hängenbleibt, was oft nicht gewünscht ist.
So kannst du z.B. bei pulseIn erst nach dem Puls erkennen, wie lang er war. Daher hat diese Funktion auch einen (wahlweise einstellbaren) Timeout:
Wenn ein Puls kommt, siehst du dessen Länge ( z.B. 20µs bei 50 kHz ), wenn aber keiner kommt, beendet sich die Funktion glücklicherweise nach (standard) 1 sec und liefert eine 0 zurück.

unsigned long duration = pulseIn(pin, LOW, 3000000UL);  // wait max. 3 sec.
if (duration == 0) {
   digitalWrite(13, HIGH);   // timeout: turn the LED on
} 
else {
   digitalWrite(13, LOW);   // pulses are coming: turn the LED off
}

Sehr verständliche Erläuterung, Michael, vielen Dank!
Ok, noch eine Frage und dann ich stoppe!

Könnten wir zwei Optokopplers mit ein Pull-up Widerstand verbinden, wenn wir zwei Signale mit gemeinsame Erdung (z.B beide positiv und negativ) haben?
Wie sieht das aus? Ich denke etwas wie das:

Stimmt es R1=R2 und R3=R4?
Würde diese Schaltung funktionieren?

Deine Schaltung kannst du noch vereinfachen. Die beiden Optokoppler LEDs gleich antiparallel. Spart die 2 normalen Dioden. Ein Kollektorwiderstand langt für beide Transistoren - die beiden Widerstände liegen ohnehin parallel, so das sich der Gesamtwiderstand halbiert.

Ausgangsseitig ist es übrigens externer Pullup + INPUT oder INPUT_PULLUP

Beides schadet zwar nichts (dann sind die Widerstände halt parallel), aber der Sinn von INPUT_PULLUP ist dass man sich den extra Widerstand sparen kann, da statt dessen der Pullup Widerstand im µC verwendet wird.

nix_mehr_frei:
Spart die 2 normalen Dioden.

Hast du, glaub ich, falsch verstanden. Das sollen zwei bipolare ILD620 sein, denke ich, ohne externe Dioden.

Willst du zwei Signale auf 1 Pin legen ?
Vout bleibt nur in Ruhe, wenn beide Eingänge keine Pulse senden.

Ich sehe die Schaltung eher so:

Würde diese Schaltung funktionieren?

Der untere Optokoppler leuchtet nie.

nix_mehr_frei:
Spart die 2 normalen Dioden.

Hallo! Michael ist richtig, diese sind nicht normalen Dioden, aber bipolare ILD620.

Serenifly:
Ausgangsseitig ist es übrigens externer Pullup + INPUT oder INPUT_PULLUP

Perfekt, so keine R3, oder? :slight_smile:

michael_x:
Vout bleibt nur in Ruhe, wenn beide Eingänge keine Pulse senden.

Ja, ich weiß, das ist genau was ich möchte!

michael_x:
Ich sehe die Schaltung eher so:

Danke für die Korrektur :slight_smile: Kann ich dann vielleicht jetzt probiere die Schaltung in Breadboard zu bauen?
Welche Wert würde besser sein die Widerstände zu haben? Vout wird auf jeden Fall LOW lesen, wenn ein Pulse gibt oder geht es darauf an den Widerstände?

Vielen Dank alle, ihr seid wirklich eine sehr sehr große Hilfe!!

Hallo wieder!
Mein Problem ist endlich nicht gelöst.

Ein Bekannter hat mich informiert, dass weil die Bussignale differenziert sind, ich werde keine nützlich Ergebniss von diese Schaltung nehmen.

Ich schicke euch auch einige Oscilloskope Bilder von dem System (wir suchen warum die Miete ist nicht 0, aber negativ, aber das ist ein ganz anderes Thema. Bitte leg nicht große Wert auf dieses).

Ich möchte auch wieder das Problem erklären mit einem Bild. Vielleicht habt ihr ein besseres Vorschlag als mein.

In die erste halbe Linie die Fahrwerke kommunizieren, aber danach kommuniezieren nicht mehr und wir möchten finden, wo genau diese Abbrechung ist.

Könnte ich nutze eine ähnliche Schaltung, wo bis die Optokopplers ist gleich, aber dann verbinde ich nicht die Ausgänge von jeder Optokoppler, aber ich hinzufüge diese zwei Digitalsignale in zwei Analog Eingänge von Arduino?

Ich denke, dass ich dann programmieren könnte, dass z.B 24V=1023?
So ich kann finde das Delta von die Signale durch programmierung, und dann programmieren

(Ich werde das Kode für Delta korriegieren, ich zeige jetzt nur die Idee)

if (Delta == 0 && time >=5000000UL) {
digitalWrite(13, HIGH); // turn the LED on
}
else {
digitalWrite(13, LOW); // turn the LED off
}

Was denkt ihr? Würde diese Lösung helfen oder funkionieren?

Vielen Dank wieder im Voraus!