Neuling mit Fragen zu Modellhaus-Beleuchtung (Modellbahn)

Moin Mitreisende,

über einen Beitrag im Stummiforum (wer es nicht kennt, dass ist ein Modellbahner Forum) wurde ich inspiriert, meine Modellhäuser mit einer wechselnden Beleuchtung auszustatten. Angesichts der Vielzahl der Häuser lege ich, wie der TE dort auch, auf eine möglichst kostengünstige Lösung Wert. Wurde dies dort - der Beitrag ist etliche Jahre alt - noch mittels Attiny (ggf. ergänzt durch Schieberegister) gelöst und der Arduino nur zur Programmierung verwendet, ist dies aufgrund der zwischenzeitlichen Preisentwicklung obsolet geworden.

Die verfügbaren 20 Ausgänge meines Ardunio Nano (einen hatte ich noch hier, Nachschub ist geordert) reichen auch für meine Erfordernisse der Großstadthäuser (ich baue Berlin) durchaus aus. Das Testhaus bspw. verfügt über 4 Etagen. Unten ein Ladenlokal, darüber 3 Etagen mit je 4 Räumen.

Auf der Suche, wie das mittels des Ardunio zu realisieren wäre, bin ich auf diesen Beitrag gestossen, der den Großteil meiner Anforderungen bereits beinhaltet. Allerdings sind meine Programmierkenntnisse sehr alt. Sie stammen noch aus der Zeit des Atari ST, damals mit GFA Basic :wink: Also muss ich noch viel lesen, um die hier vorgestellten Programmstrukturen zu verstehen.

Ich würde daher gerne den Sketch wie folgt anpassen

  1. Zum Programmstart (ausgelöst durch Einschalten der 5V Spannungsversorgung) soll der einzelne Arduino zunächst eine einstellbare Zeit mit dem Start des Beleuchtungsprogramm warten, damit nicht alle Häuser zeitgleich loslegen. Ideal wäre dafür ein 'delay' mit Randomwert, aber man hat mir gesagt dass der erste Randomwert bei mehreren Arduinos immer gleich wäre und der Befehl damit ins Leere laufen würde.

  2. Die Ein-/Ausschaltzeiten wären bei mir nicht so fix wie bei den Leuchttürmen. Stattdessen würde ich in die Tabellen lieber mehrere Zimmer-abhängige Werte eintragen und diese zusätzlich um einen Randomwert ergänzen, damit die einzelnen Häuser zugig 'auseinander laufen'.

  3. Zusätzlich sollen die 3 Wohnzimmer eine Fernsehersimulation erhalten. Lösung dafür mittels PWM gibt es ja, nur wie ich die in die Hauptroutine mit einbinde, ist mir momentan noch nicht ganz klar. Vermutlich via Aufruf einer Subroutine.

Zunächst aber meine Eingangsfragen:

Darf ich die hier vorgestellten Lösungen so ohne weiteres weiterentwicklen ? Ggf. mit Zustimmung der Autoren.

Soll ich für mein Thema ggf. einen neuen Fred aufmachen ?

Danke und Gruss
LG Oliver

Mach nen neuen Hermann, äh Thread auf.

Hab den Beitrag Abgespalten.
Grüße Uwe

stadtbahnzug:
...
Auf der Suche, wie das mittels des Ardunio zu realisieren wäre, bin ich auf diesen Beitrag gestossen
...

Auf welchen Beitrag?

Gruß

Gregor

Hi

gregorss:
Auf welchen Beitrag?

Gruß

Gregor

GLG (Google lässt grüßen) Neuling hat ne Frage Projekt Leuchtturm-Karte, das 'Original'

Dieses Mal hat sogar die Board-Suche auf Anhieb das Passende ausgespuckt :o

MfG

postmaster-ino:
Darf ich die hier vorgestellten Lösungen so ohne weiteres weiterentwicklen ...

Was Du möchtest, ist schneller selbst programmiert. Wichtig ist im Grunde nur, dass Du die „Mechanik“ eines endlichen Automaten verstanden hast. Dann kannst Du jeden verfügbaren Pin blinken und schalten lassen, wie's Dir Spaß macht. Guck z. B. nach der „Nachtwächtererklärung“ oder lies mein Geschreibsel dazu. Ein sehr einfaches Beispiel zum Einstieg ist „Blink without delay“ in Datei->Beispiele->2.Digital.

