Und in wiefern entspricht das jetzt mehr oder weniger deinen Anforderungen?
RPM PIGPIO falsche Werte "entprellen"
-
Landixus -
7. Mai 2017 um 18:56 -
Erledigt
-
-
RPM PIGPIO falsche Werte "entprellen"? Schau mal ob du hier fündig wirst!
-
Wenn ich eine Taste drücke:
Code
Alles anzeigencount: 88 231 count: 118 Traceback (most recent call last): File "./apiforum.py", line 118, in <module> main() File "./apiforum.py", line 110, in main print( calculate_power(level, count, LEVEL_TO_POWER, 20, 120) ) File "./apiforum.py", line 38, in calculate_power return level_to_power[level][(rpm) // 10] IndexError: list index out of range
-
Ich hab lower_limit, higher_limit usw nur von dir übernommen. Ob das so richtig ist hab ich nicht weiter durchleuchtet, da ist nun deine Mithilfe erforderlich
-
Ich hab lower_limit, higher_limit usw nur von dir übernommen. Ob das so richtig ist hab ich nicht weiter durchleuchtet, da ist nun deine Mithilfe erforderlichJetzt geht es, ich möchte das ausgiebig testen und melde mich nachher dann noch mal.
Das funzt aber schon 100x besser als meins! Super vielen Dank.
Was noch nicht passt, ich brauch ja die durchschnittlichen rpm, das count zählt immer höher.
ein realistischer Wert liegt so wischen 20 und 100 RPM. Ich hoffe ich hab das so richtig ausgedrückt? (also count ja, aber als Durchschnitt pro Minute)
-
Ich hab lower_limit, higher_limit usw nur von dir übernommen. Ob das so richtig ist hab ich nicht weiter durchleuchtet, da ist nun deine Mithilfe erforderlich
http://codepad.org/xwQ5HDgUAlso die Powerausgabe soll 0 sein wenn die RPM kleiner als 20 RPM ist, oder wenn die RPM größer als 120 ist. Da man ja keine 120 RPM schafft mit dem Crosstrainer. (Habs versucht... bremsen ist dann voll doof!)
Zitat von meigrafd
Umdrehungen pro Minute
Müssten wir jetzt nicht die rpm ( Umdrehungen pro Minute) erste noch anhand der pulses errechnen? (rpm = 1/impulse * 60) und dann (return rpm)? Und dann wird anhand von level und rpm die power berechnet.
Nicht lachen ich will es nur versuchen.Was mir noch aufgefallen ist: Wenn ich die btnPlus oder btnMinus Taste drücke zählt es die Level hoch, oder runter. Bei Tastendruck soll zwar ein Level höher, oder runter gewählt werden, soll dann aber da verbleiben, bis wieder gewählt wird.
ich glaub das ist jetzt gut erklärt, oder?
Hab auch nix am code gefummelt! -
Um einen Durchschnitt pro Minute zu haben muss es erst mal eine Minute laufen
Dass das Script noch nicht die endgültige Fassung ist, habe ich glaube schon 3x erklärt. Wir arbeiten uns Schritt für Schritt voran.
Gemäß deiner Ausgabe schafft du 20-30 Impulse in nur 2 Sekunden:
counter: 0
counter: 22
counter: 54
counter: 84
counter: 112
counter: 142
counter: 168Zwischen jeder Ausgegebenen Zeile sind 2 Sekunden vergangen.
Insofern ist die Aussage denk ich nicht korrekt: " Da man ja keine 120 RPM schafft mit dem Crosstrainer. ". Oder das Erfassen an sich ist noch fehlerhaft - eben aus dem Grund weil du einen Reed-Switch verwendest (wieso das ein Problem sein könnte wurde hier auch schon paar mal erwähnt)Bisher haben wir nur einen reinen Impulszähler gebaut. Um jetzt "Rotations per Minute" beziehungsweise "Revolutions per Minute" bzw U/min zu erhalten brauchen wir auch noch eine Zeiteinheit. Wir müssen also eine Anzahl von Vorgängen pro Zeiteinheit ermitteln.
Nun gäbe es denk ich mehrere Möglichkeiten:
1. Entweder wir ermitteln die Zeit die für insg. 10 Umdrehungen benötigt wurde.
2. Oder wir merken uns die Zeit für jede einzelne Umdrehung und berechnen jede 10te.
3. Wenn man RPM wörtlich nimmt, zählt man 60 Sekunden lang die Impulse, nutzt die Anzahl und resettet danach "count" wieder.Allgemein könnte diese Berechnung so aussehen:
Start_Zeit merken.
10 Impulse zählen.
End_Zeit merken.
10 Impulse geteilt durch (End_Zeit minus Start_Zeit)
... ergibt glaub ich die Frequenz ... -
-
meigrafd
Ja ich weiss das wir noch nicht fertig sind.Ich glaube wenn wir noch eine bouncetime von 200ms einbauen, sollte das Erfassungsproblem Geschichte sein?
Toll das es voran geht.
-
Nein. Eine bouncetime wirkt der Erfassung entgegen.
In deinem Fall wird ein GPIO ziemlich schnell nacheinander ausgelöst, dh. eine "bouncetime" ist für dich störend, denn, findet ein Flankenwechsel statt und innerhalb von "bouncetime" noch einer, wird dieser ignoriert. "bouncetime" ist eine Softwareseitige Entprellung.Dein Erfassungsproblem, sofern eins besteht, liegt wenn dann nur am Sensor. Und nicht daran das zu wenige erfasst werden, sondern zu viele Regelt man das via Software ist es letztlich nur ein Glücksspiel ob die Werte dann tatsächlich noch der Realität entsprechen.
Für Taster nutzt man "bouncetime" um eine Mehrfachauslösung zu schnell hintereinander zu verhindern.
-
Nein. Eine bouncetime wirkt der Erfassung entgegen.Für Taster nutzt man "bouncetime" um eine Mehrfachauslösung zu schnell hintereinander zu verhindern.
Also ich kenn das so, das der Magnet am reed Kontakt vorbei kommt und diesen für einen Moment anzieht(schliesst), das ist dann für mich eine Umdrehung.
Das mit dem richtigen erfassen habe ich mit diesem script(Nicht hauen war nur zum testen) ja getestet:Python
Alles anzeigen#!/usr/bin/python3 import RPi.GPIO as GPIO from time import sleep import time, math rpm = 0 elapse = 0 sensor = 4 pulse = 0 start_timer = time.time() def init_GPIO(): # initialize GPIO GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(sensor,GPIO.IN,GPIO.PUD_UP) def calculate_elapse(channel): # callback function global pulse, start_timer, elapse pulse+=1 # increase pulse by 1 whenever interrupt occurred elapse = time.time() - start_timer # elapse for every 1 complete rotation made! start_timer = time.time() # let current time equals to start_timer def calculate_speed(r_cm): global pulse,elapse,rpm if elapse !=0: # to avoid DivisionByZero error rpm = 1/elapse * 60 return rpm def init_interrupt(): GPIO.add_event_detect(sensor, GPIO.FALLING, callback = calculate_elapse, bouncetime = 200) if __name__ == '__main__': init_GPIO() init_interrupt() while True: calculate_speed(20) # call this function with wheel radius as parameter print('rpm:{0:.0f}'.format(rpm)) sleep(0.2)
Nur damit du weisst das der reed OK ist. Ich kann auch gerne die Ausgabe posten, die das script bringt wenn gewünscht. -
Und woher weißt du das Dieses Script absolut fehlerfrei funktioniert wenn du 20-30 Umdrehungen pro 2 Sekunden machst? Rechne das mal runter auf Millisekunden und wie viele dann in die bouncetime fallen und somit ignoriert werden...
Selbst wenn man 2 / 20 rechnet wäre das jeder 2. Auslöser der durch eine bouncetime von 200ms ignoriert werden würdeTeste Das Script mal ohne bouncetime und vergleich die Ergebnisse. Mal davon abgesehen dass das Script "wheel radius" benötigt was du aber gar nicht verwendest/angibst
-
Und woher weißt du das Dieses Script absolut fehlerfrei funktioniert wenn du 20-30 Umdrehungen pro 2 Sekunden machst? Rechne das mal runter auf Millisekunden und wie viele dann in die bouncetime fallen
Teste Das Script mal ohne bouncetime und vergleich die Ergebnisse. Mal davon abgesehen dass das Script "wheel radius" benötigt was du aber gar nicht verwendest/angibstOb das absolut fehlerfrei arbeitet weiss ich nicht, aber wenn sich die Ausgabe auf der Konsole mit der an dem Crosstrainer deckt, kann sie ja so falsch nicht sein.
Da ist aber immer noch das Verständnissproblem?, oder ich bring das falsch rüber. Ich schaffe doch nie 20 - 30 Umdrehungen pro Sekunde, das schafft keiner
Hier siehst du die Scheibe und den Magnet:Der Durchschnittsfahrer hat so eine RPM von 60, also 1 Umdrehung pro Sekunde. (Da ordne ich mich mal ein, im Trainingsmode)
So ein Profi kommt schon ma für ein paar Sekunden auf 225 RPM , das sind dann 3,75 pro Sekunde. (Dann hat der aber auch Beine wie ein Pferd).
-
Servus Landixus,
...
Also ich kenn das so, das der Magnet am reed Kontakt vorbei kommt und diesen für einen Moment anzieht(schliesst), ...
Hintergrund (falls Du es nicht vielleicht schon ergurgelt hast):
mechanische Kontakte neigen dazu kein einmaliges, sauberes LOW->HIGH (oder auch HIGH->LOW) Signal auszugeben, sondern für einen kurzen Zeitraum zwischen zwei Zuständen zu "schwingen". Das nennt man dann eben prellen.
Eine Software, die auf Impulse eines Eingangs reagiert, registriert eben auch dieses "Schwingen" jeweils als einzelnen Schaltimpuls. Das sind die von meigrafd erwähnten Mehrfach-Auslöser.
Das ist so nicht sinnvoll, denn wenn ich einen Taster abfrage, den ich, für mich als Mensch gefühlt, einmal betätige, dann soll die Software auch nur einen Impuls registrieren und nicht 17.
Deshalb werden mechanische Kontakte "entprellt". Das geschieht jetzt entweder per Hardware ( RC-, LRC-Glied, Schmitt-Trigger, ...) oder eben per Software.
Per Software verwendet man eben eine "bounce-time" bzw. "debounce-time" die schlicht nichts anderes bewirkt, als dass alle in diesem Zeitraum zusätzlich auftretenden Impuls einfach ignoriert werden.
Das geht aber nur so lange gut, wie die debounce-time kleiner ist als der Zeitraum, in dem "echte" Impulse auftreten. Wird sie grösser, werden auch "richtige" Impulse ignoriert was z.B. falsches zählen zur Folge hat.ciao,
-ds- -
dreamshader
Ja, dann ist meine "gedachte bouncetime" also korrekt? Da in den 200ms der Magnet gar nicht vorbeischaut. -
Hm ... dem Profi ordnest Du knapp 4 Umdrehungen/Sekunde zu ... das wären dann 266 ms Zeitspanne zwischen zwei Impulsen. Auch da würden 200 ms debouce keine Rolle spielen, würde ich sagen.
Sollte also passen ... ausprobieren ...cu,
-ds- -
Sollte also passen ... ausprobieren ...Joa, aber ich möchte das gerne meigrafd machen lassen, ich würde nur wieder den code versauen. =(
-
Du könntest die Gelegenheit nutzen und dabei was lernenNur dasitzen und sagen "Komm, schreib mir mal den Code, bis ich's gut finde" ist nicht so toll (ich weiß, so meinst du es nicht, aber glaub mir, du kannst dich mehr drüber freuen, wenn du sagen kannst, dass es deine Arbeit war).Pfff...
LG
-
Du könntest die Gelegenheit nutzen und dabei was lernen
Nur dasitzen und sagen "Komm, schreib mir mal den Code, bis ich's gut finde" ist nicht so toll (ich weiß, so meinst du es nicht, aber glaub mir, du kannst dich mehr drüber freuen, wenn du sagen kannst, dass es deine Arbeit war).
LGdas habe ich ausgiebig erklärt, sei mir bitte nicht böse, aber magste dich raus halten? (Ich mein das auch nicht so).
-
Erledigt in JS
https://www.instructables.com/id/Using-Zwift…Fitness-Device/
Auch wenn es hier nicht mit Python zum Erfolg geführt hat, danke ich trotzdem für eure Geduld.
-
Jetzt mitmachen!
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!