Beier SM-IR-16-2 mit Arduino um 2 Ausgänge erweitern

  • Hallo,

    heute habe ich ein ganz besonderes Leckerli: Die Erweiterung des Beier SM-IR-16-2 um 2 Ausgänge mithilfe eines Arduinos

    Das Beier Lichtmodul SM-IR-16-2 hat insgesamt 16 Ausgänge, von denen 4 für Licht-Sonderfunktionen ("IR: Rundumlicht, IR: Blitzer/Blinker und IR: Lauflicht") vorgesehen sind. Oft werden diese Licht-Sonderfunktionen nicht verwendet, die Ausgänge können aber nicht direkt angesteuert werden und bleiben somit dann unbenutzt.

    Wozu das Ganze?

    Da ich schon alle Ausgänge am Lichtmodul belegt habe aber noch zwei zusätzliche Ausgänge zur Adressierung einer Road-Train ID brauche habe ich mir überlegt, ob ich die Lichtmuster auswerten kann. Da ich nur 3 Auflieger habe reichen mir erstmal 2 Lichtmuster (aus: Trailer 0, Lichtmuster 1: Trailer 1 und Lichtmuster 2: Trailer 2). Trailer 0 ist daher immer aktiv, sofern Trailer 1 oder 2 nicht ausgewählt ist, d.h. er benötigt keine aktive Auswahl und sperrt die gewünschten Funktionen wenn einer der anderen Trailer adressiert wurde.

    Die Umsetzung der Road-Train Steuerung kommt später, hier beschreibe ich erstmal nur die Auswertung, welche mir nachher als Grundlage dient.

    Allerdings kann kann man das auch für ganz andere Zwecke einsetzen, z.B. um einfach nur 2 zusätzliche Verbraucher zu schalten oder auch um Servos oder Fahrregler zu steuern (diese werden dann am Arduino angeschlossen).

    Wie funktioniert das?

    "IR: Rundumlicht" habe ich erstmal verworfen, da die Lichter hier auf- und abschwellen statt einfach nur ein- oder ausgeschaltet zu werden. Zur Auswertung des Signale habe ich Ausgänge 13 und 14 des SM-IR-16-2 mit 2 Eingängen vom Arduino verbunden, die Werte eingelesen und über den Seriellen Monitor ausgegeben und analysiert. Und siehe da, es gibt tatsächlich Zustände an den beiden Ausgängen, die in den beiden Lichtmustern nicht identisch sind:

    • IR: Lauflicht: 1-0 (Ausgang 13 aus-, Ausgang 14 eingeschaltet) -> Trailer-ID 1
    • IR: Blitzer/Blinker: 0-0 (Ausgang 13 und 14 eingeschaltet) -> Trailer-ID 2

    Bitte beachten: Die Trailer-ID entspricht nicht dem binären Wert sondern zählt nur von 0 bis 2 und ich hatte quasi willkürlich "IR: Lauflicht" als das Muster für Trailer-ID 1 festgelegt.

    Da das SM-IR-16-2 minus-schaltend ist liegt wenn kein Lichtmuster eingeschaltet ist auch kein Signal an den Eingängen des Arduinos an. Diese werden daher durch den internen Pullup nach 1 (HIGH) gezogen. Somit entspricht 1-1 der Adressierung von Trailer 0.

    Wo ist das Problem?

    Da sich die Zustände an den Ausgängen permanent ändern (inklusive nach 1-1 beim IR:Blitzer/Blinker) wenn eins der Lichtmuster eingeschaltet wurde würde die Muster-Erkennung dauernd zurückgesetzt werden. Daher muß ein Mechanismus her, der diese Änderungen während des Durchlaufs vom Muster ignoriert und das Signal zum Abschalten (1-1) erst nach Ablauf einer Haltezeit als gültig wertet.

    Das angewandte Prinzip ist ähnlich einer Treppenhauslicht-Schaltung: beim ersten Mal wird das Licht eingeschaltet und jedesmal wenn der Taster gedrückt wird verlängert sich die Zeit wieder. Erst wenn der Taster nicht mehr gedrückt wird geht das Licht nach einer Zeit "t" aus.

    Dafür habe ich eine Zeitpruefen() Subroutine eingebaut, die auch tatsächlich das Licht einschaltet, nämlich die LED an D13. Da wir ja nicht nur eine LED in beiden Fällen einschalten wollen gibt es noch zwei Subroutinen AktionX(), dort kann man die gewünschten Aktionen wie Ausgänge einschalten, Servo steuern usw. ausführen.

    Tja, und dann hast sich beim Testen gezeigt, daß sich gelegentlich doch Zustände einschleichen, die zum jeweils anderen Lichtmuster gehören. Scheinbar ist der Serielle Monitor nicht schnell genug, diese anzuzeigen. So kommt beim "IR: Lauflicht" tatsächlich auch mal ein einzelnes 0-0 pro Durchlauf vor, und löst damit die Aktion für das andere Muster aus. Ähnlich beim "IR: Blitzer/Blinker", hier schleicht sich manchmal ein 1-0 mit mehreren, aufeinanderfolgenden Wiederholungen ein. Da die gewünschten Muster auch mehrfach wiederholt werden habe ich 2 Zähler eingebaut - erst wenn die Mindestanzahl erreicht ist wird das entsprechende Lichtmuster als erkannt gewertet.

    Wichtig ist dabei die Reihenfolge der Auswertung und die Mindestwerte - erst wird "IR: Lauflicht" mit mindestens 10 Ereignissen ausgewertet werden und dann "IR: Blitzer/Blinker" mit mindestens 30 Ereignissen.

    Wie lange dauert das?

    Die Haltezeit ist u.a. abhängig von den Einstellungen am SM-IR-16-2, dort kann man mit dem Trimmer P1 die Geschwindigkeit einstellen. Im Test hat sich gezeigt, das die Erkennung auch bei höchster Geschwindigkeit funktioniert sofern die Haltezeit mindestens 500ms beträgt. Ich denke, diese Verzögerung ist beim Ausschalten vertretbar. Je nach Auslastung des Arduino kann es aber nötig sein, die Geschwindigkeit und/oder Haltezeit anzupassen.

    Sonst noch was?

    Der Trimmer P1 sollte bis zum Anschlag nach rechts (im Uhrzeigersinn) gedreht werden.

    Die DIP-Schalter des SM-IR-16-2 müssen wie folgt eingestellt werden:

    • DIP-Schalter S1.2 off: 4-Kanal Lauflicht (Ausgänge 13 - 16)
    • DIP-Schalter S1.3 off: Lauflicht läuft nur in eine Richtung.

    Gibt es Nachteile?

    Ja. Der offensichtlich Nachteil ist, daß man die Licht-Sonderfunktionen nicht mehr für Beleuchtungs-Zwecke nutzen kann. Dazu kommt die leichte Verzögerung beim Ausschalten aufgrund der Haltezeit.

    Achtung!

    Die Licht-Sonderfunktionen können auch zusammen aktiviert werden, das würde natürlich für Verwirrung sorgen, d.h. die Auswertung würde nicht mehr funktionieren. Ich empfehle daher die Verwendung eines 3-Stellung Schalters (ein-aus-ein) statt Taster und Memory-Funktion, so daß immer nur "IR: Lauflicht" oder "IR: Blitzer/Blinker" eingeschaltet werden kann. "IR: Rundumlicht" darf überhaupt nicht verwendet werden.

    Harte Ware

    Der Sketch kann u.a. mit der gelben Platine verwendet werden, Pin D3 & D4 werden mit Ausgang 13 & 14 des SM-IR-16-2 verbunden. Zusätzlich muß der Minus der Platine mit dem Minus des SM-IR-16-2 verbunden werden. Das Widerstandsnetzwerk darf nicht eingesetzt werden, da der interne Pullup-Widerstand des Arduinos verwendet wird und das SM-IR-16-2 minus-schaltend ist. Soll die schwarze Platine verwendet werden sind Eingang D2 & D3, D7 & D8 oder D11 & D12 empfohlen, hier kann die Verbindung zum SM-IR-16-2 mit einem Servo-Kabel bewerkstelligt werden. Die Pin-Nummern für die Eingänge müssen dann im Sketch entsprechend angepasst werden.

    Zeit für einen Sketch

    In den AktionX() Routinen sollten keine delay() Befehle verwendet werden, da sonst die Gefahr besteht das die Haltezeit abläuft!

    :night

  • Hallo Reiner.

    Coole Idee! :top:top

    Du kannst dem arduino noch Beine machen indem Du die baudrate des seriellen Monitor erhöhst oder ihn ganz abschaltest.

    Ganz abschalten macht das Programm erheblich schneller. Einfach serial.begin und serialprint mit // auskommentieren.

    Viele Grüße

    David

  • Hallo David,

    danke für den Hinweis, durch das Ausklammern außer einer serial.print() Zeile bin ich auf das Problem der ungewollten Zustände gestoßen.

    Den Monitor benutze ich auch nur beim Testen damit ich die Zustände sehen kann oder an welcher Stelle im Programm grade gearbeitet wird. Macht die Fehlersuche einfacher - und ich hatte anfangs viele Fehler drinn. :112:

    Beim fertigen Sketch werden die Ausgaben zum seriellen Monitor alle entfernt oder ausgeklammer (wie oben im Sketch).

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!