Bremslicht fürs Fahrrad

  • Hmm, so gelehrt bin ich nicht, dass ich mich in diesen Streit reinhänge ;)


    Bei mir würde an dieser Stelle ein "End" stehen. EmittingFuture kanns ja mal ausprobieren und uns dann sagen ob mans braucht oder nicht. :)
    Ich hab damit jedenfalls noch keine schlechten Erfahrungen gemacht :)

  • Heyho Community,
    Gerd_
    joa ne Hysterie wär auch nicht schlecht ^^ , meine natürlich Hysterese
    also ich habe jetzt mal mit einem kleinen Versuchsaufbau die Funktionsweise des Hauptprogramms getestet; also einfach nur eine LED und einen Draht-Schalter für den Interrupt (das bekloppte Pollin-board hat ja keine Verbindung der onboard-Taster zum Attiny-Sockel vorgesehen :pinch: ) an den µC angeschlossen.
    Habe Interrupt und Ausgang vorher noch einzeln getestet, um Fehler zu vermeiden - geht soweit.
    Zum richtigen Test, simuliere ich die Radfrequenz durch manuelles Betätigen des Schalters.
    Mein Bremslicht-Programm sieht jetzt so aus:



    wichtigste Änderungen in dieser Version: 1. Variablennamen auf sinnvoll geändert; 2. Tausch der Variablen in Zeile 51; 3. In der Hauptschleife ein einfaches Signalblinken.


    Wie immer beim 1. Test, geht das Programm natürlich noch nicht fehlerfrei :rolleyes: ; (die LED geht nirgentwann an) habe deshalb mal bestimmte Programmdurchläufe einzeln getestet (zum Beispiel das setzen der "Bestaetigung" und anschließendes starten der Hauptschleife) und dabei ist mir aufgefallen, dass ich noch irgentwas vergessen habe.
    Liege ich richtig der Annahme, dass in Zeile 49 bis 52 noch was reinmuss um der Hauptschleife "Zeit" zu geben, die Werte zu vergleichen. Ist es nicht so, dass zwar richtige Werte vorliegen können, diese aber garnicht verglichen werden, weil "Wert_alt" dann immer gleich mit "0" überschrieben wird?


    Danke für eure Hilfe, mir raucht schon der Kopf 8o

  • Ich sehe grad auch den Fehler, da in der Interruptroutine INT0 der Wert immer löscht, kommt es zu keinem richtigen Vergleich.
    Es fehlt noch eine Variable die den Wert festhält.
    Wert_alt und Wert_neu sind alle verwechselt, der Timerinterrupt spiegelt ja die kommende Periodendauer wider.
    Ich habe eine Variable zugefügt und die anderen umbenannt, damit scheint das vielleicht logischer.



    Gruß Gerd

  • Hallo,
    vielen vielen Dank für das Programm! Bis zur dritten Variable konnt ich garnichtmehr denken :wacko:
    Habe das auch erfolgreich mit einem Taster (entprellt und gepulluped, sonst loeste der Interrupt immer aus) probieren koennen, soweit das von Hand geht.
    Mir ist es dann aber nicht gelungen, mithilfe des Fahrradtacho-Sensors den Interrupt auszuloesen. Ich denke mal , dass es ein Hallsensor ist, weil nur ein Kabel vom Sensor zum Computer ging.
    Hat jemand eine Idee, wie ich den evtl. doch nutzen koennte?


    Dann habe ich den Pegelwandler nachgebaut und angeschlossen, aber ich denke, dass ich noch was falschgemacht haben muss-der Interrupt wird auch scheinbar zufaellig im Stand ausgeloest und zuverlaessig scheint das auch beim Bremsen nicht zu gehen.
    Mein Versuchsaufbau bestand aus dem Pollinboard (bzw. dessen 5V Schiene) mit dem Attiny 13 und rausgefuehrter LED und reingefuehrtem Signalkabel fuer den Interrupt. Auf einem Steckbrett ist der Pegelwandler aufgebaut, andiesen der Dynamo angeschlossen.


    Kann es sein, dass ich den Umstand "Pollinboard" miteinbeziehen muss? Die Massen habe ich miteinander verbunden (Pegelwandler - POLLINBOARD).


    Schoenen Abend noch!
    EmittingFuture :P

  • Hallo Gerd_,
    ja, den Pullup habe ich an die 5 Volt gelegt, das Nadynamogehäuse werde ich jetzt mal auf Potential testen.
    Nein, ein Oszilloskop besitze ich nicht.
    Sagmal, wo ich grade nochmal über die software und den Wandler schaue: der Int0-Pin wird ja durch den Pullup auf High gehalten, bis ein "Signal" vom Gleichrichter an die Basis des Transistors kommt . Dann wird dieser durchgeschalten und INT0 liegt auf Gnd bzw. Low, richtig?


    Das heißt also, dass der Pegelwechsel, der detektiert wird, von High auf Low erfolgt?
    Im Programm habe ich aber

    Code
    Config Int0 = Rising


    geschrieben, also wartet der Tiny auf einen Pegelwandel zu High 8o
    Werde jetzt mal das Programm mit

    Code
    Config Int0 = Falling


    flashen und schauen was passiert; meinst du das könnte der Fehler sein?


    Viele Grüße und schönen Sonntag! ;)



    PS: ich habe übrigens einen 2n3904 verwendet, dachte mir, dass der äquivalent arbeiten wird, ist das evtl. falsch?



    EDIT:
    Hm, komisch, jetzt löst der INT0 wieder häufig bei keiner Radbewegung aus. Habe dann den 10k-Pullup Widerstand mal entfernt und bin direkt mit plus 5Volt an den INT0, dann ist ruhe, also scheint das "Falling" zumindest eine Wirkung zu haben. (im Gegenzug kann ich auch mit Gnd an INT0 den Interrupt auslösen!)
    Also irgentwie schaltet der Transistor immer mal wieder durch, oder das Signalkabel zu INT0 bekommt irgentwie Gnd.


    Außerdem habe ich mal den Potentialcheck mit dem Durchgangsprüfer gemacht und mit Erstaunen festgestellt, das BEIDE Dynamo-Pole an den Speichen und an der Achse anliegen!! Der Dynamo funktioniert aber einwandfrei, müsste es da nicht laufend einen Kurzschluss geben?!

  • Natürlich wirst du mir nem Durchgangsprüfer gemau das sehen. Die Spule im Dynamo ist niederohmig. Wär das anders, ist das Ding kaputt!
    Mach doch mal einen Schaltplan, wie du jetzt alles verschaltet hast. Also mit Dynamo, Transistor, Gleichrichter, uC. Das machts einfacher!

  • Ob du auf fallende Flanke oder steigende Flanke den Interrupt triggerst ist bei dieser Anwendung völlig egal, nur eine Pegeltriggerung darf man natürlich nicht machen.

    PS: ich habe übrigens einen 2n3904 verwendet, dachte mir, dass der äquivalent arbeiten wird, ist das evtl. falsch?

    Bei diesem ist die Verstärkung doch einiges kleiner, am besten einen mit möglichst hoher Verstärkung, man kann stattdessen aber auch ruhig den Basiswiderstand entsprechend verkleinern. Versuche es mal mit ca.2K.

    das BEIDE Dynamo-Pole an den Speichen und an der Achse anliegen!

    da ist nichts falsch dran, der Nabendynamo ist ja nichs anders als ein Generator. Der Spulenwiderstand ist nur ein paar Ohm (beim SON hier messe ich gerade mal 3,0 Ohm) und bei dir ist eine Seite davon aufs Gehäuse verbunden.
    Nun musst du rausfinden welcher Anschluss davon eben aufs Gehäuse geht. Also nachmessen welcher der niederohmigere von beiden ist.
    Dieser ist dann auch deine gemeinsame Masse (dynamo-ardinio).


    Hier geht das mit dem Brückengleichrichter nicht, da eine Halbwelle vom Dynamo über eine Diode über den Gleichrichter kurzgeschlossen wird.
    Also auf die Frequenzverdopplung muss man hier verzichten!


    Vom Nabendynamo-pol, der nicht mit dem Gehäuse verbunden ist gehst du einfach mit einer einfachen Diode (Schottky wär prima) an den Basiswiderstand. Kathode natürlich in Richtung Transistor.


    Gruß Gerd

  • Hallo Jungs!


    also habe hier mal schnell einen Schaltplan meines bisherigen Aufbaus gemacht.
    (Müsste vollständig sein, habe nur den Kondensator des Pollinboards zwischen Vcc und Gnd des Tiny13 vergessen)
    [Blockierte Grafik: http://www.abload.de/thumb/bremslichtxzqp.png]


    Ich werde jetzt mal die Tipps befolgen und 1. den Basiswiderstand verkleinern und 2. dann den Aufbau ohne Brückengleichrichtung testen.


    Edit:
    Also das Verringern des Basiswiderstandes brachte keine Abhilfe, aber die Lösung mit dem Weglassen des Brügleichrichters ist vielversprechender!
    Habe also eine Bat48-Schottky eingesetzt und den Niederohmigen Pol (Dynamo) mit Masse verbunden. Folgendes Verhalten der Schaltung:
    Wenn das Rad in Ruhe ist, ist die LED aus. Beim Beschleunigen geht sie an und blinkt solange aktiv, bis das Rad wieder stillsteht.
    Ich denke, das ist doch schon ein Teilerfolg, dass der Nabendynamo zumindest schon Einfluss auf den Interrupt hat :P
    Könnt ihr euch erklären, warum aber der Interrupt genau "verkehrtherum" ausgelöst wird? Evtl. reicht auch die Taktrate des Tinys nicht (ich hab ihn jetzt auf 9,6/8 Mhz)

  • Wenn du noch einen Widerstand zwischen Basis und Emitter des Transistors schaltest - Wert etwa der von R1 - dürften dir doppelte Schaltflanken erspart bleiben. Falls das was ausmacht.
    Im übrigen, du versorgst doch wahrscheinlich die komplette Schaltung mit aus dem Brückengleichrichter, den du jetzt entfernt hast. Deshalb denke ich, der sollte irgendwann später wieder rein. Wenns erstmal läuft, klar!

  • BESUPREME
    Joa, der Gleichrichter sollte schon wieder rein, müsste ja sowieso die 5VSchiene aufbauen.
    Danke für den Tipp, habe mir jetzt im 1. Versuch 10k (bei R1=10k) und im 2. Versuch 4k (bei R1=4k) zwischen Basis und Emitter geschalten.
    Jetzt scheint er nurnoch eine Flanke zu "zählen"; ich beobachte einen deutlichen Wechsel in der Frequenz mit der die LED blinkt, desto langsamer das Rad wird.
    Aber irgentwie springt einfach nur bei Radbewegung an, ich hab keine Ahnung was ich jetzt noch Ändern könnte.
    Irgentwas an der Messauflösung falsch oder so?


    Viele Grüße
    Emittingfuture

  • Evtl. reicht auch die Taktrate des Tinys nicht (ich hab ihn jetzt auf 9,6/8 Mhz)

    daran wirds sicher nicht liegen, der langweiligt sich eher.


    Im Code sind noch zwei Sachen die passen nicht.
    a) Die Waitms in der Hauptschleife sind Kontraproduktiv, bis die Runde durchlaufen ist schlagen schon mehrere INT0 zu. Die Vergleichswerte werden deswegan auch frühestens immer nach dieser Zwangsverzögerung stattfinden >> Waits sind hier tabu, also raus damit.
    Ein Nachleuchten muss man Softwaretechnisch anders lösen.


    b) Die Timer und die Dynamo laufen zueinander natürlich nicht synchron, soll bedeuten:
    Auch wenn die Drehzahl absolut konstant wäre wechseln Periodendauer_letze und Periodendauer_aktuell ihre Länge, die Gesamtlänge bleibt dabei aber gleich, so kommt es nach jedem zweiten zum Einschalten der LED was nicht verwundert
    >> Die Vergleichsroutine braucht schon noch andere Parameter.

    Code
    If Periodendauer_aktuell +10 > Periodendauer_letzte Then


    die +10 ist nur mal ein Beipiel, hier muss man experimentieren, Additionen brauchen kaum Zeit für die Ausführung,
    Sind die Ergebnisse unzureichend, muss man hier notgedrungen zu anderen Formeln greifen.


    Probiers mal aus.


    Gruß Gerd

  • Hallo,
    nochmal ein verspätetes Danke für den Tipp mit der Addition!
    Habe jetzt in letzter Zeit gefühlte 100x mit verschiedenen Werten den Attiny geflasht, das Board zum Fahrrad getragen, probiert und wieder von vorne angefangen :pinch:
    Leider habe ich es immer noch nicht zum Laufen gebracht. Mein Code sieht folgendermassen aus:



    Nach dem Andrehen des Rades flackert die LED erst schnell, bei ca. 10km/h langsamer und bei <10km/h wieder schneller.
    Wenn ich das Rad mal ganz langsam mit der Hand beschleunige bleibt die LED aber aus, also funktioniert der Abgleich zumindest (soll ja erst angehen, wenn das Rad langsamer wird).


    Leider habe ich überhaupt keine Idee mehr, was zu tun ist, um das Flackern zu einem Leuchten zu machen und die Schwelle einzustellen, ab der ein Bremsen erkannt wird. Mir kam es teilweise sogar vor, dass die unterschiedlichen Summanden gar keine Auswirkungen darauf haben.
    Hat jemand eine Idee, wie ich mein Bremslicht doch noch zum Laufen bekomme?


    Schönen Sonntag
    EmittingFuture

  • Hi,


    hier ist ein tückischer Fehler drin, in der Zeile34 erhöhst du Dauerhaft die Variable "Periodendauer_aktuell".
    Beim nächsten INT0 wird diese dann auch in die Variable "Periodendauer_letze" übernommen. Damit wird der Vergleichsoffset hinfällig.


    Vor und nach dem Vergleich dürfen diese Variablen nicht verändert werden.
    > lösche die Zeile34 komplett und Zeile35 schreibst du folgendermassen um.

    Code
    If (Periodendauer_aktuell +10) > Periodendauer_letzte Then


    Hatte ich in meinem letzten Post schon so gemeint, womöglich braucht aber BASCOM hier bei der Addition noch die Klammern.
    Der Unterschied hier zu deinem momentanen Code ist, dass die Variable mit dem Vergleich nicht erhöht, sondern nur Verglichen wird.


    Gruß Gerd