Poti an Raspberry Pi oder Alternative?

Gast #6121470
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?
Gast #6121515
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.
#6121662
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.
#6121751
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.
Gast #6122897
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.
Gast #6122957
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
Beitrag #6123166 wurde von einem Moderator gelöscht.
#6123191
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.
Gast #6123302
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?
Gast #6123776
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.
Gast #6123789
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?
Gast #6123799
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.
Gast #6124415
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren