Hallo zusammen und zu Beginn erstmal frohe Weihnachten.
Ich versuche aktuell (erstmal in der Theorie) zwei Platinen miteinander
zu verbinden. Zum einen den Raspberry Pi mit seinen GPIO Pins und zum
anderen die ELV Lichtorgel 12V 3-Kanal (Schaltplan
www.hed-radio.com/pdf/bausatz/elv/Lichtorgel_12V_3-Kanal.pdf).
Nun möchte ich im Grunde folgendes erreichen: die Tiefen/Mitten/Höhen
möchte ich mit 3 Pins vom Raspberry Pi verbinden, sodass ich in einem
Programm z.B. alle 10 ms die Ports abfragen kann, ob diese gerade high
oder low sind.
Ich habe bereits nach Antworten zu meinen nun folgenden Fragen und
Problemen gesucht, war allerdings nicht wirklich fündig. Wahrscheinlich
dürften sich die Probleme aber für Fortgeschrittenere absolut trivial
anhören. Ich wäre daher schon dankbar, wenn man mich z.B. auf bestimmte
Suchbegriffe hinweist, mit denen ich die Antworten selber finden kann.
Für tiefergehende Antworten bin ich aber natürlich auch sehr dankbar :)
Generell erstmal zu meinen Problemen.
Die GPIO Pins des Raspberry Pi vertragen maximal 3,3V, die Lichtorgel
wird allerdings mit 12V betrieben. Weiterhin sind es auch
unterschiedliche Netzteile, sodass ich davon ausgehe, dass ich z.B. die
jeweiligen GND der Platinen nicht einfach so miteinander verbinden darf
(Potentialdifferenz).
Was mir spontan einfallen würde wäre jeweils 1 Relais für
Tiefen/Mitten/Höhen, das je an die 12V, GND von der Lichtorgel
angeschlossen wird (Steuerspannung) und dann noch an einen GPIO Pin +
GND vom Raspberry, sodass der GPIO Pin auf Ground gezogen wird. Ich kann
mir allerdings nicht vorstellen, dass dies eine elegante Lösung ist.
"Perfekt" wäre, wenn es etwas gibt, was sich mit meinen aktuellen
Bauteilen herstellen lassen würde (Kombination von BC 547, BC 557, BC
337, Widerständen, Kondensatoren, wenn nötig 1N 4004, 1N 4148, Zener
3,3V). Gibt es vielleicht jemanden, der eine Idee hätte oder mir Tipps
geben könnte?
Weiterhin: Es gibt für 3,3V die Logikpegel high (2,0 - 3,3V), low (0,0 -
0,8V) und undefiniert. Ich könnte mir vorstellen, dass je nach
Abfrageintervall die Eingangspegel meist undefiniert sein könnten. Würde
da eventuell ein Analog/Digital-Wandler wie z.B. der MCP3008
(http://de.farnell.com/microchip/mcp3008-i-p/10bit-adc-2-7v-8ch-spi-16dip/dp/1627174)
eher Sinn machen? Hier bin ich allerdings auch unsicher, wie ich die
Daten im Datenblatt zu verstehen habe. Der IC hat Vdd, Vref, Agnd, Dgnd.
Mal angenommen der IC würde 12 Volt vertragen, könnte ich dann Vdd und
Dgnd mit dem Raspberry Pi und Vref und Agnd mit der Lichtorgel
verbinden? Leider kann ich aus dem Datenblatt auch nicht herauslesen,
wie hoch Vref überhaupt sein darf. Lediglich der Satz "The MCP3004/3008
devices operate over a broad voltage range (2.7V - 5.5V)." lässt mich
vermuten, dass Vref maximal 5.5V sein darf. Wo kann ich aus dem
Datenblatt das maximale Vref herauslesen?
Ich hoffe, ich habe die Fragen zumindest halbwegs verständlich gestellt.
Sollte sich jemand nicht mit dem Raspberry Pi auskennen, darf gerne
davon ausgegangen werden, dass ich die Lichtorgel mit einem AVR µC
auslesen möchte :)
Schon mal vielen Dank für das Durchlesen!
Marc
Hallo Marc,
wie Dein Titel schon sagt, möchtest Du analoge Signale verarbeiten. Der
Raspberry ist aber ein digitales Teil und versteht nur digitale Signale.
Deshalb musst Du natürlich eine A/D-Wandlung vornehmen.
Schau mal bei Erik Bartmann (www.erik-bartmann.de) nach. Da findest Du
wunderbare Tutorials über alle möglichen Dinge, u.a. auch über den A/D
Wandler MCP3008 und den Anschluss an den Raspberry.
Hier der Link:
http://www.erik-bartmann.de/programmierung/downloads2.html?task=files.download&cid=31
Außerdem kann ich sein Buch über Raspberry nur empfehlen.
Vref kann maximal 0,5 V über der Versorgungsspannung liegen, also bei
den max. erlaubten 5V Vdd sind das 5,5 V. Dein analoges Eingangssignal
musst Du über einen Spannungsteiler von 12 V auf die maximal mögliche
Eingangsspannung von 5 V des MCP3008 herunterteilen.
Lies Dir mal das obige Tutorial durch. Programm-Beispiele für den
Raspberry zum Auslesen des MCP3008 gibt es auch dort.
Frohe Weihnachten
Horst
Tach Tar,
Die Ausgänge der Lichtorgel sind genauso "digital" wie die pins deines
Prozessors. Der MOSFET wird entweder eingeschaltet oder ausgeschaltet.
Einzig die Spannung ist unterschiedlich.
> Weiterhin: Es gibt für 3,3V die Logikpegel high (2,0 - 3,3V), low (0,0 -> 0,8V) und undefiniert.
Du möchtest am rasp eine Spannung von 0-0,8V und 2-3,3V haben. Der
Ausgang deiner Lichtorgel zeigt dir aber irgend was um 0V und 12V. Das
lässt sich schnell mit einem Spannungsteiler korregieren. Siehe dazu den
Artikel Spannungsteiler.
> Ich könnte mir vorstellen, dass je nach Abfrageintervall die> Eingangspegel meist undefiniert sein könnten. Würde> da eventuell ein Analog/Digital-Wandler wie z.B. der MCP3008> (http://de.farnell.com/microchip/mcp3008-i-p/10bit-...)> eher Sinn machen?
Den ersten Satz verstehe ich nicht komplett. Wie oben beschrieben gibt
es bei der Lichtorgel nur an oder aus. Es findet natürlich ein Übergang
zwischen den beiden Stadien statt der sich "schalten" nennt statt. Für
einen mehr oder weniger kurzen Moment befindet sich daher die SPannung
im undefinierten Bereicht. Für genau solche Fälle hat ein µC EIngang
aber schmidttrigger.
Kurz erklährt: Der von denem Programm gelesene "Wert" deines pins bleibt
bei einem undefinierten Eingangssignal so lange auf dem letzten
gemessenen Wert bis das Eingangssignal wieder in den definierten
Bereicht zurück kehrt. Dafür brauchst du keinen ADC.
> Die GPIO Pins des Raspberry Pi vertragen maximal 3,3V, die Lichtorgel> wird allerdings mit 12V betrieben.
S.o.
> Weiterhin sind es auch unterschiedliche Netzteile, sodass ich davon> ausgehe, dass ich z.B. die jeweiligen GND der Platinen nicht einfach so> miteinander verbinden darf (Potentialdifferenz).
Nun, ein Potential entsteht nicht einfach aus dem Nichts. Hast du
bereits irgend welche Kabel von der Lichtorgel zum rasp gezogen? Das
wäre ein Potential.
Ein wichtiger Aspekt ist noch die Erde. Viele Netzteile haben die lokale
Masse verbunden mit der Erde. Bei rasp wird das ganz sich so sein, denn
der Schirm des Netzwerkkabels ist immer geerdet und auch jeder PC ist
geerdet(5V USB Stromversorgung).
Das macht aber nichts, denn du möchtest ja sowieso nur die Massen
verbinden. Die haben keinen Potentialunterschied.
Thor
Hi zusammen und erstmal vielen Dank für die Antworten :)
Leider bin ich in den letzten Tagen nicht dazu gekommen, hier zu
antworten.
@ hgrucho
Das Tutorial von Erik Bartmann hatte ich bereits gefunden und den
MCP3008 auf meine Einkaufsliste gesetzt. Da die Bestellung heute
angekommen ist, werde ich die nächsten Tage mal genauer schauen.
"Dein analoges Eingangssignal musst Du über einen Spannungsteiler von 12
V auf die maximal mögliche Eingangsspannung von 5 V des MCP3008
herunterteilen."
Den Artikel über den Spannungsteiler hatte ich 5 Minuten nach meinem
Post hier gefunden, wusste aber nicht genau, ob das die beste
Möglichkeit ist. Scheinbar ist die Verwendung eines Spannungsteilers
aber die beste/einfachste Möglichkeit :)
@ Alex S.
Genau den Artikel bezüglich Spannungsteiler hatte ich gefunden :)
"Kurz erklährt: Der von denem Programm gelesene "Wert" deines pins
bleibt
bei einem undefinierten Eingangssignal so lange auf dem letzten
gemessenen Wert bis das Eingangssignal wieder in den definierten
Bereicht zurück kehrt. Dafür brauchst du keinen ADC."
Das wusste ich nicht. Ich hatte die Befürchtung, dass wenn ich in einem
undefinierten Zustand auslesen möchte, ich falsche Werte zurückgeliefert
bekomme. Aber wenn ich immer nur definierte Werte bekomme (eben 0 oder
1), ist alles perfekt. Ich bin mir allerdings noch nicht sicher, ob ich
das nicht doch mit einem A/D Wandler kombiniere, auch wenn er im Grunde
nicht nötig ist.
"Nun, ein Potential entsteht nicht einfach aus dem Nichts. Hast du
bereits irgend welche Kabel von der Lichtorgel zum rasp gezogen? Das
wäre ein Potential."
Nein, bis jetzt gibt es noch garnichts. Allerdings habe ich mir ein
Netzteil bestellt, welches 5V und 12V liefert und da ist dann ein Common
Ground dabei. Das Problem hat sich daher auch gelöst :)
Nochmal vielen Dank an Euch für die Antworten!
Wenn du Logiksignale auf einer höheren Spannung als die 3.3V hast, ist
eine einfache und sichere Methode, die mit dem Raspberry Pi zu verbinden
ein Optokoppler. Für 3 Pins kostet das etwa 50 Cent und ist in jedem
lokalen Elektronikladen erhältlich. ;)
Im Gegensatz zu einem Spannungsteiler hat das den Vorteil, dass das Pi
hervorragend vor Überspannungen geschützt ist, selbst wenn die
Gegenseite mal mehr als 12 Volt liefert (solange keine Blitze
überspringen, passiert dem Pi selbst bei 1000 Volt nix, nur der
Optokoppler schmilzt halt).
Ich mache das jedenfalls auch so und es funktioniert prima.
AD-Wandler für Logikpegel geht sicher auch, ist aber irgendwie
unelegant.
Danke für die Info :)
Da ich morgen eh nochmal kurz bei Conrad vorbei müsste, wäre das halb so
wild, noch ein paar Bauteile mitzunehmen. Wenn ich also
http://www.mikrocontroller.net/articles/Optokoppler "richtig" verstanden
habe, könnte ich bereits die dort angegebenen 4N32 oder 4N33 Optokoppler
nehmen, U_Ein mit der 12V Lichtorgel verbinden (natürlich mit
entsprechendem Widerstand) und an der anderen Seite die 3,3V, GND und an
U-Aus noch ein Widerstand mit Verbindung zu Ground?
Da kannst du so gut wie jeden Optokopler nehmen, auch CNY17 oder so was
geht. Behandle den Eingang des Optokopplers wie eine LED, d.h., du
benötigst auf jeden Fall Vorwiderstände. Bei 12 Volt am Eingang und 15mA
Strom durch die LED wären das also Widerstände mit ca. 700 Ohm, der
nächste Normwert ist 680 Ohm.
Auf der Raspberry Seite (die mit dem Phototransistor) benötigst du einen
Arbeitswiderstand im Kollektorkreis als sogen. Pullup. Nimm das was
zwischen 1k bis 3k3 zwischen Kollektor des OK und den +3,3 Volt des RPi.
Der Emitter des OK kommt dann an Masse. Am Kollektor steht das
Ausgangsignal. Invertierte Logik, beachte das beim Treiber schreiben.
Nochmal hi zusammen und erstmal frohes Neues,
ich hoffe, ich bekomme nochmal ein wenig Hilfe, da ich noch etwas
Probleme bei den Datenblättern (korrekte Angaben finden) und der
Berechnung der Widerstände habe.
Im Grunde (nochmal kurz zusammengefasst) folgende Ausgangssituation:
Ein digitales Signal von 12 Volt soll mittels Optokoppler an einen
Microcontroller mit 5 Volt geleitet werden (ich habe die Schaltung noch
etwas geändert, daher jetzt nicht mehr 3,3V).
Dazu möchte ich den Optokoppler 4N28 verwenden.
Was ich also als Erstes mache ist mir den Vorwiderstand für die LED des
Optokoppler am 12 Volt Strang zu suchen. Dazu schaue ich in das
Datenblatt und finde "typical Vf = 1,25 Volt". Was mich allerdings
stutzig macht ist, dass dort If mit 50mA (und unter MAX mit 60mA)
angegeben ist, was ich doch recht hoch finde. Im Testcircuit (Figure 2)
auf der nächsten Seite ist If = 10mA. Für mich als Anfänger stellt sich
nun die Frage, welchen Wert für If ich nun nutzen soll. Gelesen habe ich
aber "Wenn man die LED jedoch deutlich unter dem Nennstrom betreibt (50%
und weniger), ...", sodass ich persönlich jetzt einen Wert von 25mA
nutzen würde. Ist das eine falsche Annahme?
Bei 1,25V Durchlassspannung, 12V Betriebsspannung und 25mA Strom erhalte
ich dann 430 Ohm, ergo 470 Ohm. Sollte ich hier bereits Fehler gemacht
haben, gerne Bescheid sagen :)
Nun zum Arbeitswiderstand.
Laut Empfehlung von Matthias Sch. soll ich am Kollektor einen PullUp
Widerstand anbringen. Laut
http://www.mikrocontroller.net/articles/Optokoppler wäre dies die
"Invertierung am Ausgang" Schaltung. Was ich mich direkt zu Beginn
frage: warum ist diese Schaltung besser geeignet als die
nichtinvertierende Schaltung ganz links?
Um den Arbeitswiderstand zu berechnen nutze ich die Formel auf der
Wiki-Seite:
Vcc = 5V
Sf = 2 (da ich If = 25mA nutze statt 50mA)
Iled = 0,025A
CTR = 0,1
ergibt 4000 Ohm, also 3,9k Widerstand?
Sehe ich das auch richtig, dass die Basis an Port 6 garnicht
angeschlossen wird?
Ich wäre sehr froh, wenn sich jemand meinen längeren Text durchlesen
würde und mir sagen könnte, ob ich die Berechnungen richtig gemacht habe
oder wo meine Fehler liegen :)
Schonmal vielen Dank!
Bis dann,
Marc
Dein LED Vorwiderstand ist richtig.
Den pullup kannst du idR per Daumen dimensionieren. So hoch wie möglich
so niedrig wie nötig. Wenn du auf 4k raus kommst kannst du auch 10k
nehmen. Es geht hier primär um die Schaltzeiten und den lowpegel.
Solange du keine riesen Kapazitäten an den Kollektor hängst oder starke
Funkstörungen in der Umgebung hast kannst du auch locker hoch
dimensionieren.
Thor