Drehzahlmessung/Wegstrecke Modelleisenbahn Programm

  • Hi Leute,


    ich habe nun schon ein wenig Programmcode in python zusammengeschrieben.
    Allerdings gibt mir der Compiler aus, dass irgendwas mit der "else" bedingung nicht stimmt?! Und ich weiß nicht was...


    Ich denke der Code ist weitestgehend selbsterklärend. Ein input fängt HI-Signale von einem Hallsensor der am Wagenrad sitzt auf und der andere Schalter soll zum starten/stoppen der Messfunktion sein.


    Könnte es an den Interrupts liegen, die ich in die If funktion reingeschreiben habe?
    Nicht irritieren lassen von Sachen, die ich durch kommentieren wieder rausgenommen habe...wie gesagt, bin noch in der testphase.
    Leider wurden die ganzen formatierungen von geany nicht erkannt?! gibts ne möglichkeit, den code hier sauber einzufügen?

  • Ohne den Code lange angeschaut zu haben: Da du ja bereits sagst, dass eine Fehlermeldung wegen dem else geschmissen wird: Hier fehlt auf jeden Fall der Doppelpunkt nach dem else noch.

  • Moin,


    ja das mit dem Doppelpunkt war es! DANKE!!:bravo2:


    Allerdings hab ich nun folgendes problem...
    Ich starte das Prgramm und solange ich den "ein/aus-schalter" nicht betätige, gibt das prog. "Messung nicht gestartet" aus, was es auch soll.
    Sobald ich die Messung starte, kommt 2 mal "Messung gestartet! Warte auf Input von hall-sensor" danach bricht das Programm ab mit folgender Meldung:


    "Runtime Error: edge detection already enabled for this GPIO channel"


    Weiß einer Rat?

  • also ohne Formatierung praktisch nicht lesbar, denn: in Python ist die Formatierung lebenswichtig!


    und zweitens ist das ein totales Durcheinander, nicht nur die Interrupts (?) sondern auch die Definitionen (def ...) gehören nicht mitten in die while-Schleife rein... sondern davor...

  • So ich habe den code etwas aufgeräumt und formatiert reingestellt.


    Ich bekomme folgende Meldung:

    "Traceback (most recent call last):
    File...blalbla line 60 in <module>
    main()
    File...blalba line 52 in main
    gpio.add_Event_detect (17, gpio.RISING, callback = drehzahlmessung_rechnung, bouncetime = 300)
    RuntimeError: Edge detection already enabled for this GPIO Channel"




    Ich hoffe das ganze ist nun besser verständlich. Den Interrupt von dem "Ausschalter" hab ich nochmal rausgenommen um mögliche Fehlerquellen zu minimieren.


    Kurz nochmal gewünschte Funktion:


    Programm einschalten -> Wenn GPIO 27 Hi, sollen die Interrupt Events freigeschaltet werden, die bei einem Highpegel vom Hall-Sensor (GPIO17) die Anzahl der Umdrehungen um 1 inkrementieren. Schalte ich ich GPIO27 auf LOW, dann soll keine Messung mehr statt finden.


    Was hab ich falsch gemacht?

  • Ich bin nun ein schritt weiter... Der Fehler scheint damit zusammenzuhängen, dass die while schleife den edge_detect mehr mals aufrufen will.


    Hab aber keine Idee wie ich das anders lösen kann... :(


  • Ich bin nun ein schritt weiter... Der Fehler scheint damit zusammenzuhängen, dass die while schleife den edge_detect mehr mals aufrufen will.


    Hab aber keine Idee wie ich das anders lösen kann... :(


    und warum gehst du nicht erst raus wenn die andere Flanke erkannt wurde ?
    oder Merker setzen für erkannt damit es keinen weiteren Eintritt gibt und den Merker zurücksetzen wenn die entgegengesetze Flanke erkannt wird


    oder prellt die ? dann entprellen......

    lasst die PIs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Edited once, last by jar ().

  • sorry, ich kann dir leider nicht ganz folgen...kannst du das genauer erklären? Oder evtl. die ungefähre sttruktur aufschreiben, dann verstehe ich es wsh. besser.


    Das Problem mit dem prellen sollte nicht vorhanden sein, da ich ja bereits eine Bouncetime festgesetzt habe.


    Grüße

  • dann sag mir welche Zeile im Script mehrfach angesprungen wird ?


    Taster ? GPIO 17 oder 27 ? ich weiss ja nicht wo das Problem liegt....

    lasst die PIs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • fehlt da nicht was ?


    der DETECT:
    GPIO.add_event_detect(channel, GPIO.RISING) # add rising edge detection on a channel


    die Auswertung (if)
    if GPIO.event_detected(channel):
    print('Button pressed')


    also müsste IMHO zu
    gpio.add_event_detect (17, gpio.RISING, callback = drehzahlmessung_rechnung, bouncetime = 300)
    folgendes gehören:
    if GPIO.event_detected(17):



    und erweitert mit Abfrage:


    if ! steigen (also wenn noch nicht gestiegen)
    gpio.add_event_detect (17, gpio.RISING, callback = drehzahlmessung_rechnung, bouncetime = 300) // auf steigen warten
    else gpio.add_event_detect (17, gpio.FALLING, callback = drehzahlmessung_rechnung, bouncetime = 300) // auf fallen warten


    if GPIO.event_detected(17):
    if steigen
    steigen=0 (ich bin nicht python dialekt sicher, die muss vielleicht korrigiert werden)
    else // und wieder zurück
    steigen=1

    lasst die PIs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Edited once, last by jar ().

  • ich glaube die edge detection darf nur einmal aufgerufen werden als Init ausserhalb der Schleife


    oder wenn die wechseln soll eventuell noch EINMAL aber nicht mehrmals



    File...blalba line 52 in main
    gpio.add_Event_detect (17, gpio.RISING, callback = drehzahlmessung_rechnung, bouncetime = 300)
    RuntimeError: Edge detection already enabled for this GPIO Channel"

    lasst die PIs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Edited once, last by jar ().

  • ich glaube das hilft mehr:
    http://code.google.com/p/raspberry-gpio-python/wiki/Inputs


    wenn der edge detect wechseln soll muss man den wohl wieder rauswerfen und neu machen


    also bei rising erkannt, im Ergebnis den rauswerfen
    remove_event_detect()
    und neu setzen auf FALLING


    und bei falling erkannt, im Ergebnis den rauswerfen
    remove_event_detect()
    und neu setzen auf RISNG


    immer im Wechsel

    lasst die PIs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • upps ...



    Code
    GPIO.wait_for_edge(channel, GPIO.RISING)
    Note that you can detect edges of type GPIO.RISING, GPIO.FALLING or [color=#ff3333][b]GPIO.BOTH[/b][/color]. The advantage of doing it this way is that it uses a negligible amount of CPU, so there is plenty left for other tasks.


    soweit kommts noch, die handler umzuschalten :fies:


    cu,
    -ds-


  • klasse, dachte schon das das auch geht ! :thumbs1:


    erst auf jeden Flankenwechsel reagieren und je nach low und high auswerten, mit einem Merker ausmaskieren damit nur der Wechsel erkannt wird und nicht der Zustand......

    lasst die PIs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Hi Leute,


    ich habe es mittlerweile geschafft ein Programm zu schreiben, was meine Wünsche/Ziele erfüllt. Es sind lediglich noch 2-3 Kleinigkeiten was das feintuning angeht. Ich poste es nachher mal wenn ich zu hause bin, dann könnt ihr euch ein Bild machen! Der Beitrag von jar mit "if Event detect" hat mir auf jedenfall sehr geholfen! Danke nochmal...


    Man sollte immer beachten: Definitionen für GPIO-Detections dürfen nicht in Schleifen (schon gar nicht dauerschleifen) benutzt werden, sondern nur die Funktionen, die etwas ausführen bei detection. In Google findet man relativ wenig dazu, obwohl schon viele Leute diese Fehler gemacht habe, oftmals aber das Problem nicht gelöst werden konnte!

  • Hatte nun Klausrenphase und Feiertage, deswegen war das Projekt erstmal auf Eis. Will es aber in den Winterferien fertigstellen und dann ein kleines TUT dazu schreiben :)


    Ich habe nun folgenden Code:



    Natürlich habe ich immernoch ein kleines Problem...: Starte ich die Messung mit dem Schalter 27 - dann kann ich durch betätigen eines Tasters (für testzwecke - simuliert den Hall-Sensor) die Inputs sammeln und verarbeiten und ich bekomme meine Umdrehungzahl und die Strecke ausgegeben, ist ja ne mathematisch simple Sache. Schalte ich den Schalter 27 ab soll natürlich auch die Varibale "umdrehungen" auf 0 gesetzt werden, damit eine mögliche Neumessung nicht beim letzten gemessenen Wert startet. Leider habe ich aber das Problem, dass ich sobald ich einen Hall-Sensor input simuliere, ohne das die Messung uberhaupt stattfinden darf (Schalter27 ist abgeschaltet) der Input trotzdem aufgenommen und verarbeitet wird?!:mad_GREEN: Dieses Phänomen triott aber komischerweise nur auf, wenn ich vorher schonmal in der Schleife drin war, also schonmal Schlater 27 auf ein "ein" hatte.


    Weiß einer Rat? Oder hat jemand eine Idee wie ich das ganze etwas einfacher gestalten könnte.


    Gruß!