berührungsloses messen

L I V E Stammtisch ab 20:30 Uhr im Chat
  • [font="Arial"]Hallo,[/font]
    [font="Arial"]weil mein Vorhaben, doch nicht so funktioniert, wie ich mir das vorgestellt habe, erlaube mir das Projekt hier - Euch vorzustellen, in der Hoffnung, dass jemand die Zeit und Lust findet, mir hier paar Tipps / Rat zu geben, und dem entsprechen das Projekt vervollständigt / abschließt. [/font]
    [font="Arial"] [/font]
    [font="Arial"]Es handelt sich um berührungsloses messen. [/font]
    [font="Arial"]Wie aus meinem Bild zu entnehmen ist, es bewegen sich (von Rechts nach Links - grünes Pfeil) Gegenstände, denen ich die Länge gerne messen möchte. Die Geschwindigkeit ist relativ Konstant, wird also angenommen, dass die bei der gesamte Messung gleich ist.[/font]
    [font="Arial"]Es ist ein Band welcher mit einem Elektromotor (Motor mit Getriebe) angetrieben ist, und hat einen Tempo von ca. 0,3 m/sek. Also ziemlich langsam.[/font]
    [font="Arial"] [/font]
    [font="Arial"]hintergrund1kgjwx.jpg [/font]
    [font="Arial"] [/font]
    [font="Arial"]Abgetestet wird mit 3 Fotozellen. Die Messung ist auf 3 Phasen verteilt.[/font]
    [font="Arial"]1) Phase1[/font]
    [font="Arial"]Die (Positive - also) H- Flanke der Fotozell1 macht einen (Start) Zeitstempel oder fängt an Impulse zu zählen.[/font]
    [font="Arial"]Die H- Flanke der Fotozell3 ist erstmal außer acht. Allgemein -> Messung_100mm_Start.[/font]
    [font="Arial"] [/font]
    [font="Arial"]2) Phase2[/font]
    [font="Arial"]Die H- Flanke der Fotozell2 macht einen (Stop) Zeitstempel oder speichert generierte bis zu dem Zeitpunkt Impulse. Allgemein -> Messung_100mm_Stop.[/font]
    [font="Arial"] [/font]
    [font="Arial"]3) Phase3[/font]
    [font="Arial"]Die L- Flanke (Negative Flanke) der Fotozell3 macht einen (Gesamt) Zeitstempel oder speichert generierte bis zu diesem Zeitpunkt Impulse. Allgemein -> Messung_Gesamt_Stop[/font]
    [font="Arial"]Das war's. Wie soll dass Funktionieren (Messen)?[/font]
    [font="Arial"] [/font]
    [font="Arial"]Beschreibung[/font]
    [font="Arial"]Die Fotozelle1 ist in exakt 100mm! von der Fotozelle2 entfern.[/font]
    [font="Arial"]Somit wird eine Zeit oder Impuls- Referenz auf exakt 100 mm erschafft.[/font]
    [font="Arial"](Allgemein -> Messung_100mm_Stop - Messung_100mm_Start)[/font]
    [font="Arial"]Auf eine 100mm Strecke wird genau XXX Zeit vergehen, oder XXX Impulsen generiert.[/font]
    [font="Arial"]Die Gesamte Zeit oder gesamte Impulsmenge wird durch die L- Flanke der Fotozelle3 registriert. Das war's.[/font]
    [font="Arial"] [/font]
    [font="Arial"]Entscheiden ist das Algorithmus: (Wie dass alles so funktionieren / Messen soll.)[/font]
    [font="Arial"] [/font]
    [font="Arial"]- gewonnene zwischen den Messung_100mm_Start und Messung_100mm_Stop Zeit oder Impulsmenge -> (genauer gesagt eine Differenz dazwischen) dient als Referenz auf eine exakt 100mm langen Strecken. Z.B.: es wurden (nehme ich die Zeit) 234 Impulse generiert.[/font]
    [font="Arial"]100 mm geteilt durch 234 = 0,4273 ....[/font]
    [font="Arial"]Die Zahl 0,4273 repräsentiert mit sich ein 1mm Faktor. [/font]
    [font="Arial"]- Ganze (Total) Impulsen- zeit geteilt durch den Referenz wert soll die Gesamte Länge ermitteln.[/font]
    [font="Arial"]ACHTUNG[/font]
    [font="Arial"]Klar es ist die Geschwindigkeit nicht aus der Acht zu nehmen. Die Geschwindigkeit ist kann man sagen Konstant! (ca. 0,3 m/sek.)[/font]
    [font="Arial"] [/font]
    [font="Arial"]Allgemein:[/font]
    [font="Arial"]100mm Referenz = Messung_100mm_Stop - Messung_100mm_Start [/font]
    [font="Arial"]Länge = Total / 100mm Referenz[/font]
    [font="Arial"] [/font]
    [font="Arial"]Die Berechnungsformel habe ich damals (aus Verzweiflung und für auf Sicher zu gehen) mit Mathematikern (Mathe- Forum) konsultiert. Es soll Funzen - kein Logikfehler.[/font]
    [font="Arial"] [/font]
    [font="Arial"]Damals habe ich es mit JControl versucht - das Gerät war dafür zu träge. Bei Home- PC ist die USB- Schnittstelle dafür zu lahm, und an die Parallele- Schnittstelle wagte ich mich nicht.[/font]
    [font="Arial"]CODE

    Python
    import RPi.GPIO as GPIO[/font][/size][size=12]import time[/size][size=12]from datetime import datetime[/size][size=12]GPIO.setmode(GPIO.BCM)[/size][size=12]# Fotozele1 ... t1_Start [/size][size=12]GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)[/size][size=12]# Fotozele2 ... t1_Stop[/size][size=12]GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP)[/size][size=12]# Fotozele3 ... t_Total ... Stop[/size][size=12]GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_UP)[/size][size=12] [/size][size=12]# Generator Input[/size][size=12]GPIO.setup(25, GPIO.IN)[/size][size=12]# Variablen [/size][size=12]counter = 0[/size][size=12]t1_Start = 0[/size][size=12]t1_Stop = 0[/size][size=12]t_Total = 0[/size][size=12]result = 0[/size][size=12]#measure = True[/size][size=12]# Die <code>myCounter(callback)</code> Funktion zählt externe Impulse aus einem PWM- Generator[/size][size=12]# Aktuelle Frequenz 100 Hz[/size][size=12]# Parameter - interrupt callback[/size][size=12]# Rückgabe -> gezählte Impulse[/size][size=12]def myCounter(callback):[/size][size=12]    global counter[/size][size=12]    counter +=1[/size][size=12]    return counter[/size][size=12]# Die <code>t100_Start(callback)</code> Funktion registriert einen Start- timestamp value[/size][size=12]# Die Impulse kommen aus der Fotozele1[/size][size=12]# Parameter - interrupt callback[/size][size=12]def t100_Start(callback):[/size][size=12]    global counter, t1_Start [/size][size=12]    #t1_Start = myCounter(counter)[/size][size=12]    t1_Start = time.time()[/size][size=12]    #t1_Start = datetime.now()[/size][size=12]    #t1_Start = t1_Start.microsecond[/size][size=12]# Die <code>t100_Stop(callback)</code> Funktion registriert einen Stop- timestamp value[/size][size=12]# Die Impulse kommen aus der Fotozele2[/size][size=12]# Parameter - interrupt callback[/size][size=12]def t100_Stop(callback):[/size][size=12]    global counter, t1_Stop[/size][size=12]    #t1_Stop = myCounter(counter)[/size][size=12]    t1_Stop = time.time()[/size][size=12]    #t1_Stop = datetime.now()[/size][size=12]    #t1_Stop = t1_Stop.microsecond[/size][size=12]# Die <code>t_Total(callback)</code> Funktion registriert einen Total- timestamp value[/size][size=12]# Die Impulse kommen aus der Fotozele3[/size][size=12]# Parameter - interrupt callback[/size][size=12]def t_Total(callback):[/size][size=12]    global counter, t_Total[/size][size=12]    #t_Total = myCounter(counter)[/size][size=12]    t_Total = time.time()[/size][size=12]    #t_Total = datetime.now()[/size][size=12]    #t_Total = t_Total.microsecond[/size][size=12]    calculate(t_Total)[/size][size=12]# Die <code>calculate(t_Total)</code> Funktion rechnet die Gesamte Länge aus[/size][size=12]# und zeigt den Ergebnis an der Konsole[/size][size=12]# Parameter - Total- timestamp value. (Es sind die gesamt generierten Impulse, oder die Gesamtzeit) [/size][size=12]def calculate(t_Total):[/size][size=12]    global result, t_pulsesFactor[/size][size=12]    [/size][size=12]    # eigentlich eine Temporäre Variable, welche einen Faktor zwischenspeichern soll[/size][size=12]    # damit ich den Wert der Variablen auch reseten (auf null setzten) kann - global[/size][size=12]    t_pulsesFactor  = 100 / (t1_Stop - t1_Start)[/size][size=12]    # Berechnung und Konsolenausgabe der Länge[/size][size=12]    result = (t_Total - t1_Start ) * t_pulsesFactor[/size][size=12]    print("Messung = %4.2f" % (result))[/size][size=12]    # Resset[/size][size=12]    reset(t_Total)[/size][size=12]# Die <code>reset(t_Total)</code> Funktion setzt alle Variablen wieder auf nul / 0. Also Reset[/size][size=12]# Parameter - Total (wird durch den Code geschleppt - ist aber auch ?global)[/size][size=12]def reset(t_Total):[/size][size=12]    global counter, t1_Start, t_pulsesFactor, t1_Stop, result  [/size][size=12]    counter = 0[/size][size=12]    t1_Start = 0[/size][size=12]    t1_Stop = 0[/size][size=12]    t_Total =0[/size][size=12]    t_pulsesFactor = 0[/size][size=12]    result = 0[/size][size=12]GPIO.add_event_detect(17, GPIO.FALLING, callback = t100_Start, bouncetime=120)[/size][size=12]# Sollte der Externe Generator als Impulsquelle ausgewählt sein, [/size][size=12]# so sendet er kontinuierlich seine PWM Impulse an den GPIO- Port25. Nach dem das Script beenden wird, [/size][size=12]# werden noch restimpulse registriert. Die try soll die rechtlichen pipe´s abfangen, [/size][size=12]# damit das System keine Fehlermeldungen generiert, - funktioniert aber auch nicht so doll [/size][size=12]try:[/size][size=12]    GPIO.add_event_detect(25, GPIO.FALLING, callback = myCounter)[/size][size=12]except IOError as e:[/size][size=12]    pass[/size][size=12]GPIO.add_event_detect(22, GPIO.FALLING, callback = t100_Stop, bouncetime=120)[/size][size=12]GPIO.add_event_detect(27, GPIO.FALLING, callback = t_Total, bouncetime=120)[/size][size=12]while True:[/size][size=12]    time.sleep(2)[/size][size=12]# Sorgt für "Sauberes" beenden des Scriptes[/size][size=12]try:[/size][size=12]    # reset GPIO wenn Ctrl+C Taste gedrückt[/size][size=12]    time.sleep(100)[/size][size=12]except KeyboardInterrupt:[/size][size=12]    print("Script angehaltet")    [/size][size=12]    GPIO.cleanup()[/size][size=12][font="Arial"]

    [/font][/size]


    [font="Arial"]Schließlich habe gedacht dass es mit RPI endlich "klappt". Leider immer noch nicht.[/font]
    [font="Arial"]Für Tipps und Rat werde ich mich sehr freuen. Wie aus dem Code zu entnehmen ist, habe 3 Versuche getestet:[/font]
    [font="Arial"]1- mit meinem PWM Generator (<code>t1_Start = myCounter(counter)</code>)[/font]
    [font="Arial"]2- mit dem Time Objekt (<code>t1_Start = time.time()</code>)[/font]
    [font="Arial"]3- wie auch mit dem Datetime Objekt (<code>t1_Start = datetime.now()</code>)[/font]
    [font="Arial"]Die beste Resultate habe ich mit dem Time Objekt bekommen. Die Messungen waren sogar mehr als 10mm verfälscht. Für Tipps werde ich mich sehr freuen.[/font]
    [font="Arial"] [/font]
    [font="Arial"]Schöne Grüße [/font]
    [font="Arial"]Georg [/font]

    PS.
    Das Code wird komisch formatiert - bekomme nicht hin ohne HTML- tags ???


    [code=php]import RPi.GPIO as GPIO
    import time
    from datetime import datetime

    GPIO.setmode(GPIO.BCM)

    # Fotozele1 ... t1_Start
    GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    # Fotozele2 ... t1_Stop
    GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    # Fotozele3 ... t_Total ... Stop
    GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_UP)

    # Generator Input
    GPIO.setup(25, GPIO.IN)

    # Variablen
    counter = 0
    t1_Start = 0
    t1_Stop = 0
    t_Total = 0
    result = 0
    #measure = True

    # Die <code>myCounter(callback)</code> Funktion zählt externe Impulse aus einem PWM- Generator
    # Aktuelle Frequenz 100 Hz
    # Parameter - interrupt callback
    # Rückgabe -> gezählte Impulse
    def myCounter(callback):
    global counter
    counter +=1
    return counter

    # Die <code>t100_Start(callback)</code> Funktion registriert einen Start- timestamp value
    # Die Impulse kommen aus der Fotozele1
    # Parameter - interrupt callback
    def t100_Start(callback):
    global counter, t1_Start
    #t1_Start = myCounter(counter)
    t1_Start = time.time()
    #t1_Start = datetime.now()
    #t1_Start = t1_Start.microsecond

    # Die <code>t100_Stop(callback)</code> Funktion registriert einen Stop- timestamp value
    # Die Impulse kommen aus der Fotozele2
    # Parameter - interrupt callback
    def t100_Stop(callback):
    global counter, t1_Stop
    #t1_Stop = myCounter(counter)
    t1_Stop = time.time()
    #t1_Stop = datetime.now()
    #t1_Stop = t1_Stop.microsecond

    # Die <code>t_Total(callback)</code> Funktion registriert einen Total- timestamp value
    # Die Impulse kommen aus der Fotozele3
    # Parameter - interrupt callback
    def t_Total(callback):
    global counter, t_Total
    #t_Total = myCounter(counter)
    t_Total = time.time()
    #t_Total = datetime.now()
    #t_Total = t_Total.microsecond
    calculate(t_Total)

    # Die <code>calculate(t_Total)</code> Funktion rechnet die Gesamte Länge aus
    # und zeigt den Ergebnis an der Konsole
    # Parameter - Total- timestamp value. (Es sind die gesamt generierten Impulse, oder die Gesamtzeit)
    def calculate(t_Total):
    global result, t_pulsesFactor
        
    # eigentlich eine Temporäre Variable, welche einen Faktor zwischenspeichern soll
    # damit ich den Wert der Variablen auch reseten (auf null setzten) kann - global
    t_pulsesFactor = 100 / (t1_Stop - t1_Start)

    # Berechnung und Konsolenausgabe der Länge
    result = (t_Total - t1_Start ) * t_pulsesFactor
    print("Messung = %4.2f" % (result))

    # Resset
    reset(t_Total)

    # Die <code>reset(t_Total)</code> Funktion setzt alle Variablen wieder auf nul / 0. Also Reset
    # Parameter - Total (wird durch den Code geschleppt - ist aber auch ?global)
    def reset(t_Total):
    global counter, t1_Start, t_pulsesFactor, t1_Stop, result
    counter = 0
    t1_Start = 0
    t1_Stop = 0
    t_Total =0
    t_pulsesFactor = 0
    result = 0


    GPIO.add_event_detect(17, GPIO.FALLING, callback = t100_Start, bouncetime=120)

    # Sollte der Externe Generator als Impulsquelle ausgewählt sein,
    # so sendet er kontinuierlich seine PWM Impulse an den GPIO- Port25. Nach dem das Script beenden wird,
    # werden noch restimpulse registriert. Die try soll die rechtlichen pipe´s abfangen,
    # damit das System keine Fehlermeldungen generiert, - funktioniert aber auch nicht so doll
    try:
    GPIO.add_event_detect(25, GPIO.FALLING, callback = myCounter)
    except IOError as e:
    pass

    GPIO.add_event_detect(22, GPIO.FALLING, callback = t100_Stop, bouncetime=120)
    GPIO.add_event_detect(27, GPIO.FALLING, callback = t_Total, bouncetime=120)


    while True:
    time.sleep(2)

    # Sorgt für "Sauberes" beenden des Scriptes
    try:
    # reset GPIO wenn Ctrl+C Taste gedrückt
    time.sleep(100)
    except KeyboardInterrupt:
    print("Script angehaltet")
    GPIO.cleanup()
    [/php]

    Sollte ich "Müll- reden" :blush: - bitte mich (?) "auf die Nuss" hauen. :huh:

    Einmal editiert, zuletzt von georg-Lu_1963-1 (13. Juni 2015 um 21:26)

  • Hallo,
    das Projekt liegt mir ziemlich am Herzen, deshalb so schnell gebe ich nicht auf.
    Damit ich die Schwachstelle/n herausfinde, habe ich den RPI (die GPIO-s) mit einem weiteren Generator gesteuert.
    Die Funktionen:

    > def t100_Start(callback): <
    > def t100_Stop(callback): <

    werden jetzt mit einem Generator ausgelöst. Das Generator ist nichts anderes als ein NE555 "Stein", und generiert ca. 2Hz, 1Hz wie auch ca. 0.5 Hz. Weil 2Hz bzw. die 1Hz irrelevant sind, habe ich mich der ca. 0.5Hz Frequenz gewidmet.
    ALSO!
    Die "Python Krücke" habe ich zum letzten mall getestet. Das Ergebnis habe ich in eine Tabelle zusammengefasst.
    Die t100_Start... Funktion wir mit der Positiven Flanke aufgerufen,
    die t100_Stop... Funktion wird es mit der Negativen Flanke aufgerufen.

    tabele16wurz.jpg


    Jetzt möchte ich gerne das ganze im C, C#, C++ (???) Testen.
    Ich habe noch NIE! etwas in C ... gemacht. C++ (die Syntax) sieht / kommt mir sehr bekannt vor, nun bei der Trennung Header -> *.h / *.cpp wird es etwas verwirrend.
    Vom C++ habe ich immer noch sehr viel Respekt.
    Ich werde versuchen das Python- Script jetzt in C, C#, C++ (???) umzuschreiben, um das alles auch zu Testen. NUN!
    Nach eine suche interruptet bei C habe ich auf nichts brauchbares gestoßen.
    Für einen Tipp: (Denkanstoss)
    wie ich mein Code (Vorhaben) in C, C#, C++ (???) Umsetzen kann werde mich sehr freuen & dankbar sein.

    Gruß
    Georg

    Sollte ich "Müll- reden" :blush: - bitte mich (?) "auf die Nuss" hauen. :huh:

    Einmal editiert, zuletzt von georg-Lu_1963-1 (23. Juni 2015 um 10:28)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!