Forum: Mikrocontroller und Digitale Elektronik Poti an Raspberry Pi oder Alternative?


von Dreh (Gast)


Lesenswert?

Ich hätte gerne einen "Knopf" zum Drehen am Raspi wie am Radio für die 
Lautstärke: Ein linker und ein rechter "Anschlag", also < 360 Grad und 
die gleiche "Lautstärke" beim der gleichen Radstellung.

Nun hat ja der Raspi keine analogen Eingänge (schade eigentlich) - sonst 
könnte ich einfach ein Drehpoti als Spannungsteiler setzen und den 
Abgriff messen. So werde ich jetzt einen externen ADC dazubasteln und 
das so machen - oder gibt es eine einfachere Lösung dafür?

Drehencoder scheinen mit nicht geeignet, denn wenn das Poti z.B. auf der 
Mitte steht, gibt es mir nach dem Einschalten ganz sicher wieder diesen 
Wert (mit dem ich ausgeschaltet habe) oder ich kann vor dem Enschalten 
leise drehen - mit dem Encoder nicht, oder? Alternativen?

von S. R. (svenska)


Lesenswert?

Du könntest einen Drehkondensator nehmen und die Kapazität messen. Das 
geht mit digitalen Pins (sofern sie Schmitt-Trigger-Verhalten haben), 
wie bei Touchsensoren: Beitrag "qtouch - sekt oder selters"

von c-hater (Gast)


Lesenswert?

Dreh schrieb:

> oder gibt es eine einfachere Lösung dafür?

Du kannst mit einem Kondensator, einem Widerstand und einem GPIO-Pin 
eine "ADC des kleinen Mannes" bauen.

Die dafür nötige Zeitmessung ist allerdings etwas problematisch in der 
Linux-Umgebung. Deswegen wirst du mit stark fehlerhaften Messwerten 
rechnen müssen. Also mehrfach messen und Ausreißer eleminieren. Erst 
dann Mittelwert der verbleibenden Messwerte bilden.

von Dreh (Gast)


Lesenswert?

c-hater schrieb:
> Du kannst mit einem Kondensator, einem Widerstand und einem GPIO-Pin
> eine "ADC des kleinen Mannes" bauen.

Das ist interessant! Würde ich gerne probieren . hast Du eine Schaltung 
oder einen Link zum Prinzip?

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Dreh schrieb:
> mit dem Encoder nicht, oder?

Du kannst dir mit einem Drehencoder bzw. mit einem Speicher an/in deinem 
Raspi jeden beliebigen Zustand merken oder herstellen, z.B.

[x] den letzten gehörten Lautstärkewert (entspricht deinem 
Poti-Verhalten)
[so macht es z.B. mein Autoradio, da gibt es auch nur Encoder]

[x] die Lautsärke steht beim Einschalten immer auf 20% (oder irgendwas 
andere "leises") und geht dann wenn du nicht am Encoder drehst nach 5 
Sekunden langsam in die vorherige Lautstärke über
[das verhindert, das einem gleich der Hut wegfliegt, wenn die vorherige 
Lautsärke 100% war, und du schaltest unbedacht ein]

oder sonstewelche Spielereien. Was du halt willst. Alles also, ws dein 
analoges Poti NICHT kann.

: Bearbeitet durch User
von Johannes S. (Gast)


Lesenswert?

Was ist so schlecht an einem ext. ADC?
Selbst ein überdimensionierter 16 Bit Wandler kostet nur 2-5€ als Modul, 
je nachdem wie schnell man den geliefert haben möchte.
http://www.netzmafia.de/skripten/hardware/RasPi/Projekt-ADS1115/index.html

von Peter D. (peda)


Lesenswert?

8 Bit sollten reichen, z.B. PCF8591.

von S. R. (svenska)


Lesenswert?

Dreh schrieb:
> Das ist interessant! Würde ich gerne probieren . hast Du eine Schaltung
> oder einen Link zum Prinzip?

Wenn du in den von mir verlinkten Thread guckst, dann siehst du einen 
Ansatz, wie man das machen kann.

Im Prinzip läuft das darauf hinaus, dass du einen entladenen Kondensator 
über die unbekannte Spannung so lange auflädst, bis er an einem 
digitalen Pin ein HIGH siehst. Je länger das dauert, desto kleiner war 
die unbekannte Spannung.

Oder du machst das über eine Ladungspumpe, bei der du eine bekannte 
Ladung (über einen zweiten kleinen Kondensator, den du immer wieder 
auflädst) in den Messkondensator pumpst, bis dessen Spannung groß genug 
ist.

