int Weiche1[4] = {9,7,9,8}; // Weichenpin1 int Weiche2[4] = {11,12,10,10}; // Weichenpin2
Benutzt sie dann aber ohne Index:
1 2 3 4 5 6 7 8
digitalWrite (Weiche1,HIGH); // erste Weiche stellen delay (400); digitalWrite (Weiche1,LOW); digitalWrite (Weiche2,HIGH); // zweite Weiche stellen delay (400); // oder dummy-Impuls zu LED digitalWrite (Weiche2,LOW); digitalWrite (SignalP,HIGH); // zuletzt das Signal
Das funktioniert nicht. ( Das war auch in der Version 5 schon falsch )
Warum definierst Du die Pins jetzt als int und nicht mehr als byte wie in Version 5?
@ Dieter - Das muss man erst einmal mitkriegen, dass in der ganzen Textwüste beim Kompilieren irgendwo in der Mitte diese Hinweise in roter Schrift herumlungern. Tja -- digitalWrite(Weiche1[iii],HIGH) wäre in der Tat besser. Aber Version6 ist ja nicht verloren gegangen und kann korrigiert werden.
Erst einmal gibt es aber die Version 7 http://www.horstbu.de/forum/fischhafen7.ino, die ohne Arrays zurecht kommt und das macht, was sie soll. Eben brutal force und keine elegante for-Schleife. Auch sie benötigt nur 3.186 bytes und damit weniger als 10% des Speicherplatzes des Arduino UNO. Hier könnte man sogar auf einen Output-Pin verzichten, der aber sofort wieder für eine LED-Anzeige am Schaltpult verwendet wird, wenn Gleis M besetzt ist und die Fahrstrasse Kp nach M daher nicht sinnvoll wäre.
Nun kann man ja viel darüber philosophieren, ob diese sequentielle Lösung in Version 7 nicht minderes Handwerk ist im Gegensatz zur eleganten for-Schleife in der Version 6. Version 7 mit seiner "festen Verdrahtung" der Pin-Nummern erspart aber natürlich auch ein paar if/elsif/else-Abfragen, weil der Programmcode gleich auf den individuellen Zuschnitt der Fahrstrasse eingehen kann.
Zitat Nun kann man ja viel darüber philosophieren, ob diese sequentielle Lösung in Version 7 nicht minderes Handwerk ist im Gegensatz zur eleganten for-Schleife in der Version 6.
Das entscheidest ganz allein Du selbst. Wenn das für dich so OK ist, und tut was es soll ist das doch in Ordnung. Die Zahl der Fahrstraßen ist da ja auch noch recht überschaubar. Wenn das mal wesentlich mehr wird kann so ein Ansatz halt Probleme bei der Pflege machen. Wobei man auch da noch etwas optimieren könnte, indem man Codeteile, die bei mehreren Fahrstraßen gleich sind, in Funktionen auslagert. Wenn nur die Pinnummern unterschiedlich sind, kann man die als Parameter übergeben. So lange Du mit deinem Programm klar kommst, ist doch alles OK . Wir können dir aus unserer Erfahrung heraus Vorschläge machen - was Du übernimmst ist deine Sache.
Zitat Version 7 mit seiner "festen Verdrahtung" der Pin-Nummern erspart aber natürlich auch ein paar if/elsif/else-Abfragen, weil der Programmcode gleich auf den individuellen Zuschnitt der Fahrstrasse eingehen kann.
Wenn es wirklich viele Fahrstraßen werden, bringt es die for-Schleife alleine sicher auch nicht, das hast Du da schon richtig erkannt. Dann müssten auch alle Abhängigkeiten in Datentabellen dargestellt werden, so dass das Programm selbst wieder einheitlich ist für alle Fahrstraßen ( so habe ich das bei meinem 'Stellwerk' gemacht ).
Hallo Franz-Peter, was der Arduino machen soll, ist ja einfach - Signale stellen, Weichen stellen und prüfen, ob eine weitere Fahrstrasse zulässig ist. Wobei das letztere der eigentliche Bonus der Arduino-Regelung ist. Die Signale und den Fahrstrom bekäme man ja auch nur mit den Relais hin und letztlich schaltet der Arduino ja auch diese Relais. Aber er löst dann eben auch das Problem mit dem Moment-Impuls für die Weichenstellung.
So, wie er es jetzt macht, ist es das, was ich mir von ihm versprochen habe. Das Programm kann man immer noch optimieren und dann neu aufspielen. Der UNO soll ja nur vier Fahrstrassen regeln bei der Station "Fischhafen". Jetzt geht es an den MEGA, der 16 Fahrstrassen beaufsichtigt bei HAMPSTEDT-ALTSTADT - davon 8 Fahrstrassen und 8 Rangierstrassen Hier kann ich mir zwei Blöcke von Fahrbeziehungen vorstellen, denn vier der Fahrstraßen erlauben zusätzlich eine Rangierstrasse. Da kann ein ähnliches "secur"-Rezept zum Einsatz kommen wie bei Fischhafen - einmal mit vier und einmal mit zwölf Fahr- oder Rangierstrassen als Gruppe. Jedenfalls zeigt mit das Fischhafen-Programm, dass solche Fahrstrassenregelung mit dem Arduino grundsätzlich zu händeln ist und eben auch für analog betriebene Modellbahnen einen Nutzen hat. Jetzt muss ich also erstmal eine Reihe von 22KiloOhm Widerständen für die Schalter des Mega besorgen.
Ich gebe ja zu, dass diese Art der Fahrstrassen-Regelung nicht unbedingt bundesbahn-like ist. Sie soll ja nur das Leben des Bedieners der Modellbahn vereinfachen und vor fatalen Fehlern bewahren. Dessen unggeachtet sind natürlich die angezeigten Signalbilder dann wieder vorbildgerecht. Also - der Betrachter im Vordergrund sieht es wie bei der großen Bahn. Was im Hintergrund abläuft, sieht er eben auf der Modellbahn ebenso wenig wie in der Wiurklichkeit, wenn er als Betrachter auf dem Bahnsteig steht.
Ohne Peripherie hängen die Arduinos natürlich nutzlos herum. Daher IN- und OUT-Verbindungen für UNO und MEGA.
Der UNO wird angesteuert durch vier durch Schalter betätigte Reilais vom 6 m entfernten Schaltpult und ein örtlich gesteuertes Relais, das meldet, wenn Gleis M besetzt ist. Zum Arduino führen die Leitungen links - rot zu 5 Volt, schwarz zu GND und die anderen fünf zu A0 bis A4. Die Platte ist erkennbar dremelgefräst - die Linien scheinen auf der Rückseite durch. Das ist hier ganz altes Material und ehe es weitere Jahrzehnte im Keller herumliegt, kann es sich nützlich machen. Klebte noch das Preisschild von Baderle - Hamburger werden wissen, was ich meine.
Der MEGA wird geschaltet durch 16 Schalter - einer für jede Fahrstrasse. Daher eben auch 16 Widerstände zu 22 KiloOhm. Die Leitungen mit den Pins führen zum Arduino (Pins 54 bis 69) als digitaler Eingang genutzt.
Der Output des Mega wird weitergeleitet durch eine Reihe von ULN2003A, die ihrerseits die Relais ansteuern. Sollte theoretisch ja funktionieren. Witzig ist schon, dass die Fassung für die 16 Beinchen 1,71 € kostet - der Chip selbst aber gerade einmal 25 Cent. Aber den Chip direkt einlöten? Das wäre mir doch zu fisselig bei dem 1/10-Zoll-Raster. Links geht es zum Arduino, rechts zu den Relais
Die OUTPUT-Seite für den UNO folgt dann in den nächsten Tagen.
Inzwischen wurd auch auf den MEGA der Scetch für den Bahnhof Hampstedt-Altstadt aufgespielt. Da es hier um 16 Fahrstrassen geht, kommt die for-Schleife zu neuen Ehren. http://www.horstbu.de/forum/hampold7.ino
Neben der Betätigung vom Weichen und Signalen bei Einstellung und Rücknahme von Fahrstrassen soll der Arduino auch prüfen, ob die neu gewünschte Fahtrstrasse aus Sicherheitsgründen zulässig ist. Dieses Sicherheits-Konzept muss sich natürlich an der vorhandenen Gleisanlage orientieren. Ausserdem benötigt der Arduino klare Anweisungen.
Daher habe ich einen Algorithmus aus einander ausschliessenden Fahrstrassengruppen gebildet. Maximal zwei Fahrstrassen sind möglich und zwar aus Gruppe 1 und 11, 1 und 12 oder 3 und 12. Woher diese Zahlen? Mit einem Raster aus bisher eingestellter Fahrstrasse und gewünschter weiterer Fahrstrasse (im scetch die Variable "watson") wird eine Summe gebildet, die entweder zulässig ist oder nicht. Nicht zulässig ist schon einmal das doppelte einer Gruppenzahl (wäre dann Gegenverkehr), aber auch vielfältige andere Kombinationen wären unzulässig. Knackpunkt dabei ist, dass jede Zahl als Summe von IST und SOLL nur einmal verwendet werden sollte, damit der Arduino ganz exakt weiß, wie er diesen Fall zu behandeln hat.
Hallo Horst, wo kaufst du denn die Fassungen? Sockel, wie von dir gezeigt, kosten 0,25€, mit Abblockkondensator 0,89€ (bei R...). Du solltest allerdings die Sockel um 180° gedreht einlöten. Nicht umsonst haben die Sockel eine Kerbe, die mit der Kerbe des IC deckungsgleich sein sollte. Somit vermeidet man schon mal das falsche Stecken von ICs. Hilft natürlich nicht gegen Vertauschen baugleicher ICs. Volker
Hallo Horst, da hast Du dir ja allerhand Gedanken zu deinen Abhängigkeiten gemacht. Mir wär das zu kompliziert. Ich habe einfach Bitleisten gemacht (würden bei dir in eine word-Variable passen): Eine für die derzeit aktiven Fahrstraßen, und für jede Fahrstraße eine, wo die Bits der unzulässigen anderen gesetzt sind. Einfach mit UND verknüpft und ein Ergenis != 0 bedeutet unzulässig. Aber Hauptsache deine Methode funktioniert so wie Du geplant hast.
Die Preise für deine IC-Sockel sind in der Tat umwerfend . Du hast zwar auch 'Edeltypen' gekauft, aber auch die sollten - wie von Volker schon geschrieben, nicht über 0,25€ kosten. Ich habe eigentlich immer die 'Standard'-Version mir Doppelfederkontakt genommen - das Stück zu 5Cent. Damit sind sämtliche Module meiner Moba-Steuerung ausgerüstet und ich hatte noch nie Probleme damit.
Ausgerichtet scheinen sie mir aber richtig - wenn links die Eingänge sind, gehört die Kerbe beim ULN2003 auch nach oben. Wo allerdings dieser graue Punkt herkommt ... : :
@ Franz-Peter: Der "graue" Punkt ist mit bloßem Auge kein grauer Punkt, sondern in der Realität kaum zu sehen und schwarz schattiert. Den Unterschied erkennt offenbar nur die Digitalkamera. Polarisation? Vielleicht ein Effekt unter bestimmten Lichtbedingungen für maschinelle Platinenbestückung???
Die Sache mit den Bitlisten läuft im Grunde auf etwas ähnliches heraus - man hat ja die Komponenten bereits eingestellte Fahrstraße (oder eben keine) und neu gewünschte Fahrstraße. Was ich in die Kästchen gemalt habe, ist im Grunde ein zweidimensionales Byte-Zulässigeitsarray. Die Werte der Securgruppen sind dabei eher willkürlich - man muss nur dafür sorgen, dass jeder numerische Wert der Addition von alter und neuer Fahrstraße nur in einer Funktion vorkommt und so das Programm ganz eindeutig weiß, was wann zu tun ist - eben durch die if-Auswahl * secur == 0, bedeutet keine Fahrstrasse ist eingestellt und jede ist möglich -- ohhhder * watson == 12||13||14, bedeutet es gibt schon eine eingestellte Fahrtstraße und nur dies ist der Freiraum für eine zweite. Bei dieser einfachen Lösung braucht das Programm dann nicht mehr mit Zeigern, Bitvergleichen und ähnlichem arbeiten.
Naja - nun sind die sechs IC_Sockel da und weitere werde ich wohl in der nächsten Zeit nicht benötigen. Bei R' habe ich bisher noch nicht bestellt - wäre vielleicht eine Alternative. Aber bisher war ich mit dem Service meines bisherigen Lieferanten zufrieden.
Ist nicht die Kerbe im IC da, wo links Kontakt 1 beginnt und im Gegenuhrzeigersinn gezählt bei den grünen Leitungen Pin 8 (GND) ist und gegenüber bei den roten Drähten Pin 9 (COM)? Jeden falls ist der ULN2003 auf den Schaltplänen so dargestellt. Der Kleine mit dem grauen Punkt hängt da nur so locker in seinem Sockel, weil ich einfach nur wissen wollte, wie viel Platz er eigentlich benötigt. Nicht, dass die Sockel so eng beieinander eingelötet werden, dass man die Chips nicht einstecken kann.
Zitat Ist nicht die Kerbe im IC da, wo links Kontakt 1 beginnt und im Gegenuhrzeigersinn gezählt bei den grünen Leitungen Pin 8 (GND) ist und gegenüber bei den roten Drähten Pin 9 (COM)?
Auch der Arduino Uno hat für die 10 Relais die Ausgangsmimik erhalten. Die farbigen Kabel kommen von den Arduino-Pins, die rechten gehen zu den Relais. Auf die IC-Halter kommen wieder die ULN2003A. Dauerte etwas - musste erst einen neuen Lötkolben besorgen, nachdem mein treues 20 Watt-Gerät eines namenlosen Herstellers nach ca. 11 Jahren seinen Geist aufgab. Nachdem alle bekannten Elektronik-Läden in Lüneburg inzwischen dicht sind, bekam ich den Tip, einfach in den nächsten Baumarkt zu gehen. Und siehe da - man kann jetzt dort welche kaufen. Diesmal mit 15 Watt für die 2,54 mm Arie und einen mit 25 Watt für etwas größere Sachen.
Moin Horst, vielen Dank für Deine GUTE Beschreibung!
Da werde ich bestimmt auch für meine Modellbahnanlage einiges Nachbauen.
Hier schaue ich noch öfter rein mach weiter so
Gruß Karsten
Für Klugscheißerei und Neid nehme ich mir KEINE Zeit! www.rafeba.de.tl nicht jeder PC mag das .de.tl !!! Das Maß ist VOLL und ich brauche eine neue Homepage! www.rafeba02.de.tl