Forum: Mikrocontroller und Digitale Elektronik Einlesen von analogen Daten mittels Raspberry Pi/µC


von Tar (Gast)


Lesenswert?

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

von hgrucho (Gast)


Lesenswert?

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

von Alex S. (thor368)


Lesenswert?

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

von Tar (Gast)


Lesenswert?

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!

von Sven B. (scummos)


Lesenswert?

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.

von Tar (Gast)


Lesenswert?

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?

von Tar (Gast)


Lesenswert?

Kurz ein Nachtrag ... Conrad hat nur 4N28, aber die sollten ja im Grunde 
auch gehen. Oder wären andere Optokoppler empfehlenswerter?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Tar (Gast)


Lesenswert?

Vielen Dank für die Erklärung :)

von Tar (Gast)


Lesenswert?

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

von Alex S. (thor368)


Lesenswert?

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

von Tar (Gast)


Lesenswert?

Vielen Dank für die Antwort!

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.