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?
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"
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.
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?
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.
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.
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.
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.
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?
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.
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.
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.
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?
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.
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?
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.
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
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
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