Switching BitSwitcher

scolopender

Aktives Mitglied
Mitglied seit
13 Mai 2008
Beiträge
2,432
Punkte für Reaktionen
29
Punkte
48
SP (W)500V mit BS zur "Schaltbox" umbauen

Ich beschreibe hier in Stichpunkten, wie man das Speedport 500V so umbauen kann (Hardware und Software), dass es zwei Schaltausgänge und einen Signaleingang bereitstellt, die dann auch per Bedienoberfläche oder eigenen Applikationen gesteuert und abgefragt werden können. Dafür wird der Telefonteil (VoIP) "geopfert" (ausgebaut bzw. aus der Firmware entfernt).

Diese Modifikation wurde an einem Speedport 500V mit Leiterplatten-Version 613A200079_A1 (lt. Aufdruck) durchgeführt, bei dem der Telefonteil als aufgesteckte Huckepack-Platine ausgeführt ist. Die im folgenden genannten Bauteil-Bezeichnungen beziehen sich auf die o.a. LP-Version. Bei anderen Hardware-Versionen bzw. bei der Ausführung mit WLAN (W500V) können die Bauteilbezeichnungen abweichen bzw. die Modifikation nicht vollständig umsetzbar sein.

Hardware-Änderungen

1. Huckepack-Platine ausbauen
Die Zusatzplatine ist mit einer oder zwei verlöteten Stiftleisten rein mechanisch gesichert. Die Signal-Verbindung wird mit drei vielpoligen Steckverbindern hergestellt, die erst nach dem Ausbau sichtbar werden.
Die Stiftleisten tragen die Bezeichnungen "J2" auf der Basisplatine bzw. "J9" auf der Zusatzplatine und "J4" auf der Basisplatine bzw. "J3" auf der Zusatzplatine (es kann sein, dass "J4"/"J3" nicht existieren).
Die Stiftleisten mit einem Seitenschneider trennen (so geht es am schnellsten), danach die Zusatzplatine vorsichtig abnehmen. Stiftleistenstummel einzeln aus der Basisplatine auslöten (weil's dann einfach besser aussieht).

2. Relais "K1" und TAE-Buchsen "J604" und "J605" ausbauen
Das Relais "K1" ist ein Kleinsignalrelais, dessen Verschaltung mit den TAE-Buchsen für einen universellen Einsatz so recht nicht geeignet ist. Für höhere Schaltlasten und/oder eine galvanische Trennung (z.b. zum Stromnetz) ist die Leiterbahnführung auf der Basisplatine eh nicht ausgelegt.
Das Auslöten geht am besten mit einem Heißluftgerät (ca. 300°, schwache Luftleistung) von der Unterseite der Basis-Leiterplatte aus.

3. Außerdem ausbauen:
RJ11-Buchse "J606", Widerstand "R163" (auf der Oberseite), Widerstände "R623" und R624" (beide auf der Unterseite).

4. Ansteuerung für das Relais "K2" nachrüsten
Dies ist der Nachbau der vorhandenen Ansteuerung für Relais "K1".
Benötigt werden:
"U24": Einfach-Inverter 74LVC1GU04, auf der Oberseite
"R167": Widerstand 10kOhm, auf der Oberseite
"Q14": Transistor NPN BC846A, auf der Oberseite
"D18": Doppeldiode MMBD7000, auf der Unterseite
(Freilaufdiode, fall ein Relais betrieben wird. Hier tut es jede andere Einfach-Diode auch, sofern sie generell als Freilaufdiode taugt).

5. Eingangs-Schaltung nachrüsten
Benötigt werden:
"PC1": Optokoppler, auf der Oberseite
"R164": Widerstand 10kOhm, auf der Oberseite
---: Widerstand 2.2kOhm, bedrahtet
Der Optokoppler hat ausschließlich den Sinn einer Schutzbeschaltung, der Eingang würde sonst direkt mit dem GPIO-Pin des Prozessors verbunden sein.
Ich habe in meinen Bastelvorräten keinen Optokoppler gefunden, der dem im Leiterplatten-Aufdruck angegebenen Anschlussbild entspricht, wohl aber einen SFH610-3, dem ich dann die Anschlussbeine umgebogen und mit der Oberseite nach unten montiert habe. Bezüglich der Anschlussbelegung der Eingangsdiode des Optokopplers bin ich eh wahlfrei.
Der 2.2kOhm-Widerstand dient zur Strombegrenzug für die Eingangsdiode des Optokopplers und wird zwischen die inneren ehedem Relais-Anschlüsse motiert (s. Skizze unten, alternativ an Einbauplatz "C213" auf der Unterseite).

6. Außerdem:
Stiftleiste mit zwei Stiften, wird bei den innenliegenden Anschlüssen für die RJ11-Buchse eingesetzt,
Stiftleiste mit sechs Stiften, wird bei den Spulen-Anschlüssen der Relais eingesetzt (zwei Stifte entfernt).

Code:
Abb. 1 - Einbauskizze

  o [b]*[/b]  J606
   [b][color=red]*[/b][/color] o
          K2   K1
         [color=red][b]*[/b][/color]  [b]*[/b] [color=red][b]*[/b][/color]  [b]*[/b]

         o[b]==[/b]o o  o
         o  o o  o
         o  o o  o

[b]*[/b]   Stiftleisten-Stift
[b]==[/b]  Widerstand 2.2kOhm
[color=red][b]rot[/b][/color] Pluspol
Die Plus-Anschlüsse bei den Schaltausgängen sind die 12V der Spannungsversorgung des SP 500V (nach dem
Ein-/Ausschalter). Die Schaltausgänge schalten nach Masse (Gnd). Der Signal-Eingang ist im Prinzip potentialfrei, der Eingang wird als aktiv betrachtet, wenn die Eingangsdiode des Optokopplers bestromt wird. Die Position des Plus-Anschlusses des Eingangs gilt für die Lösung mit dem umgedrehten Optokoppler. Die verbauten Schalttransistoren (BC846A) sind mit einen Maximalstrom von 100mA spezifiziert.

Firmware-Änderungen

Als Grundlage diente mir die Bitswitcher-Version 0.3.8 (svn co https://bitswitcher.svn.sourceforge.net/svnroot/bitswitcher/tags/0.3.8).
Generell bleibt der VoIP-Teil außen vor, deshalb die Generierung immer mit
# make WITH_VOIP=0
anwerfen (oder das WITH_VOIP=0 in das Top-Makefile aufnehmen).

Der Relais-Ausgang "K1" wird mit GPIO 7 angesteuert, der Relais-Ausgang "K2" wird mit GPIO 35 angesteuert, der Optokoppler- Eingang "PC1" wird mit GPIO 27 erfasst. Die Zugriffe darauf (Lesen zum Abfragen des Schalt- bzw. Eingangszustands, Schreiben zum Setzen des Schaltzustands) leistet ein Kernel-Treiber (extio.c), der hierfür drei character devices implementiert.

Integration des Treibers:
Datei extio.c nach .../dev_tree/bcmdrivers/opensource/char/board/bcm963xx/imp1 kopieren.
Im gleichen Verzeichnis das Makefile um die rot markierte Angabe ergänzen:
Code:
obj-y := board.o cfiflash.o bcm63xx_flash.o bcm63xx_led.o [color=red]extio.o[/color]
In .../dev_tree/bs_extra/start_scripts die Datei preinit.sh um folgenden Abschnitt ergänzen, um die character devices zu erzeugen:
Code:
mknod /dev/extout0 c 200 0
mknod /dev/extout1 c 200 1
chmod 666 /dev/extout*
mknod /dev/extin0 c 200 2
chmod 444 /dev/extin*
Firmware neu generieren und auf das SP 500V als Firmware-Update laden. Beim Booten wird der extio-Treiber automatisch installiert.

Anwenderschnittstelle:
/dev/extout0 bedient den Schaltausgang "K1",
/dev/extout1 bedient den Schaltausgang "K2",
/dev/extin0 bedient den Signaleingang "PC1".
Der Zugriff erfolgt ganz banal über die Standard C-Funktionen fread() und fwrite() (natürlich muss zuvor ein fopen() mit Option "r+" bei den Ausgängen bzw "r" beim Eingang erfolgreich gewesen sein).
Beim Lesen (je Aufruf von fread) wird genau ein Zeichen (ein Byte) zurückgeliefert, das den Schaltzustand wiedergibt:
Zeichen (Ziffer) '0' (0x30): Ein- bzw. Ausgang nicht aktiv
Zeichen (Ziffer) '1' (0x31): Ein- bzw. Ausgang aktiviert
Beim Schreiben der Schaltausgänge (je Aufruf von fwrite) können beliebig viele Zeichen (Bytes) ausgegeben werden, es wird nur das erste davon interpretiert:
Zeichen (Ziffer) '0' (0x30): Ausgang nicht aktiv (abgeschaltet)
Zeichen (Ziffer) '1' (0x31): Ausgang aktiviert (eingeschaltet)

Deshalb funktionieren in einer Applikation, die als Shellscript umgesetzt ist (s.u. Plugin als Beispiel):
Code:
# cat /dev/extout0
zum Schaltzustand lesen und z.B. ein
Code:
# echo 1 > /dev/extout0
zum Einschalten von "K1".

BS-Plugin:
Natürlich darf ein Plugin nicht fehlen, mit dem die "Schalterei" demonstriert und getestet werden kann. Die Datei hierzu heißt extio.cgi und muss als Plugin intalliert werden. In der BS-Bedienoberfläche heißt das Plugin "External I/O". Die Bedienung ist denkbar einfach: Nach Auswahl des gewünschten Schaltzustands für die Ausgänge mit [ Run << ] den Zustand wirksam werden lassen. Angezeigt wird immer der aktuelle Schaltzustand.

Test des Signaleingangs (vgl. Skizze oben):
Plus des Signaleingangs mit dem Plus eines der Ausgänge (z.B. "K2") verbinden, den verbleibenden Anschluss des Signaleingangs mit dem Schaltanschluss des Ausgangs verbinden. Beim Ändern des Schaltzustands des Ausgangs mit Hilfe des Plugins muss der Eingang dem Ausgang folgen.

Mängel:
Das Relais "K1" hat ursprünglich die Aufgabe, bei ausgeschaltetem SP 500V eine direkte Verbindung zwischen der Telefon-Eingangsbuchse (RJ11-Buchse, "J606") und der TAE-Buchse 1 ("J605") herzustellen. Beim Einschalten und nachfolgendem Firmware-Bootvorgang wird dann das Relais aktiviert und damit der Telefonteil der Hardware (die Zusatzplatine) in die Verbindung zur TAE-Buchse 1 eingeschleift. Seltsamerweise und wider Erwarten wird das Relais nicht vom Telefontreiber (endpointdd) eingeschaltet, sondern einmalig vom Netzwerk-Treiber (bcm_enet), mit der Folge, dass das Relais auch bei weg-konfiguriertem VoIP (WITH_VOIP=0, d.h. u.A. kein endpointdd) beim Hochlauf klackert. Das hierfür verantwortliche Bit im Netzwerk-Treiber ist aber identifiziert (und gehackt ...).

Hinweis:
Treiber und Plugin können auch im Voraus ohne den Hardware-Umbau getestet werden (es geht dann halt nur "K1").

Ausblick:
An den beiden Steckverbindern "J602" und "J603", mit denen die Zusatzplatine angeschaltet war, ist ein kompletter Adress-/Daten-/Steuer-Bus verfügbar (22Bit Adressen, 16 Bit Daten). Die Belegung bezüglich Adress- und Daten-Leitungen ist mir weitgehend bekannt, nicht jedoch bezüglich der Steuersignale zum Lesen und Schreiben etc. Für diesen Bus scheinen obendrein verschiedene Betriebsarten möglich zu sein (vgl. board-Treiber der FW). Auch da steckt noch Potential drin.

Das Plugin im Einsatz:

extio.png

Code von Treiber und Plugin im Anhang.

G., -#####o:
 

Anhänge

  • extio.zip
    4.2 KB · Aufrufe: 33
Zuletzt bearbeitet:
Schönes HowTo, aber mir entzieht sich derzeit der Sinn der Aktion. Könntest Du mir mal ein Beispiel nennen bei dem die "Schaltbox" eingesetzt werden könnte ?
 
Coole Nummer ;-)

Du schreibst, dass es (nur mit K1) auch ohne HW-Umbau geht. Der Telefonteil kommt dem also nicht in die Quere, oder?
Ich frage, weil meine Box Platine 613A200093R ist, dort ist der Phone-Teil direkt auf der Platine drauf...

EDIT:
Ich hoffe ja, ich kann meine Frage bald selbst beantworten, aber der Checkout dauert seeeeehr lange ;-)