Gruß

Gregor

Und ändere den Threadtitel in „nochmal belebtes Haus in Modellbahn“ oder so.

Oder such nach sowas, findest garantiert hunderte.

postmaster-ino:
HiGLG (Google lässt grüßen) Neuling hat ne Frage Projekt Leuchtturm-Karte, das 'Original'

Dieses Mal hat sogar die Board-Suche auf Anhieb das Passende ausgespuckt :o

Die "Board-Suche" ist auch (nur) eine Google-Suche. :slight_smile:

Hi

Genau deshalb hatte ich GLG dabei gepackt :wink:
... und mein Erstaunen, daß ich mit der Board-Suche sogar auf Anhieb das Passende gefunden hatte - Das kenne ich auch schon anders ...

MfG

Moin Mitreisende,

ok, Danke erstmal. Und wie gewünscht Thread-Titel geändert.

Inhaltlich gehts erst nächste Woche weiter :wink:

Merci und Gruss
Oliver

stadtbahnzug:
Darf ich die hier vorgestellten Lösungen so ohne weiteres weiterentwicklen?

Manche Bibliotheken haben einen Hinweis zum Copyright, das sollte man beachten. Sonst kann ich nur aus dem Englischen zitieren, denn ich stehe auf den Schultern von Giganten, wen soll ich da nennen? Der normale Menschenverstand sollte Dir helfen. Wenn Du mal schreibst, meine Codeschnipsel hätten Dir geholfen, würde ich mich freuen, sonst kannst Du mit meinen Sachen machen, was Dir beliebt. Kontrollieren kann ich es ja sowieso nicht.

stadtbahnzug:
... mittels Attiny (ggf. ergänzt durch Schieberegister) gelöst und der Arduino nur zur Programmierung verwendet, ist dies aufgrund der zwischenzeitlichen Preisentwicklung obsolet geworden.

Ich habe ein Rathaus mit ATtiny85 und zwei Schieberegistern beleuchtet.

stadtbahnzug:
Die verfügbaren 20 Ausgänge meines Ardunio Nano (einen hatte ich noch hier, Nachschub ist geordert) reichen auch für meine Erfordernisse der Großstadthäuser (ich baue Berlin) durchaus aus. Das Testhaus bspw. verfügt über 4 Etagen. Unten ein Ladenlokal, darüber 3 Etagen mit je 4 Räumen.

Bitte achte auf den maximalen Strom je Pin, je Port und je µC! Das Datenblatt gibt Dir Auskunft, im Zweifel kannst Du fragen.

stadtbahnzug:
... aus der Zeit des Atari ST, damals mit GFA Basic :wink:

TRS80 mit Basic grüßt!

Einfach GOTO durch andere Sprachelemente ersetzen, dann bist Du schon fast Experte. Hauptsache wäre, Du hast strukturiertes Programmieren gelernt, dann wird das!

stadtbahnzug:

  1. ... der erste Randomwert bei mehreren Arduinos immer gleich wäre und der Befehl damit ins Leere laufen würde.

Der Zufall wird berechnet und ist damit nicht zufällig. Mit randomSeed() und einem Analogwert von einem unbeschalteten analogen Eingang, der quasi als Antenne wirkt, wird es ausreichend zufällig für eine Beleuchtung.

stadtbahnzug:
2. Die Ein-/Ausschaltzeiten wären bei mir nicht so fix wie bei den Leuchttürmen. Stattdessen würde ich in die Tabellen lieber mehrere Zimmer-abhängige Werte eintragen und diese zusätzlich um einen Randomwert ergänzen, damit die einzelnen Häuser zugig 'auseinander laufen'.

Ja, macht Sinn.

stadtbahnzug:
3. Zusätzlich sollen die 3 Wohnzimmer eine Fernsehersimulation erhalten. Lösung dafür mittels PWM gibt es ja, nur wie ich die in die Hauptroutine mit einbinde, ist mir momentan noch nicht ganz klar. Vermutlich via Aufruf einer Subroutine.

