• Hallo TT-Modellbahner, schön, dass du zu uns gefunden hast.
    Um alle Funktionen nutzen zu können, empfehlen wir dir, dich anzumelden. Denn vieles, was das Board zu bieten hat, ist ausschließlich angemeldeten Nutzern vorbehalten. Du benötigst nur eine gültige E-Mail-Adresse und schon kannst du dich registrieren.
    Deine Mailadresse wird für nichts Anderes verwendet als zur Kommunikation zwischen uns.
    Die Crew des TT-Boardes

Analog automatisch abbremsen und anfahren - mit Arduino

Hallo André,
ich bin einfach nur begeistert, was Du hier so aus dem Stand machst.

Viele Grüße Wolfgang

Danke, aber das Orginal kommt von ateshci. Ohne ihn wäre ich nie soweit gekommen. Per PN hat er mir sehr geholfen.
Schöne Arbeit!

Ich werde bald auch solche Sachen machen. Vielleicht kannst Du mir bei Programieren helfen. :)

Ich helfe wo ich kann. Bin aber selber noch Anfänger. Kann aber bestimmt bei ein paar kleineren Sachen helfen.


Hier ein Video vom Test: dl.dropbox.com/s/99ra724pztjbpa6/AnfBremsTest.mp4
* Kann man Videos auch an den Post anhängen? Wenn ja welches Format?


Was mich noch stört, das ein kleineres "hüpfen" der Lok, dem Arduino sagt, das der Block nicht besetzt ist. Dadurch wird dem vorherigen Block, zwar nur kurzzeitig, gesagt das "Frei" ist. Der Zug im vorherigen Block wird wohl kaum reagieren, da er zu träge ist. Aber das Lichtsignal wird kurzzeitig von Rot auf grün wechseln. Im Video sieht man das an der rechten LED, die Violett schimmert (im Orginal war die Blau^^). Wenn die Lok nicht im Block ist leuchtet sie, und wenn die Lok im Block ist leuchtet sie nicht. Man sieht sie ab an zu kurz angehen, wenn der Zug im Block ist.


Softwaremäßig wäre es etwas aufwendig das zu programmieren wenn man sich nicht in schleifen verfangen will. Schleifen verhindern dann ein reagieren auf ein ändern der Eingangssignale. Unmöglich aber nicht.


Kann man es auch Hardwaremäßig ändern, indem man den kleinen 10µF Elko am GBM Eingang (A3) durch einen größeren ersetzt, um sozusagen die kleinen Hüpfer zu puffern? Andere GBM-System nutzen ja auch etwas größere Elkos. Oder woran könnte es noch liegen das der Arduino kurzzeitig meldet das der Block frei ist.

Beim schreiben fällt mir gerade auf, das eigentlich gar kein Sinn ergibt. Denn der Ausgang für die Violette LED wird nur auf High gesetzt wenn gleichzeitig auch das PWM-Signal auf 100% gesetzt wird. Dann müsste die wieder auf volle Fahrt springen. Ich muss mir nochmal das Video anschauen.


Aber bis auf diese Kleinigkeit bin ich voll zufrieden.
* Die Bremsstreckelänge ändert sich nicht, egal wie schnell der Zug ist. #Unterschiedliche Spannung im Video
* Wenn ein Zug in den Block fährt. Das Signal ist auf Halt. Der Zug fängt an zu bremsen. Signal wechselt auf Frei. Zug beschleunigt von der aktuellen Geschwindigkeit zur Fahrregler Geschwindigkeit. (Im Original nicht so, dort wird der Bremsvorgang erst beendet, bevor beschleunigt wird) #Runde 2 im Video
* Wenn der Folgeblock, beim anfahren im aktuellen Block, meldet das besetzt ist, wird ein Nothalt eingeleitet (da fehlt noch eine Anpassung im Schaltplan. #Runde 3 im Video


Edit: Entschuldigt bitte dass das Video auf der Seite liegt.
 
Zuletzt bearbeitet:
Für mich ist nur das Arduino neu ( Programsprache), sonst bin ich ein alter Fuchs.... :)