EDIT 2:
Hab es jetzt gebaut, installieren schaffe ich aber frühestens am Donnerstag...
 
Zuletzt bearbeitet:
MaxMuster schrieb:
Der Telefonteil kommt dem also nicht in die Quere, oder?
Der sollte nicht stören, insbesondere nicht, wenn der zugehörige Treiber (endpointdd) auch nicht vorhanden ist.
MaxMuster schrieb:
... installieren schaffe ich aber frühestens am Donnerstag...
Installieren? Das ist doch dann ein "stinknormales" Firmware-Update.
(Das sollte ich oben so 'reinschreiben.)

Nachtrag:
OK, das mit dem Plugin geht nicht gar so einfach. Ein cat ... oder echo ... lässt sich aber auch über die Komanndozeileneingabe (> Administration) eingeben. Wenn das nicht funktioniert, funktioniert das Plugin auch nicht.

G., -#####o:
 
Zuletzt bearbeitet:
Installieren? Das ist doch dann ein "stinknormales" Firmware-Update.
Hatte ich schon so verstanden, ich habe nur eine "dringende Aufforderung" bekommen, die Arbeiten daran jetzt erstmal einzustellen, und wenn die Regierung das sagt ... ;-)

Ich melde mich, sobald ich das Testen konnte...

EDIT: Hab es kurz draufgebügelt, mit "echo" und "cat" konnte ich den Status lesen, und das Relais hörbar umschalten! Supie!
... und noch kurz extio.cgi ausführbar gemacht, auf der Box "/opt/webs" angelegt und die Plugin-Datei mit scp rübergeschoben, jetzt kann ich schon grafisch schalten ;-)!

