Auslesen eines Widerstands über Pyserial

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Rewan
User
Beiträge: 3
Registriert: Freitag 3. Juni 2011, 19:45

Hallo,

ich möchte für ein Schulprojekt mit Pyserial über eine serielle Schnittstelle einen Widerstand auslesen(einen Fotowiderstand). Bis jetzt konnte ich mit getCTS() nur auslesen, ob ein Widerstand vorhanden ist oder nicht. Möchte jedoch den ohm'schenWiderstand erfahren. Ist es möglich, dies mit Pyserial zu umzusetzen.


Im Vorraus Vielen Dank!


MfG Rewan
BlackJack

@Rewan: Dazu müsstest Du wohl ausserhalb des Rechners einen analogen Wert in einen Digitalen umwandeln. Und den dann seriell zum Rechner übertragen. Ich kann mich irren, aber das klingt als bräuchtest Du ausserhalb des Rechners ”Intelligenz”. Wenn es das nicht schon in einem spezialisierten Chip gibt, klingt das nach dem Einsatz eines Mikroprozessors.
marlob
User
Beiträge: 51
Registriert: Mittwoch 23. August 2006, 20:13

http://www.muenster.de/~m-frost/beisp-c.html

Du müsstest dann nur dein Programm nach Python umsetzen
gruss
marlob
-------------------------------------
Linux Mint 17 + Python 2.7.6
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

marlob hat geschrieben:http://www.muenster.de/~m-frost/beisp-c.html

Du müsstest dann nur dein Programm nach Python umsetzen
Lol, da haste ja was ausgegraben... Im PASCAL-Skript steht was von 386er DX25 und DOS 6.0, passend dazu die alte PLZ von Münster. Okay, die Seite selbst wurde 2003 zuletzt geändert. Aber jetzt mal ernsthaft: Was auf dieser Webseite soll dem Fragesteller jetzt eigentlich bei seinem Problem helfen? Hilfreicher wäre es doch IMHO erstmal zu wissen, was für Hardware überhaupt gemessen werden soll, bevor man einfach so ins Blaue rät.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@snafu: Naja, die grundlegende Idee ist ja evtl. bereits eine Hilfe! Ich hätte jetzt auch gedacht, man bräuchte da einen AD-Wandler; die Idee mit dem Kondensator ist ziemlich simpel und hilft dem OP ja vielleicht schon weiter.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@snafu: Die Elektronik hat sich die letzten Jahrzehnte da nicht so stark verändert. Und die serielle Schnittstelle funktioniert auch immer noch wie zu DOS-Zeiten.
Rewan
User
Beiträge: 3
Registriert: Freitag 3. Juni 2011, 19:45

Erstmal Danke für die Antworten
Konnte leider nicht früher antworten.

Ich hab mir jetzt ein 10 kOhm Poti und nen 1 μF Kondensator zum ausprobieren zugelegt.

Könnte ihr mir ein bischen helfen den Code in Python zu portieren. Im Grundlegendem verstehe ich es aber bei ein Paar (<-)
Stellen bin ich überfordert.

Code: Alles auswählen

USES CRT;
CONST COM = $2F8;

PROCEDURE Messung;
VAR Zaehler : WORD;
BEGIN
  Zaehler := 0;
  InLine($FA);                           (* Interrupts sperren *)<-
  Port[COM+4] := 1;                      (* DTR an             *)
  REPEAT
    INC(Zaehler);
  UNTIL ((Port[COM+6] AND 16) = 16 );    (* bis CTS an         *) <-
  PORT[COM+4] := 0;                      (* DTR aus            *)
  Delay(10);
  InLine ($FB);                          (* Interrupts erlauben *)
  WriteLn('Widerstand des Potis : ',10/60*(Zaehler-195):6:2,' kOhm');
  WriteLn('Zählerstand          : ',Zaehler:6);
END;

BEGIN                  (* Hauptprogramm *)
   ClrScr;
   WriteLn('W I D E R S T A N D S M E S S U N G');
   REPEAT
     GotoXY(1,4);; <-
     Messung;
     Delay(100);
   UNTIL KeyPressed;
END.

MfG Rewan
deets

Wie waere es, wenn du mal einfach mit python draufloslegst, und dann helfen wir dir da bei Problemen?

Das GotoXY ist im uebrigen nix anderes als eine Cursor-Positionierungs-Funktion. Das ist fuer dein Problem voellig irrelevant, und kann ignoriert werden. Macht nur die Ausgabe "schoener".
Rewan
User
Beiträge: 3
Registriert: Freitag 3. Juni 2011, 19:45

Ich habe es jetzt geschaft, dass ich mit Python Werte bekomme, die vom Widerstand abhängig/ proportional sind.

Code: Alles auswählen

import pyserial
s = serial.Serial(0)
a = 1
s.setRTS(1)
while True:
      a = a + 1
        
      if s.getCTS() is True:
            s.setRTS(0)
            break
print (a)
Das ganze ist aber von der Prozessorauslastung abhängig.
Bei dem BeispielCode ist das, wenn ich mich nicht täusche mit " InLine($FA); (* Interrupts sperren *)" und " InLine ($FB); (* Interrupts erlauben *)" gelöst. Gibt es eine Möglichkeit die Werte von der Auslastung unabhängig zu machen?
deets

Ja, indem du ein real-time-OS verwendest. Unter Linux zB RTAI. Fuer Windows wird das ne Stange Geld kosten. Mehr, als einfach nen Arduino zu nehmen + dessen AD-Wandler zu benutzen.
BlackJack

@Rewan: Ich denke im Beispiel ist das eher dadurch gelöst, dass es ein Pascal-Programm für DOS ist und dort früher a) immer nur ein Programm lief und b) es noch keine Prozessoren gab, die ihre Arbeitsgeschwindigkeit selbstständig im Betrieb veränderten. Also mit anderen Worten: Es wird in dem Programm gar nicht gelöst. ;-)

Statt einen Zähler zu verwenden, könntest Du die Zeit messen, die verstrichen ist. Siehe `time.time()` und `time.clock()` sowie die Bemerkungen zu Betriebssystemen in der Dokumentation zu den beiden Funktionen.
deets

@BlackJack

Das ist sicher besser als was er hat (ich muss gestehen ich hab' noch nicht mal geschaut *wie* er die Zeit misst..). Aber egal was er macht, er wird um Jitter durch Systemlast & mangelnde zeitliche Aufloesung bei den system-clock-calls nicht rumkommen.

Also muss er entweder seine Zeitbasis sauber bekommen - real-time - oder den Kondensator so gross machen, dass der Ladevorgang lange genug dauert, so dass er bezueglich dieser Schwankungen unempfindlich wird. Das waere dann aber eher so im Sekunden-Bereich.

Ich denke, als Experiment ist das ganze ulkig, aber wenn diese Messdaten irgendwie die Realitaet abbilden muessen, dann sollte er da mit dedizierter Hardware ran.
Antworten