[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"] [/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
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]