Jörg
 
Zuletzt bearbeitet:
GPIOs für LCD-Anbindung?

Hallo,

super Beitrag, endlich kann ich einen meiner W500V wieder einer sinnvollen Verwendung zuführen...

Wäre es auch möglich (mit vertretbarem Aufwand) die 2 GPIOs zur Ansteuerung eines LCDs zu nutzen? Ich hab noch soooooo viele 2x24-LCDs hier liegen, da müsste doch was gehen, oder?

mit freundlichen Grüßen

Thomas
 
multiuse schrieb:
... da müsste doch was gehen, oder?
Vielleicht - im Prinzip sicher. Immerhin ließe sich damit eine synchrone serielle Ausgabe-Schnittstelle (einmal Daten, einmal Takt) realisieren. Das wird aber vermutlich elend langsam. Und nach dem "Wie" brauchst Du mich jetzt nicht fragen.

G., -#####o:
 
Firmware-Änderungen

Als Grundlage diente mir die Bitswitcher-Version 0.3.8 (svn co https://bitswitcher.svn.sourceforge.net/svnroot/bitswitcher/tags/0.3.8).
Generell bleibt der VoIP-Teil außen vor, deshalb die Generierung immer mit
# make WITH_VOIP=0
Kleine Anmerkung: Es geht scheinbar auch problemlos mit Telefonie, was ich jetzt im Einsatz habe:

Nur das Relais ausgelötet und danach die Spulen-Kontakte wieder verbunden, um die Schaltkontakte von der Platine zu "entkoppeln".
Jetzt kann ich mit einem kleinen "custom_call_event.sh"-Skript bei Anruf von bestimmten Nummern (nur ein- bis zweimal "klingeln" lassen und dann wieder "auflegen") das Relais schalten, um ein Tor zu öffnen ;-)