Mit GBM hatte ich auch früher sehr große Probleme und viel experimentiert, letztendlich habe ich Dr.Chubb's Lösung übernommen. :)

https://cdn.shopify.com/s/files/1/0947/9088/files/CHB-03_OD_Track_Detection.pdf?14799003751992011737

Diese GBM sind extrem sicher und zuverläßig. Auf unserer ehemaligen Klubanlage habe ich etwa 20 gehabt, jetzt auf unsere Heimlanlage sind über 30 im Einsatz.

Nur YouTube Videos kannst Du direkt anhängen.
 
Oha, das ist schon etwas Hardware Aufwand. Das auf der Platine unterzubringen bzw. Extern an die Platine anzubinden.

Ich habe mich mal in einer Software Lösung probiert.

Code:
if (GBM <= GBMschwelle) { // Wenn sich kein Zug im Block befindet,
    for (i=0; i<Puffer; i++) { // Zähle in 10 Microsekunden Schritten bis zum erreichen vom Pufferwert  // BSP: 100 = 1 Sekunde, 200 = 2 Sekunden, 175 = 1,75 Sekunden, etc
      delay(10);
      if (analogRead(GBMPin) > GBMschwelle) break; // Wenn der GBMPin einen Zug erkennt, verlasse die Zählschleife
    }
    if ((i>=Puffer) && (GBM <= GBMschwelle)) { // Wenn bis 100 gezählt wurde und Wenn sich kein Zug im Block befindet,
      PWMcur = PWMmax;  // ist die Blockspannung gleich Maximale Spannung im Block
      digitalWrite(MelAusgPin, HIGH); // Meldet vorherigem Block "FREI"   
    }
    else digitalWrite(MelAusgPin, LOW); // Ansonnsten meldet vorherigem Block "Besetzt"

Der Arduino zählt in 10 Microsekunden bis zu einem Vorgegeben Puffer Wert. Was einer Wartezeit von z.B. einer Sekunde entspricht.
Natürlich muss man ständig prüfen ob der GBM Sensor nicht wieder einen Zug erkennt, und die Schleife verlassen, sonnst würde ein Brems oder Beschleunigungvorgang für diese eingestellte Wartezeit unterbrochen werden. Wenn der PufferWert erreicht ist und immer noch kein Zug erkannt wird, erst dann meldet er zum vorherigem Block "Frei". Der Pufferwert ist frei einstellbar, aber in der Software. Könnte man auch über einen zusätzlichen Poti auslesen. Passt natürlich nicht auf die fertige Platine.

Ob der Code klappt muss ich noch testen. Sieht mir etwas zu umständlich aus. Mal schauen.
 
GBM ist eine ziemlich aufwendige Sache. ( vielleicht sollten wir ein extra Thread machen :) ) Mit uP kannst du nur die zeitliche Verhalten des GBMs beeinflussen. ( Wann reagiert, wie lange haltet usw), nicht die Empfindlichkeit. Ein Wagen mit einer leitender Achse muss genau so den GMB beeinflussen wie eine Lok mit 2 Motoren.
Also die Voraussetzungen für einen guten GBM sind.
* schnell und zuverlässig reagieren - unabhängig vom Fahrzeug!
* die Besetzmeldung soll unuterbrochen sein ( die Wagen liefern keinen stabilen Kontakt.)
* Richtungsunabhängig
* einstellbare Abfallzeit. Wann schaltet der GBM auf Frei.
* einstellbare Empfindlichkeit, extrem wichtig für größere Anlage. Ein GBM soll maximum auf einen Widerstand von 6-8 kOhm reagieren. Lange Gleise, Feuchtigkeit können oft Probleme verursachen wenn die Empfindlichkeit zu hoch ist. Wenn jeder Wagen 8 kOhm Widerstand hat, 10 Wagen im Zug sind schon 800 Ohm, 20 Wagen 400 Ohm. Das kann schon der Fahrspannung beeinflussen.