Setzt halt voraus, dass die zu messende Spannung relativ lange stabil 
und belastbar genug ist, ist weder genau noch schnell, braucht dafür 
aber keine komplizierten Bauteile. Hier vollkommen ausreichend.

Billige China-Allwinner-Tablets nutzen einen "low resolution ADC" für 
die Erkennung der Tasten (Lautstärke, Ein-Aus). Würde mich nicht 
wundern, wenn das genau so eine Schaltung ist.

von Dreh (Gast)


Lesenswert?

S. R. schrieb:
> Im Prinzip läuft das darauf hinaus, dass du einen entladenen Kondensator
> über die unbekannte Spannung so lange auflädst, bis er an einem
> digitalen Pin ein HIGH siehst. Je länger das dauert, desto kleiner war
> die unbekannte Spannung.

Hmm.. wenn die unbekannte Spannung klein ist - wie soll der auf HIGH 
gehen ??

Ich hab das in den Thread nicht erkennen können, da ging es wohl auch 
eher um Spannnugsänderungen durch Touch.

von Wolfgang (Gast)


Lesenswert?

Dreh schrieb:
> Hmm.. wenn die unbekannte Spannung klein ist - wie soll der auf HIGH
> gehen ??

Indem du ihn auf VDD auflädst und zur unbekannten Spannung entlädst.

von Dreh (Gast)


Lesenswert?

Wolfgang schrieb:
> Indem du ihn auf VDD auflädst und zur unbekannten Spannung entlädst.

also sollte ich 2 Fälle unterscheiden? /wenn die unbekannte Spannung 
recht hoch ist, tut sich ja auch nichts..

Wie wäre die "Schaltung" hinter dem Poti-Abgriff?? So?
1
5V
2
|
3
R Poti
4
|
5
+-------+-- GPIO
6
|       |
7
R Poti  C
8
|       |
9
GND    GND

von S. R. (svenska)


Lesenswert?

Dreh schrieb:
> also sollte ich 2 Fälle unterscheiden? /wenn die
> unbekannte Spannung recht hoch ist, tut sich ja auch nichts..

Die unbekannte Spannung hängt davon ab, was du für ein Poti mit was für 
Festwiderständen verknotest. Es liegt an dir, geschickte Werte zu 
wählen.

Beitrag #6123166 wurde von einem Moderator gelöscht.
von Peter D. (peda)


Lesenswert?

Dreh schrieb:
> Wie wäre die "Schaltung" hinter dem Poti-Abgriff?

Kein Spannungsteiler.
Poti 10k in Reihe mit Widerstand 10k und damit einen Kondensator auf 
oder entladen. Die Zeit mit einem Captureinput messen.

von S. R. (svenska)


Lesenswert?

Dreh schrieb:
> Ich hab das in den Thread nicht erkennen können, da ging es wohl auch
> eher um Spannnugsänderungen durch Touch.

Da ging es um Kapazitätsänderungen durch Touch. Und die Kapazität wurde 
gemessen, indem durch Ladungstransfers in einen Kondensator dessen 
Spannung gezielt erhöht wurde - wobei die Anzahl der Ladungstransfers 
ein Maß für die Kapazität des Kondensators ist.

Das gleiche kannst du auch umgekehrt machen, indem du den Kondensator 
auf deine Wunschspannung auflädst und dann durch Ladungstransfers 
entlädst und die Anzahl der Ladungstransfers zählst. Die Kapazität ist 
bekannt, also ist die Spannung die Variable.

Ist halt eine indirekte Messung mit wenig externer Beschaltung und 
insbesondere ohne analoge Bauteile. Denn darum ging es hier ja (als 
Alternative dazu, einfach einen ADC anzuklemmen).

Nachtrag: Den Ansatz von Peter, einfach durchgängig zu laden und die 
Zeit zu messen, kann man natürlich auch verwenden.

: Bearbeitet durch User
von Dreh (Gast)


Lesenswert?

Peter D. schrieb:
> Poti 10k in Reihe mit Widerstand 10k und damit einen Kondensator auf
> oder entlade

Ich bin nicht sicher, ob ich es richtig verstanden habe - , also 
Schaltung so?

Raspi-Out---R_Poti---10k---Raspi-In---C---GND in Reihe?

Sollte doch klappen, wenn ich immer abwechselnd H und L setze und dann 
am Raspi_in die Zeit messe entweder bis am Eingang auch wieder H bzw. 
wieder L ist?

von c-hater (Gast)


Lesenswert?

Dreh schrieb:

> Ich bin nicht sicher, ob ich es richtig verstanden habe - , also
> Schaltung so?
>
> Raspi-Out---R_Poti---10k---Raspi-In---C---GND in Reihe?