Dazu wird in Custom-Skript erstmal das Relais "ausgeschaltet" (falls mal ein Stromausfall ist wird dann nur einmal beim "Hochfahren" der Toröffner angezogen und dann wieder geöffnet) und dann das "custom_call_event.sh"-Skript angelegt (man könnte es auch aus /opt dorthin kopieren oder ...)
Code:
# Relais aus
echo 0 >/dev/extout0

# Caller-Script anlegen
cat << 'EOF' > /var/custom_call_event.sh

# Wer darf öffnen?!?
allowed_callers="0171234567 0172345678"


case "$1" in
 "RING")
#       echo "RINGING with Caller=$CALLER"  >> /tmp/call.out

        ;;
 "DISCONNECT")
#       echo "DISCONNECT-Caller=$CALLER"  >> /tmp/call.out

        if [ "x$CALLER" != "x" ] && echo $allowed_callers |  grep -q "${CALLER}" 2> /dev/null ; then

                echo 1 >/dev/extout0
                sleep 1
#               echo aus  >> /tmp/call.out
                echo 0 >/dev/extout0
                echo "$(date +"%d.%m.%Y %H.%M"): Opening for $CALLER"  >> /opt/opener.log

        else
                checksetdate
                echo "$(date +"%d.%m.%Y %H.%M"): Unknown caller (${CALLER})"  >> /opt/opener.log
        fi
        export CALLER=''
        ;;
esac

EOF
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.