Leider diese Aufgaben kann man nicht mit einer einfachen Schaltung von 2 Dioden und einem Kondensator erfüllen.

Mein GBMs sind fixer Teil der Anlage, die Elektronik arbeitet nur mit dem Ausgangsignal
 
Zuletzt bearbeitet:
Die Schaltung von Chubb ist m. E. viel zu aufwändig. Man kann das gleiche Ergebnis mit einer geringeren Anzahl von Bauteilen erreichen, wenn man die geeigneten ICs einsetzt.
Bevor hier wieder einer meint, einen Thread dazu aufmachen zu müssen, schaut doch erst mal in die TT-Wiki! Stichwort: Gleisbesetztmelder
 
Die Empfindlichkeit lässt sich ja auch in der Software einstellen.

Den Fehler mit der PWM und der GBM Erkennung regelt auch der Widerstand einwandfrei. Zumindest sagt die Variable für den GBM Wert ein durchweg hohen Wert, wenn der Widerstand zusätzlich zwischen A und B liegt.

Mir schien es eher so, das die Lok den Kontakt verloren hat, dadurch der Nano keine Lok erkennt, und dadurch dem vorherigen Block Frei meldet.

Und genau dieses will ich überbrücken, indem der Nano erst Frei meldet, wenn eine Gewisse Zeit der Kontakt abbricht, z.B. 1Sekunde.

Es ist ja auch nicht schlimm wenn ein Block kurze Zeit länger besetzt meldet, als er besetzt ist. Er sollte nur sofort besetzt melden, wenn sich etwas im Block befindet. Oder?
 
Die Schaltung von Chubb ist m. E. viel zu aufwändig. Man kann das gleiche Ergebnis mit einer geringeren Anzahl von Bauteilen erreichen, wenn man die geeigneten ICs einsetzt.
Bevor hier wieder einer meint, einen Thread dazu aufmachen zu müssen, schaut doch erst mal in die TT-Wiki! Stichwort: Gleisbesetztmelder

Es kann sein das die Schaltung aufwendig ist, kostet heutzutage aber fast nichts ( weniger als 5 € mit Platine) und tut alles, was man braucht. Alle andere Schaltungen sind weit entfernt davon ( über 20 haben wir im Klub getestet - fertige und auch selbsgebaute - für analog und DCC System).
 
Die Empfindlichkeit lässt sich ja auch in der Software einstellen.

Den Fehler mit der PWM und der GBM Erkennung regelt auch der Widerstand einwandfrei. Zumindest sagt die Variable für den GBM Wert ein durchweg hohen Wert, wenn der Widerstand zusätzlich zwischen A und B liegt.

Mir schien es eher so, das die Lok den Kontakt verloren hat, dadurch der Nano keine Lok erkennt, und dadurch dem vorherigen Block Frei meldet.

Und genau dieses will ich überbrücken, indem der Nano erst Frei meldet, wenn eine Gewisse Zeit der Kontakt abbricht, z.B. 1Sekunde.

Es ist ja auch nicht schlimm wenn ein Block kurze Zeit länger besetzt meldet, als er besetzt ist. Er sollte nur sofort besetzt melden, wenn sich etwas im Block befindet. Oder?

Ich glaube nicht das du die Empfindlichkeit mit SW lösen kannst. Wie ich sehe arbeitest Du derzeit nur mit Loks, die mestens haben wenig Probleme mit GBM, probiermal auch mit Wagen.
Ein Kondensator parallel zu Dioden hilft meistens nicht, denn die Aufladezeit ist ziemlich abhängig von dem Widerstand zwischen die Schienen. Also eine Lok mit kaum 100 Ohm wird den Kondensator schnell aufladen, ein Wagen mit 6-8 kOhm und schlechten Kontakt ( schmutzige Schienen) wird es ewig dauern, und dann kann auch der uP kaum etwas messen.
 