Du mußt minimal blockierend programmieren, weshalb zeitfressende while- oder for-Schleifen ebenso tabu sind wie delay(). Die Schleife loop() muß möglichst schnell durchlaufen werden.

Vermutlich kennst Du die MobaTools mit der Eieruhr, die solltest Du in Erwägung ziehen. Sonst verwendest Du millis() für Zeiten.

Wenn Du prozedural rangehst, sollten Felder und Funktionen selbstverständlich sein. Vergleichbares dürftes Du von Basic kennen, hoffe ich mal, oder? C ist restriktiver, weshalb Variablen einen festen Typ zugewiesen bekommen müssen. Noch blöder sind Zeichenketten, aber damit wirst Du nicht zu tun haben.

Ich fand OOP, als es erfunden wurde, nur überflüssig. Inzwischen habe ich mich etwas dem Thema genähert. In manchen Fällen macht das sogar auf einem ATmega328 für mich Sinn. Nun sind wir bei C++ gelandet. Bei 12 Räumen und drei Fernsehersimulationen könnte ich mir OOP für das belebte Haus vorstellen. Soweit ich mich erinnern kann, gab es das in diesem Forum noch nicht. Würde Dich das reizen?

Sollen Deine Häuser vernetzt werden, damit sie beispielsweise die Uhrzeit mitgeteilt bekommen? Dann könntest Du den CanBus verwenden, damit habe ich schon mal gespielt (UNO - Mega - Teensy mittels CAN-Bus verbinden). Zukunftsmusik, ja schon, aber dann solltest Du die SPI-Pins 10 bis 13 freihalten. Auch A4 und A5 haben als I2C-Pins Sonderbedeutung und möchten eventuell dafür freigehalten werden. Daß D0 und D1 für USB reserviert sind, weißt Du sicherlich. Da wird es dann in Deinem Haus schon etwas dunkler. Zusammen mit der maximalen Strombelastung des µCs ist eventuell doch noch ein preiswertes Zusatz-IC notwendig.

Statt Nano wäre auch ein ProMini, also ein Nano ohne USB, möglich. Mehr Pins hat der Mega 2560 PRO, leider auch zu einem höheren Preis, oder ein Mega2560-CORE mini. Es gibt ja auch Hochhäuser :wink:

Alle Links dienen nur der Anschauung!

Ich möchte Dir nur Möglichkeiten aus meinem Blickwinkel aufzeigen. Was Du davon verwirklichen möchtest, bleibt Dir überlassen. Auf jeden Fall würde ich mich bei diesem Thema freuen, wenn Du es zu einem erfolgreichen Ende führst und zum Schluß ein funktioniernder Sketch mit dem Foto eines Hauses von Dir dokumentiert wird. Viel zu viele Themen bleiben leider unvollendet.

Darf ich die hier vorgestellten Lösungen so ohne weiteres weiterentwicklen ? Ggf. mit Zustimmung der Autoren.

Meine Zustimmung, für meinen Code, kann ich dir geben.

Über eine jeweilige Rückmeldung wäre ich nicht böse.

Nun sind wir bei C++ gelandet. Bei 12 Räumen und drei Fernsehersimulationen könnte ich mir OOP für das belebte Haus vorstellen.

Aus meiner Sicht ist die OO Vorgehensweise hier ohne Alternative.

Könnte man hier die Leds nicht multiplexen, um aus den vorhandenen restlichen Pins das Maximum herauszuholen?

Könnte man hier die Leds nicht multiplexen,

Charlieplexing

APA102 oder vergleichbare

combie:
APA102 oder vergleichbare

Da wir im Farbfernsehzeitalter leben, könnte man das Fernsehflimmern gut damit abbilden, was auch bei vielen Fernsehern nur zwei Pins benötigt. Leider sind diese LEDs mit eingebauter PWM-Logik etwas teurer als weiße.

Mit einem Nano bespaße ich 150 APA102 Lichtpunkte in meiner Bar. Das würde auch für ein Hochhaus genügen.

Moin Mitreisende,