Mal abgesehen von der katastrophalen Art, die Sache zu zeichnen: ja, das 
würde so funktionieren. Resourcensparender (weil nur ein GPIO) wäre 
aber:


Vcc o---*--
        |  |
        |  o
       ---/
       | |
       |/| P
       ---
        |
       ---
       | |
       | | R
       ---
        |
        *----o GPIO
        |
       ---
       --- C
        |
GND o---

Initialer Zustand: setze GPIO auf Ausgang mit Status aktiv Low. Dann 
warte einen kleinen Moment.

Das Schema der Messung ist: Starte Zeitmessung und schalte GPIO auf 
Eingang. Dann zyklisch (so schnell wie möglich) Status von GPIO 
bestimmen, wenn High, stoppe Zeitmessung. Zum Schluß wieder: schalte 
GPIO auf Ausgang (Status Low sollte er behalten haben).

Damit ist der Messzyklus beendet und die Auswertung der gemessenen Zeit 
kann erfolgen.

von Dreh (Gast)


Lesenswert?

c-hater schrieb:
> Mal abgesehen von der katastrophalen Art

Ok jetzt habe ich verstanden, wie s gemeint ist, und Deine Zeichnung ist 
vieeel schöner! :-)

Ich dachte 2 Pins wären besser, weil ja mit nur einem ein hoher Strom 
fließt im Ausschaltmoment (geladener Kondensator wird kurzgeschlossen) - 
wird der Raspi den vertragen?

von c-hater (Gast)


Lesenswert?

Dreh schrieb:

> Ich dachte 2 Pins wären besser, weil ja mit nur einem ein hoher Strom
> fließt im Ausschaltmoment (geladener Kondensator wird kurzgeschlossen) -
> wird der Raspi den vertragen?

Wenn du den Kondensator kapazitätsmäßig klein genug machst: ja, klar.

Wenn du ganz viel Angst hast, kannst du auch einen zusätzlichen 
Widerstand zwischen dem GPIO und dem Verbindungspunkt von C und R 
vorsehen. Dann musst du aber ggf. eine kleine Extra-Pause zwischen 
aufeinanderfolgenden Messzyklen einlegen.

von Delay me not (Gast)


Lesenswert?

Peter D. schrieb:
> 8 Bit sollten reichen, z.B. PCF8591.

Der hat auch gleich einen Kernel-Treiber, brauchst also auch kein 
eigenes Userspace-Tool dafür.

Ran an den i2c-Bus

Modul laden
# modprobe pcf8591 (input_mode=XXX)
(mit input_mode kannst du wählen:
        0 = four single ended inputs
        1 = three differential inputs
        2 = single ended and differential mixed
        3 = two differential inputs
Ungünstig, dass das global pro Modul und nicht pro instanz geht, aber 
meh.)


Instanziieren
echo "pcf8591 0x48" > /sys/bus/i2c/devices/i2c-X/new_device
(X=busnummer, 0x48 I²C-Adresse)

Nun gibt es einen neuen Ordner
/sys/bus/i2c/devices/X-Y
(X wieder busnummer, Y devicenummer)

darin
Dateien
in0_input, in1_input, in2_input, in3_input

Einfach lesen, per cat in der shell oder fopen, oder wie auch immer.
Gibt Wert 0..255


Details siehe:
https://www.kernel.org/doc/html/latest/hwmon/pcf8591.html

von Rainer V. (a_zip)


Lesenswert?

Warum nicht noch einmal den Drehencoder bedenken? Der gibt dir die Pulse 
und alles Andere machst du bequem in Software. Wurde ganz am Anfang ja 
schon beschrieben! Und ist bestimmt weniger Hexenwerk als die R-C-Lösung 
:-)
Gruß Rainer

von Peter D. (peda)


Lesenswert?

Rainer V. schrieb:
> Warum nicht noch einmal den Drehencoder bedenken?

Absolutgeber sind teurer als ein Poti:

https://de.rs-online.com/web/p/mechanische-drehgeber/2632918

von Rainer V. (a_zip)


Lesenswert?

Peter D. schrieb:
> Absolutgeber sind teurer als ein Poti:

ja, klar...sind aber auch zuverlässiger als Poti. Wäre mir hier wichtig. 
Immerhin wird kein HiFi-Verstärker gebaut :-)
Gruß Rainer

von Jochen (Gast)


Lesenswert?

Rainer V. schrieb:

> Warum nicht noch einmal den Drehencoder bedenken?

Wurde bereits erwähnt. Ist aber für den T0/die Bastler im Thread nichts.

von Rainer V. (a_zip)


Lesenswert?

na, wenn ihr meint...

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.