@Andre1980
Du kannst eigentlich die Ansprechschwelle des A/D-Wandlers nicht in großen Grenzen einstellen, denn bei Dioden sind das nun mal ~ 0,6V unabhängig vom Strom ( µA lassen wir mal außen vor ). Die Ansprechempfindlichkeit bei der Diodenschaltung kann man nur mit einem parallel zu den Dioden liegenden Widerstand verändern, nach der Formel 600 = R*Is, Is = Soll-Ansprechstrom in mA. Die Abfallzeit(Überbrückungszeit) jedoch lässt sich problemlos per Software einstellen, deshalb braucht man keinen Kondensator. Der eingezeichnete soll nur das Ansprechen bei sehr kurzen Strom/Spannungspitzen verhindern.
 
Ok, ich dachte der Wert, der da eingelesen wird, hängt mit der Empfindlichkeit zusammen.

Ich habe noch keine Hänger mit Beleuchtung bzw. Achsen mit Widerstand (sowas in der Art habe ich irgendwo mal gelesen) und kann das somit nicht testen.

Ein einfachen Widerstand auf die Gleise legen, mit unterschiedlichen Werten, sollte so einen Hänger simulieren können? Oder habe ich jetzt ein Denkfehler.

Würde gern mal sehen welchen Wert der Arduino liest bei verschiedenen Widerständen.
 
Ok, ich dachte der Wert, der da eingelesen wird, hängt mit der Empfindlichkeit zusammen.

Ich habe noch keine Hänger mit Beleuchtung bzw. Achsen mit Widerstand (sowas in der Art habe ich irgendwo mal gelesen) und kann das somit nicht testen.

Ein einfachen Widerstand auf die Gleise legen, mit unterschiedlichen Werten, sollte so einen Hänger simulieren können? Oder habe ich jetzt ein Denkfehler.

Würde gern mal sehen welchen Wert der Arduino liest bei verschiedenen Widerständen.


Du sollst wenigstens einen Wagen besorgen und die Räder mit einem Widerstand von etwa 8-15 kOhm überbrücken. (sMD + Leitlack). Pro Wagen brauchst du wenigsten 2 solche Achsen.
Es ist wichtig denn du musst auch die Bewegung simulieren, also nicht nur einen Widerstand aber auch die Kontakteigenschaften..
 
@Andre1980
Die NEM 624 schreibt vor, dass ein GBM bei 15kOhm über den Schienen sicher ansprechen muss. Du kannst ruhig diesen darüber legen und dann mal den AD-Wert auslesen.
Das generelle Problem bei Waggons ist, dass der Auflagedruck oft nicht ausreicht, um einen ausreichenden Kontakt herzustellen. Es liegt daran, dass in den meisten Fällen das von NEM 302 empfohlene Waggongewicht von 0,25g/mm Länge nicht errreicht wird.
 
Ich finde den 15 kOhm relativ hoch. Es funktioniert bei Gleisen ohne Schotter. Auch ist eine Frage wie man den 15 kOhm definiert. Ein Waggon mit 15 kOhm Achswiderstand wird schon Probleme machen. Deswegen würde ich den Wagenwiderstand lieber auf <10 kOhm definieren. Dann auch bei niedrigen Waggongewicht wird den notwendigen Shuntwiderstand von 15 kOhm liefern.
 
Ich sehe noch 1 Problem. Bei Analogbahnen kann man sehr schwierig die Bremsblocklänge (Bremstrecke) definieren.

Ich habe einige neue TT Loks gemessen. Allein die Lokomotiven bei etwa 10 V Spannung hatten einen Auslauf von 10-20 cm ( jetzt habe ich die genauere Ergebnisse nicht bei mir). Also man muss mit etwa 30-45 cm langen Blocks rechnen. Mit uP wäre es möglich die Bremskurve zu messen, und entsprechend dann bremsem. Das ist aber schon ziemlich aufwendig.
Wenn ich richtig sehe hier arbeitest du mit zwei GBM pro Blockabschnitt, ein GBM ist für die Bremsstrecke, der andere GBM ist für den Halteabschnitt vor dem Signal. Wenn es wirklich so ist, kannst du die Zeit zwischen den 2 Abschnitten messen und davon die Bremskurve ausrechnen. ( wie schnell muss du bremsen).
 