zunächst mal vielen Dank für Eure zahlreichen Beiträge sowie das damit verbundende Interesse an meiner Idee. Ich nehme das zum Anlass, nochmal ein paar Gedanken zur Idee darzulegen.

Was mich an dem Stummiprojekt fasziniert hat, dass man mit einer Low-Cost Lösung einen wirklich interessanten Beleuchtungseffekt erzielen kann. Genau darum geht es mir. Nur das es heute kein Attiny mehr ist, sondern ein Arduino für deutlich unter 1 Euro.

Es müssen auch keine High-End-Lichteffekte sein, aber eben deutlich mehr 'Leben' als das eine Lämpchen, dass man früher in Modellhäuser eingebaut hat.

Das aufgrund der verfügbaren Pins des Arduino Nano und der begrenzten Ausgangsleistung Grenzen bestehen ist mir klar, macht aber nichts. Die meisten Zimmer haben eh nur eine LED, die noch dazu mittels 1 - 1,5k Vorwiderstand ziemlich im Licht reduziert ist (oder habt Ihr immer Festbeleuchtung an ;-? ) Und in manchen Zimmer geht halt auch mal gar kein Licht an, macht doch nichts.

Die grundsätzliche Technik der MoBa-Steuerung beruht ohnehin auf dem OpenDCC Projekt, wobei ich viele Komponenten selbst löte. 1. weil es mir Spass macht, 2. weil man so die Kosten im Griff hält. Natürlich könnte ich für die Häuser auch bspw. den Mobalisten aus dieser Reihe benutzen, im Vergleich zum Arduino wäre das aber erheblich teurer. Ggf. benutze ich die aber für Elemente, bei denen 12V notwendig sind und zum 'Einschalten der Arduinos'.

Zu mir selbst. Ich lebe eigentlich im Norden, unter der Woche aber beruflich in Nordhessen. An den Abenden dort verbringe ich meine Zeit recht häufig mit Konstruktionen rd. um mein Projekt,. Zum Teil drucke ich etliche Teile auch auf zwei hier stationierten 3D-Druckern. Einen Eindruck findet Ihr, wenn Ihr wollt, unter berlin1zu87.de

Ein Bild des relevanten Haus habe ich mal eingefügt

.
Sicher nur von der 'falschen Seite', die Zimmerchen liefere ich mal nächsten Wochenende nach.

Insofern dient dieses Projekt hier auch nur dazu, meine seit 30 Jahren verkümmerten Programmierkenntnisse mal wieder etwas aufzufrischen. Der Anfang eines Skteches auf Basis des Hinweises von Gregor ist schon mal gemacht. Sicher schlecht und deutlich zu Speicher-aufwändig. Aber dafür lässt es sich zumindest schon mal erfolgreich kompilieren.

Mal sehen, wie es weiter geht :wink:

Merci und LG
Oliver

stadtbahnzug:
zunächst mal vielen Dank...
...
Mal sehen, wie es weiter geht :wink:

Schön, dass Du Dich nochmal meldest.

Ich weiß ja nicht, wie gut Deine Programmierkenntnisse sind. Wichtig ist auf jeden Fall, dass Du beim Programmieren vom Start weg so arbeitest, dass Du den Überblick nicht verlierst und Dein Programm so schreibst, dass Du Dir viele (wenn nicht alle) Möglichkeiten offen und die Software wartbar hältst.

Meiner Meinung nach ist ein endlicher Automat das beste aller Konstrukte. Und via Multiplexing lassen sich viel mehr LEDs zum Leuchten bringen als ein Arduino Pins hat. Hier z. B. bedient ein Nano gerade 49 LEDs, die unabhängig voneinander pulsieren und gelegentlich die „Richtung des Pulsierens“ ändern.

Gruß

Gregor

Moin Mitreisende,

ja Gregor, genau so sehe ich das auch. Ich will verstehen, was da abläuft und ggf. eingreifen können. Das sieht dann aus Sicht der 'Profis' zunächst sicher nicht besonders proffesionell aus, aber es funktioniert (hoffentlich) ich behalte den Überblick. 'Schick machen' kann man das dann sicher zu einem späteren Zeitpunkt immer noch. Wenn ich die Speicherbelegung betrachte, wird das sogar sicher erforderlich sein :wink:

