R3N3PDE
Posts: 19
Joined: Sat Mar 09, 2013 11:37 am

[Hife] [Python] Lenge eines GPIO Imput zählen

Sat Oct 26, 2013 8:39 pm

Kann mir wer Helfen und sagen wie ich am besten in Python die lenge eines Pins inputs messen kann.

Z.b. wenn ich ein Button Drücke soll python messen wie lange der impuls gedauert hat, und dann warten bis ein nächster impuls kommt.


Lg. R3N3PDE

User avatar
Hiswif
Posts: 664
Joined: Sat Oct 13, 2012 11:54 am
Contact: Website

Re: [Hife] [Python] Lenge eines GPIO Imput zählen

Sun Oct 27, 2013 7:13 pm

Heho,

um welche längen handelt es sich denn? Sekunden, minuten, millisekunden, mikrosekunden?

mfg

his
http://technikegge.blogspot.de

R3N3PDE
Posts: 19
Joined: Sat Mar 09, 2013 11:37 am

Re: [Hife] [Python] Lenge eines GPIO Imput zählen

Mon Oct 28, 2013 1:33 pm

milisekunden

User avatar
Hiswif
Posts: 664
Joined: Sat Oct 13, 2012 11:54 am
Contact: Website

Re: [Hife] [Python] Lenge eines GPIO Imput zählen

Tue Oct 29, 2013 4:49 am

Oje,

Das hatte ich befürchtet.
Schau mal bitte hier http://www.gtkdb.de/index_36_2272.html

Nicht wundern, das ist vom Prinzip her das selbe. Das Sonar gibt die Entfernung auch über die Länge des Impulses.

Ob das ganze auf dem Pi zuverlässig gemessen wird kann ich dir leider nicht beantworten. Ich könnte mir vorstellen das du Probleme bei solchen zeitkritischen Messungen bekommen könntest da es nunmal kein Echtzeit System ist.


Mfg

His
http://technikegge.blogspot.de

R3N3PDE
Posts: 19
Joined: Sat Mar 09, 2013 11:37 am

Re: [Hife] [Python] Lenge eines GPIO Imput zählen

Tue Oct 29, 2013 6:37 am

Danke ich werde es testen.
Der script den ich brauche darf ruhig ne Abweichung von plusminus 5 MS haben.

karlkiste
Posts: 189
Joined: Tue Jan 22, 2013 8:50 am
Location: berlin, germany

Re: [Hife] [Python] Lenge eines GPIO Imput zählen

Tue Oct 29, 2013 8:09 am

Ich hab leider keine Ahnung von python... Die Hardware kann Interrupts auslösen, wenn sich ein GPIO-Pin ändert. Prinzipiell sollte es also möglich sein, bei 700MHz Taktfrequenz (also ca. 1,5ns pro Takt) auf eine Mikrosekunde genau zu messen, auch ohne Echtzeit-Betriebssystem.

User avatar
mline
Posts: 1336
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: [Hife] [Python] Lenge eines GPIO Imput zählen

Sun Nov 03, 2013 8:58 am

Wie schnell eine Anwendung auf einen Interrupt reagiert hängt trotzdem von der CPU-Zeit anderer Anwendungen ab.
Ich würde einen Arduino einsetzen...
<~~>

ghp
Posts: 1420
Joined: Wed Jun 12, 2013 12:41 pm
Location: Stuttgart Germany
Contact: Website

Re: [Hife] [Python] Lenge eines GPIO Imput zählen

Sun Nov 03, 2013 3:23 pm

Hallo,

nachdem hier Mutmassungen angestellt werden, habe mal untersucht wie weit man mit Polling bei der Zeitmessung kommt.
Versuchsaufbau: Mit einem Arduino-Due ein Zeitsignal erzeugt, 20ms high und 180 ms low. Das an einen GPIO-Pin angelegt.
Diese Zeit mit einem Raspberry, raspbian, 900MHz, gemessen mit einer python-2.7-Anwendung.

Programmcode ist eine Schleife mit einer Wartezeit von 1ms, und in der Schleife werden die Übergänge high-low und low-high angewartet. Bei jedem Übergang die Zeiten bestimmt.
Diese Zeiten habe ich dann in nach zehntel-Millisekunden gruppiert und die Anzahlen aufsummiert.
Hier das Ergebnis:
auswertung.png
auswertung.png (7.24 KiB) Viewed 3875 times
Es ist deutlich, dass die 19 und 20ms stark vorhanden sind, aber es auch einige Ausreisser gibt.
Also gar nicht so schlecht für Polling.

Hier der Code

Code: Select all


import RPIO
import datetime
import time

RPIO.setup( 25, RPIO.IN)

times = []
indx = 0

START = 0
WAIT_HIGH = 1
WAIT_LOW = 2

state = START
indx = 0
times = []
for _ in range(0,1000):
    times.append(None)

while True:
    time.sleep(0.001)

    if state == START:
        inp = RPIO.input( 25 )
        if inp == 0:
            state = WAIT_HIGH
    
    if state == WAIT_HIGH:
        inp = RPIO.input( 25 )
        if inp == 1:
            state = WAIT_LOW
            t0 = datetime.datetime.now()

    if state == WAIT_LOW:
        inp = RPIO.input( 25 )
        if inp == 0:
            state = WAIT_HIGH
            t1 = datetime.datetime.now()
            td = t1 - t0
            # print td
            times[indx] = td
            indx += 1 
            if indx == 1000:
                break

for i in range(0, 1000):
    print(times[i])
Die Auswertung habe ich dann in einem Spreadsheet-Programm gemacht.
Also sind Zeiten um die 10ms noch einigermassen auch in python zu messen. Aber genaue Messungen würde ich erst bei etwa 100ms oder länger direkt mit den Raspberry durchführen.

Return to “Deutsch”