Also in meinem Sketch wird nur gemessen ob in einen der Beiden Blockabschnitte sich ein Zug befindet (bzw. drei Abschnitte beim Orginal). Dieses wird beides von einem analogen Eingang gemessen.

Der Bremsweg ist beim gleichen Zug immer gleich lang, da die Diferenz zwischen Fahr und Mindestspannung gebildet, und davon ein Inkrement, was den PWM Wert halt schneller bzw. langsamer sinken lässt.

Eine Abweichung von Loks wird nicht abgefangen. Da bin ich gerade überfragt wie ich das realisieren soll.

Beim Orginal ist eine Spannungsmessung im Brems und Anfahrtsabschnitt. Diese brauche ich aber nicht zum Bremsweg ausrechnen, daher habe ich sie weggelassen.
 
Was ist die Fahrspannung und Mindestspannung? In PWM hast Du fixe Spannungen oder änderst Du auch die Amplitude?
Und wie ist es wenn ein Zug einmal mit 3 Wagen dann mit 10 unterwegs ist?
Wie ist es bei Steigungen?
Diese ganze Sache mit Blocksteuerung ist leider nicht so einfach wie man oft denkt. Ich habe auf unserer Anlage über 20 Blöcke und verschiedene Züge ( neue, und auch uralte). Bergab einige schwere Züge manchmal überfahren die Blockstellen. :-(
 
Es ist recht einfach ( Nun ja..) vor den Bremsabschnitt einen Messabschnitt von ca 10cm zu legen. Am Anfang und am Ende wird jeweils eine Durchlichtschranke aufgebaut. Man misst die Zeit, die die Zugspitze braucht, um von der ersten zur zweiten Lichtschranke zu gelangen.
Dann kommt so ein bisschen Physilk ins Spiel:
Die Geschwindigkeit ist ja proportional der angelegten Fahrspannung und der Last, die an der Lok hängt. Da die aber konstant ist, kann man die als Bestandteil des Proportionalitätsfaktors p sehen. Man setzt sie also V= p*U.
Messabschnittlänge s1, Bremsabschnittlänge s2, Zeit zum Durchfahren t1, Zeit zum Bremsen t2.
Also (1) V= p*U = s1/t1 Fürs gleichmäßige Bremsen gilt: (2) V = 2*s2/t2 und natürlich (3) s2= 1/2*a*t2^2. a ist Beschleunigung, d. h. die Änderung der Geschwindigkeit pro Zeit oder die gesuchte Änderung der Spannung pro Zeit beim Bremsen.
Zuerst rechnet man die Zeit t2 aus (1) und (2): t2= 2*s2*t1 / s1. Dann folgt aus (2) und (3): a= V/ t2
Die Änderung der Spannung pro Zeiteinheit ist dann U*s1 /( 2*s2*t1). Also ändert sich die Spannung pro Intervall dt so:
-dU = - U*s1 *dt / (2*s2*t1). Das Minuszeichen deswegen, weil die Spannung ja abnehmen soll und nach n Intervallen dt ist die aktuelle Spannung U(n*dt) = U -n*dU.
Man kann dt = 100msec setzen und fährt dann die Spannung bis zur Kriechspannung herunter, um immer in den Halteabschnitt zu kommen. Diese Rechnerei für dU muss nur einmal am Bremsanfang ausgeführt werden und das lässt sich in C++ ( Arduino) kinderleicht programmieren.

Noch ein P.S.
Anstelle der Lichtschranken kann man auch einen normalen GBM-Abschnitt einbauen. Man misst dann die Zeit vom Ansprechen im Messabschnitt bis zum Ansprechen im Bremsabschnitt. Bei der Rechengeschwindigeit des Arduino ist der 'Fehler' nicht relevant.
 
Zuletzt bearbeitet:
Sogar geht es auch einfacher. Wenn man die Lichtschranken auf gleiche Länge wie der Bremsabschnitt ist stellst, die Zeit was man bekommt ist direkt Equivalent zum Bremsparameter.

Also z.B. Wenn die Lichtschrankenentfernung 5 sec ist, auch die PWM muss in 5 Sec von Vmax auf Kriechgeschwindigket sinken. Dann wird der Zug immer im Bremsabschnitt bremsen und mit Kriechgeschwindigkeit zum Halteabschnitt fahren.
 
Zuletzt bearbeitet:
Was ist die Fahrspannung und Mindestspannung? In PWM hast Du fixe Spannungen oder änderst Du auch die Amplitude?
Und wie ist es wenn ein Zug einmal mit 3 Wagen dann mit 10 unterwegs ist?
Wie ist es bei Steigungen?
Diese ganze Sache mit Blocksteuerung ist leider nicht so einfach wie man oft denkt. Ich habe auf unserer Anlage über 20 Blöcke und verschiedene Züge ( neue, und auch uralte). Bergab einige schwere Züge manchmal überfahren die Blockstellen. :-(
Fahrspannung ist die, die der Fahrregler ausspuckt. Mindestspannung stellst du über den Poti ein.
PWM auf 100% (255 im Arduino) schickt die Fahrspannung ungehindert durch den IRF.
Die Fahrspannung wird vom Arduino gemessen.
Die Mindestspannung wird zur Fahrspannung „gemapt“. Z.B. Die Fahrspannung ist 8V und die Mindestspannung ist 4V. Dann weist der Arduino der Mindestspannung im Block 50% PWM zu (8/4). Also wird das PWM Signal nur bis 127 reduziert. Die Differenz wird durch eingelesenen Poti Wert (Bremsweg Poti) geteilt und somit ein Erhöhungs bzw. Verringerungswert errechnet. Dadurch ergibt sich, je größer die Differenz, um so größer die Verringerung/Erhöhung in der gleichen Zeit. Sprich wenn die Fahrspannung höher ist, sinkt der PWM in größeren Schritten. Dadurch ergibt sich immer die gleiche Bremswegstrecke.

Eine andere Geschwindigkeit bei gleicher FahrSpannung ändert natürlich die Bremsweglänge.
 
Interessante Lösung. (Neu für mich. :) )

Normalenweise arbeitet man nicht mit beiden Spannungen. Also für Fahrspannung nimmt man eine fixe Spannung, z.b. 10 V und die Geschwindigkeit ist nur von PWM abhängig.
 
Der Bereich zum Geschwindigkeit messen soll 10cm betragen?

Würde nicht eigentlich ein kleinerer Bereich reichen? So ca. 1cm? Der Arduino ist ja ziemlich schnell und sollte auch bei 1cm die Geschwindigkeit ermitteln können, oder?

Ich habe relativ kleine Bahnhöfe auf der Anlage und ein 10cm Bereich würde da viel Strecke wegnehmen.
 
In Prinzip es ist wurscht. Ich habe nur deswegen gleiche Länge wie der Bremsabschnitt vorgeschlagen, denn dann must du die Zeit nicht umrechnen. Es ist genug eine Optostrecke wenn alle Bremsabschnitten gleich lang sind. Du brauchst nicht unbedingt die Geschwindigkeit ermitteln, es reicht die Zeit wie lange der Zug für die feste Entfernung braucht. Ich nehme an beim Bremsvorgang arbeitest du auch mit der Zeit ( den PWM Signal von Fahrt auf Kriechen zu reduzieren).
Die Optostecke kann überall sein, denn du musst nur einmal pro Zug die Zeit ermitteln...
 
Zurück
Oben