Ich werde auch erstmal 'nur' den Code für die unterste Etage schreiben und am nächsten Wochenende die Hardware - sprich also die LEDs - in das Gebäude einbauen und dann mal testen. Die weiteren Etagen sind ja dann eher 'Copy and Paste'.

Zu meinen Kenntnissen. Bezogen auf den Arduino nahe Null, deshalb will ich es ja lernen. In GFA habe ich damals zwei Programme programmiert. Ein Rechen-basiertes - das hat Lottozahlen gezogen, sortiert, und mit Tips verglichen, Einsätze und Gewinne berechnet. Angesichts der damaligen Verhältnisse war am Ende eher entscheidend, das Proggi auf Geschwindigkeit zu trimmen. Danach ein eher grafisch-basiertes, ein Pferderennen. Die Gäule wurden aufgrund einiger Parameter über den Bildschirm gehetzt, aber es kam mir eher auf die Grafik (damals noch verschiedene Sprites) an.

Was ich daraus aber gelernt habe, möglichst 'sauber' und nachvollziehbar zu programmieren. Sonst sucht man sich am Ende bei Fehlern schnell einen Wolf.

LG Oliver

stadtbahnzug:
Zu meinen Kenntnissen. …

Dann bist Du ja ein erfahrener Programmierer mit “Nachholbedarf” bei Arduino. Daher mache ich Dir gleich mal einen etwas anspruchsvolleren Vorschlag als Anregung.

Bei vielen Zimmern, in denen eigentlich immer dieselben Dinge passieren, bietet sich OOP aus meiner Sicht als Lösung an.

#include <MobaTools.h>      // https://github.com/MicroBahner/MobaTools
const byte randomPin = A5;  // ein freien analoger Pin
class Zimmer {
    const byte ledPin;      // Pin der LED
    const uint32_t minAn;   // minimale Einschaltzeit in ms
    const uint32_t maxAn;   // maximale Einschaltzeit in ms
    const uint32_t minAus;  // minimale Ausschaltzeit in ms
    const uint32_t maxAus;  // maximale Ausschaltzeit in ms
    EggTimer Schaltzeit;
  public:
    Zimmer(const byte ledPin, const uint32_t minAn, const uint32_t maxAn, const uint32_t minAus, const uint32_t maxAus)
      : ledPin(ledPin), minAn(minAn), maxAn(maxAn), minAus(minAus), maxAus(maxAus), Schaltzeit() {}
    void init() {
      pinMode (ledPin, OUTPUT);
    }
    void schalten() {
      if ( !Schaltzeit.running() ) {
        randomSeed(analogRead(randomPin));
        if (digitalRead(ledPin)) {
          Schaltzeit.setTime( random(minAus, maxAus) );
          digitalWrite(ledPin, LOW);
        } else {
          Schaltzeit.setTime( random(minAn, maxAn) );
          digitalWrite(ledPin, HIGH);
        }
      }
    }
};
Zimmer zimmer[] = {
  // ledPin, minAn, maxAn, minAus, maxAus
  {2, 1000, 5000, 1000, 2000},  // erstes Zimmer; jedes weitere Zimmer eine Zeile
  {3, 1000, 2000, 5000, 10000}, // zweites Zimmer
  {4, 10, 500, 10, 100}         // Fernsehen
};

void setup() {
  for (Zimmer &z : zimmer) z.init();
}

void loop() {
  for (Zimmer &z : zimmer) z.schalten();
}

Die Zeiten für die Zimmer sind zum Testen extra kurz gehalten…

Anstelle der Eieruhr könnte man auch millis verwenden.

Ich habe hier noch ein älteres Programm rumfliegen, vielleicht kann Dir das auch etwas weiterhelfen. Ebenfalls mit OOP realisiert, habe ich verschiedene Objekte implementiert, um normale Wohnungsbeleuchtung (normal An/ Aus), Gaslampen, Leuchtstofflampen sowie sanftes Blinken zu realisieren.
Das ganze funktioniert nichtblockierend, also über millis().
Habs als .ino angehängt, da der Code zu lang ist.

Eisenbahnbeleuchtung.ino (12.7 KB)