.: Christians Technikseite :.
   .: The rotary way of life ...

RS485-Busankoppler für Taster, LEDs und Temperaturfühler.

RS485_Bus
Diese Schaltung ermöglicht die günstige und einfache Anbindung von bis zu 8 Tastern, 8 LEDs und einem Temperatursensor (je Modul) an eine übergeordnete Steuerung mittels RS485 und spart somit viele IOs auf der Steuerung sowie Verkabelungsaufwand. Das Protokoll wurde bewusst einfach gehalten, damit es problemlos in viele verschiedene Steuerungen implementiert werden kann. Aus diesem Grund und der Tatsache, dass im Gebäude "sehr selten" zwei Taster zur selben Zeit gedrückt werden, wurde auf eine Kollisionskontrolle verzichtet.

Motivation.

Einiger meiner Freunde baute vor einiger Zeit sein Eigenheim und setzte dabei bei der Gebäudeautomatisierung auf eine „SPS-artige“ Steuerung von Loxone. Diese bietet bei einem vernünftigen Preis-Leistungs-Verhältnis jede Menge Komfort. Da die IO-Erweiterungen bei der benötigten Menge schnell teuer werden und die Verkabelung ausartet, suchten wir nach einer alternativen Möglichkeit um Taster mit ihren integrierten LEDs und ein paar Temperatursensoren an die Steuerung zu koppeln. Die Verwendung von KNX-Tastern wäre brauchbar, wenn auch nicht besonders günstig. Somit wurde wieder einmal mein Entwicklertrieb geweckt.

Technische Grundlagen.

Die Schaltung wurde für die Anbindung von sogenannten SPS- oder Elektronik- Tastern entwickelt. Diese Taster beinhalten bis zu 8 Taster und 8 LEDs in der Baugröße eines herkömmlichen Schalters. Somit können viele Funktionen ohne riesiger Schalterbatterien an den Wänden, übersichtlich realisiert werden. Bei dem Projekt wurden die Jung 4248TSM verbaut, diese Taster haben 8 Taster mit gemeinsamen Wurzelkontakt und 8 LEDs (24V 1mA) mit gemeinsamer Masse. Ähnliche Taster gibt es auch von anderen Herstellern. Beim Betätigen sowie beim Loslassen einer Taste wird ein Telegramm erzeugt, dies ermöglicht der übergeordneten Steuerung eine Auswertung der Länge des Tastendrucks. Die Temperaturmessung wird durch einen MCP9701 erledigt. Dieser gibt eine zur Temperatur proportionale Spannung aus (V = 0,4V + Temperatur (in °C) * 0,0195), die absolute Genauigkeit ist mit ± 2K zwar nicht besonders gut, doch dies lässt sich in der übergeordneten Steuerung kompensieren. Ist ein Temperatursensor am Busankoppler angeschlossen, wird der aktuelle Messwert im 5 Minuten-Takt übertragen. Es gibt noch einen Reserveeingang, welcher als digitaler oder analoger Eingang verwendet werden kann, mögliche Einsatzzwecke wären Feuchtefühler, IR-Empfänger, ...

Übertragungsprotokoll

Das Übertragungsprotokoll wurde bewusst einfach gehalten, auch wenn dadurch keine 100%ig zuverlässige Übertragung garantiert werden kann. Bisherige Tests mit mehr als 20 Tastern in einem Wohnhaus, zeigte allerdings keine störenden Ausfälle. Lediglich bei der Ansteuerung der LEDs sollte man mit Umsicht arbeiten und keine wilden Blinkorgien oder Lauflichter realisieren, da dies den Bus unnötig belastet und die Gefahr von Datenkollisionen oder Verlusten steigt.

Grundsätzlicher Telegramaufbau:

Startzeichen: <0x02>
Tasteradresse: Grossbuchstabe
Daten
Endzeichen: <0x03>

Busbefehle:

Funktion Datenstrom Beschreibung
Taster A; Taste 3 gedrückt <0x02>AI31<0x03> I: Input; 3: Tasternummer; 1: Ein
Taster B; Taste 2 losgelassen <0x02>BI20<0x03> 0: Aus
Taster A; LED 5 einschalten <0x02>AO51<0x03> O: Output; 5: LED-Nummer; 1: Ein 
Taster A; LED 5 ausschalten <0x02>AO50<0x03> 0: Aus
Taster C; Temperatur <0x02>CT223<0x03> T: Temperatur; 223 = 22,3°C
Taster C; Temperatur <0x02>CT-005<0x03> -005 = -0,5°C
Taster A; Hardwareversion abfragen  <0x02>AHW?<0x03>  
Taster A; Hardwareversion Antwort <0x02>AHW;8;8;1;0;02<0x03>  8xDI, 8xDO, 1xAI, 0xAO; V0.2
Taster A; Firmwareversion abfragen <0x02>AFW?<0x03>  
Taster A; Firmwareversion Antwort <0x02>AFW;01<0x03> V0.1
Moduladresse setzen <0x02>*SETD<0x03> Setze Adresse D
Taster A; Bootloader aktivieren <0x02>ABL!<0x03> alle anderen für 60s stumm


Hardware.

Technische Daten.

  • Versorgungsspannung: 24VDC ±10%
  • 8 digitale Eingänge mit gemeinsamer Masse
  • 8 digitale Ausgänge 24V High Side schaltend (max. 10mA je Kanal)
  • 2 analoge Eingänge (1x Temperatursensor (MCP9701), 1x Reserve)
  • Abmessungen: 40mm x 40mm x 15mm
  • RS485- Bus:
    • maximal 26 Teilnehmer
    • Geschwindigkeit: 19200 Bit/s
    • Datenbit: 8
    • Stopbit: 1
    • Parität: gerade

Schaltung.

Schaltplan Version 0.2

Die 5V Versorgung der Komponenten wird von einem Schaltregler aus der 24V Versorgungsspannung generiert. Der Controller läuft mit 4Mhz, welche von einem Resonator erzeugt werden, dessen Genauigkeit reicht aus um eine stabile Kommunikation zu gewährleisten. 

Eingänge: Die 8 digitalen Eingänge werden von den Pull-Up-Widerständen auf +5V gehalten und müssen von den externen Tastern auf Masse gezogen werden. Die beiden analogen Eingänge (derzeit nur einer programmiert für den Temperatursensor) können 0V bis 5V verarbeiten. Die Anschlussleitungen sollten nicht länger als 30cm sein, um keine Störungen einzufangen, da keine weiteren EMV-Maßnahmen getroffen wurden.

Ausgänge: Die 8 digitalen Ausgänge werden 24V- seitig geschalten. Der MIC5891 ist ein Schieberegister mit integrierten High-Side-Treibern und für diese Aufgabe perfekt geeignet. Die beiden Widerstände R4 und R5 dienen der Strombegrenzung, falls ein ausgangsseitiger Kurzschluss auftreten sollte. Die Anschlussleitungen sollten nicht länger als 30cm sein, um keine Störungen einzufangen.

Layout.

Top Layout Version 0.2 Bottom Layout Version 0.2

Die Platine ist fast vollständig mit SMD- Bauteilen bestückt, um die Abmessungen möglichst gering zu halten. Der Einbau erfolgt in ein modifiziertes Vergussgehäuse (Hammond 1596B107) und ermöglicht den Einbau in einer Schalterdose hinter dem eigentlichen Taster. Die Verbindung zu den Tastern, LEDs und dem Temperatursensor, erfolgt mit etwa 12cm langen Flachbandleitungen, welche durch MicroMatch-Stecker mit der Platine verbunden werden. Dies ermöglicht einen unkomplizierten Anschluss der Peripheriegeräte. Ich habe bei meinen Platinen die Buchse K3 (ISP-Anschluss) nie bestückt, zum Programmieren verwende ich einen passenden Pfostenverbinder, der etwas verspannt in die durchkontaktierten Bohrungen gesteckt wird, die Verbindung reicht zum Programmieren des Controllers. Buchse S1 wird ebenfalls nicht bestückt, da diese im Normalfall ebenfalls nur 1x, beim vergeben der Busadresse, benötigt wird. Hier verwende ich einen Drahtbügel, kleine Zange oder sonstiges.

Fotos.

Platine von unten Version 0.2 Platine von oben Version 0.2 Platine mit Gehäuse Version 0.2

Firmware.

Die Firmware wurde in Bascom geschrieben.
Die folgende Beschreibung soll einen groben Überblick über die wichtigsten Teile der Firmware geben.

Initialisierung.

Nach dem Start wird die Busadresse aus dem ROM gelesen und auf Gültigkeit geprüft, sollte diese außerhalb des gültigen Bereiches (A bis Z) liegen, so kann nur der Programmiermodus der Adresse aufgerufen werden, alle anderen Funktionen sind gesperrt. Der Buskoppler zeigt die Busadresse binär an seinen Ausgängen für 5 Sekunden an. Anschließend zählt er bis 0 und zeigt diesen Zustand binär auf den Ausgängen an. Wenn eine Spannung am Temperatursensor-Eingang anliegt, wird die Temperaturübertragung aktiviert. Abschließend werden die Interrupts aktiviert und in die Hauptschleife gesprungen.

Hauptschleife.

Programmiermodus:

Wird durch das Verbinden der beiden Kontakte von S1 der Programmiermodus aktiviert, werden alle Ausgänge aktiviert und der Buskoppler wartet auf den Befehl zum Setzten der Busadresse (<0x02>*SETx<0x03>), wird eine gültige Empfangen, speichert der Busankoppler die Adresse im ROM und führt über den Watchdog einen Reset aus. Soll keine Adresse gespeichert werden, ist S1 nochmals zu verbinden, dadurch wird ebenfalls ein Watchdog Reset ausgelöst.

alle 500µs:

Wird der Empfangspuffer auf ein vollständig empfangenes Telegramm abgefragt und wenn nötig ausgewertet.
Befinden sich Daten im Sendepuffer und ist der Bus, seit einer durch die Busadresse, ermittelte Mindestzeit frei (Zähler der Sendesperre auf 0), werden Diese gesendet.

alle 10ms:

Nach 20 Ticks des Timers (500µs) werden die Taster eingelesen und in einem Ringspeicher abgelegt, die letzten beiden Einträge müssen identisch sein und von davor liegenen verschieden. Somit wird eine Flankenerkennung und Entprellung erreicht. Wurde eine Flanke detektiert, werden die entsprechenden Telegramme in den Sendepuffer eingetragen.

alle 60s:

Wird wenn ein Temperatursensor beim Start erkannt wurde, die aktuelle Temperatur ein einen Puffers geschrieben.

alle 300s:

Wird aus den Daten des Temperatur-Puffers der Mittelwert gebildet und auf °C umgerechnet. Dieses Ergebnis wird als komplettes Bustelegramm in den Sendepuffer geschrieben.

Interrupts.

Timer0:

Wird im 500µs Takt ausgelöst und incrementiert er den Zähler zur Erzeugung des 10ms-Taktes und decrementiert den Zähler für die Sendesperre.

Empfang auf der seriellen Schnittstelle:

Puffert das letzte empfangene Zeichen und prüft es.
Wird ein Startzeichen (0x02) empfangen, wird der gesamte Puffer gelöscht. Die weiteren Zeichen werden im Empfangspuffer abgelegt, bis der Puffer voll ist oder ein Endzeichen empfangen wurde. Beide Zustände werden der Hauptschleife angezeigt um das Telegramm auszuwerten.
Jedes Mal wenn ein Zeichen empfangen wurde, wird der Zähler für die Sendesperre auf den Startwert [(Busadresse + 5) * 500µs] gesetzt.

Bedienung.

Grundprogrammierung des Mikrocontrollers.

Für die Grundprogrammierung des Mikrocontrollers benötigt man das kostenlose Atmel Studio, ein Programmiergerät und die Dateien aus der „RS485_BCU_V0.2.zip“ (siehe Downloads).
  1. Den Busankoppler mit dem Programmiergerät verbinden und das Programmiergerät mit dem PC verbinden. (Der Busankoppler sollte somit über das Programmiergerät mit Spannung versorgt werden.)
  2. Im Atmel Studio auf "Device Programming" klicken.
  3. Tool, Device (ATmega8A) und Interface (ISP) auswählen und mit "Apply" bestätigen.
  4. Als ersten Funktionstest, kann man versuchen die Device Signature zu lesen, dies sollte ohne Fehlermeldung möglich sein.
  5. Zuerst der heikelste Teil der Programmierung. Unter "Fuses" bei HIGH = 0xC0 und LOW = 0x8F eintragen und mit "Programm" in den Controller speichern. (Hier keine Fehler machen, da man sich ansonsten leicht aus dem Controller aussperrt und den Controller wieder von der Platine löten darf.)
  6. Nun zur eigentlichen Firmware, welche unter "Memories" programmiert wird.
    Unter "Flash" die Datei „TasterRS485_Bootloader_V030.hex“ auswählen und "Programm" in den Controller speichern.
  7. Um sich nacher die Mühe der Adressvergabe über den Bus zu ersparen, kann man diese gleich in den Controller schreiben.
    Unter "EEPROM" die passende Datei „EEPROM_Adresse?.hex“ auswählen und "Programm" in den Controller speichern.
Atmel Studio Verbindungseinstellungen Programmieren der Fuses Programmieren der Speicher

Programmierung der Busadresse.

  1. Die beiden Kontakte von S1 kurz verbinden, um in den Programmiermodus zu kommen.
    Alle Ausgänge sind in dieser Zeit aktiv.
  2. Busadresse mittels <0x02>*SETx<0x03> setzen, wobei x die neue Adresse darstellt, diese muss als Großbuchstabe zwischen A und Z liegen.
    (Dies funktioniert manchmal nicht auf Anhieb, den Busankoppler kurz von der Versorgungsspannung trennen und nochmals versuchen.)
  3. Der Busankoppler übernimmt die Adresse und startet kurz darauf neu.

Ändern der Firmware über den RS485-Bus.

In der Firmware ist ein Bootloader integriert. Es handelt sich dabei um den Standard-Bootloader von Bascom. Durch den Bootloader ist es möglich die Firmware der Busankoppler über den RS485-Bus zu übertragen und kann sich somit den Ausbau der Busankoppler ersparen.
Für das Übertragen der Firmware braucht man einen PC mit direkten Zugriff auf den Bus, über zum Beispiel einen USB-RS485-Adapter oder einen seriellen Netzwerkserver. Wichtig ist, das die Verbindung unter Windows als COM-Schnittstelle eingetragen ist.
  1. Starten Sie die Bootloader.exe und wählen Sie die gewünschte Firmware aus und stellen Sie die Schnittstellenparameter ein.
  2. Öffnen Sie ein Terminalprogramm (HTERM, Hyperterminal, ...) und öffnen Sie eine Verbindung zum Bus.
  3. Aktivieren Sie den Bootloader, im zu updatenden Busankoppler, mit <0x02>xBL!<0x03> wobei x wieder der Busadresse entspricht und zwischen A und Z liegen muss. Als Antwort erhalten Sie  <0x02>x_Bootloader<0x03>.
  4. Der gewählte Taster schaltet für 10s jeden zweiten Ausgang ein und startet anschließend im Bootloader-Modus und ist somit empfangsbereit. Alle anderen Busankoppler schalten alle Ausgänge ein und reagieren weder auf Tastenbefehle noch senden sie auf den Bus, um das Firmwareupdate nicht zu unterbrechen. Nach etwa einer Minute nehmen sie den regulären Betrieb wieder auf.
  5. Da der Bootloader-Modus nach kurzer Zeit wieder verlassen wird, wenn keine Daten empfangen werden, heißt es nun schnell sein.
  6. Schließen Sie die Verbindung im Terminalprogramm und die Schnittstelle, für die Übertragung der Firmware, frei zu geben.
  7. Laden Sie die Firmware mit der Bootloader.exe unter File / Upload in den Busankoppler.
  8. Wenn der Upload erfolgreich war, startet der Busankoppler mit der neuen Firmware. Alle anderen Busankoppler sollten kurze Zeit später ihren Normalbetrieb wieder aufnehmen.

Einbindung in Loxone.

In den unten gezeigten Beispielen hängen die Taster über einen seriellen Server am Loxone und werden daher per UDP-Befehle angesteuert. Bei Verwendung der RS485-Extension gelten die Einstellungen sinngemäß.
Ab der Loxone Firmware 6.xx empfehle ich die Verwendung der Loxone RS485-Extension, da seit dieser Version die UDP-Schnittstelle des Miniservers, bei schnellen Befehlsfolgen, nicht mehr zuverlässig funktioniert.

Tastereingänge.

Tastereingänge Loxone Einstellungen

Die Tastereingänge werden als analoge Eingänge konfiguriert. Dies liegt darin begründet, dass es nur so möglich ist, die 1 im Telegramm als EIN und die 0 als AUS zu interpretieren. Bei der Auswertung als digitale Eingänge müsste man je einen Eingang für Ein und einen für Aus anlegen. Diese würden bei jeder Erkennung einen kurzen Impuls liefern, welcher über ein RS-Flip-Flop in ein brauchbares Signal verwandelt werden müsste. Dies spart man sich alles durch den analogen Trick.
Im Bild rechts sieht man die Einstellungen für die erste Taste des Tasters "A".

Temperatureingänge.

Temperatureingänge Loxone Einstellungen

Die Temperatureingänge werden als klarer weise als analoge Eingänge konfiguriert. Wichtig ist die Vorzeichenerkennung und die richtige Skalierung.
Im Bild rechts sieht man die Einstellungen für den Temperatursensor des Tasters "B".

LED-Ausgänge.

LED-Ausgänge Loxone Einstellungen

Die LEDs werden über den Befehl bei EIN und Befehl bei AUS angesteuert.
Im Bild rechts sieht man die Einstellungen für die erste LED des Tasters "A".

Lizenzen.

  • Die Hardware und deren Dokumentation, sind als Open Hardware Projekt konzipiert und lizenziert. Die zur Anwendung kommende Lizenz, ist die TAPR Open Hardware License in der Version 1.0 oder höher. Die Lizenz kann unter http://www.tapr.org/OHL heruntergeladen werden und regelt die Weitergabe, Veränderung und Haftung des Produktes.
  • Die Firmware des Mikrocontrollers ist als Open Source konzipiert und lizenziert. Die zur Anwendung kommende Lizenz, ist die GNU General Public License in der Version 2.0. Die Lizenz kann unter http://www.gnu.de/documents/gpl-2.0.en.html heruntergeladen werden und regelt die Weitergabe, Veränderung und Haftung der Firmware.

Download.

Schaltplan, Layout, Firmware

Kommentare.



Kommentare (11)

Sortierung
4/5 (3)
Facebookdel.icio.usStumbleUponDiggGoogle+Twitter
Gravatar
frank (riegelsberg, Deutschland) sagt...
kann man irgendwo die platinen fertig kaufen ?
Admin:
Du hast Post.
27 Januar 2016 13.18
Gravatar
Josef sagt...
Hallo Christian

Dein Modul RS485 Busankoppler hoert sich sehr gut an. Wie sind denn deine Erfahrungen soweit? Sieht Du bedenken bzgl. Doppel/Dreifach Klich wenn ich damit Taster abfragen moechte?

Gruss
Josef
Admin:
Hallo Josef.
Also bis jetzt sind die Erfahrungen im Großen und Ganzen gut. Die Elektronik läuft in 3 Projekten ohne Auffälligkeiten (bis zu 22 Einheiten an einem Bus). Mehrfachklicks sind problemlos. Wo man ein wenig vorsichtig sein sollte, ist viele LED-Ansteuerungen zu realisieren, vor allem wenn dann alle gleichzeitig schalten sollten (Zentral). Das ganze Projekt steht und fällt allerdings mit der Anbindung an Loxone, hier muss man manche Firmware-Versionen einfach überspringen, da sie von Zeit zu Zeit immer wieder eine komplett unbrauchbare online stellen.
Christian
26 Mai 2015 21.25
Gravatar
ED (Östereich) sagt...
Hallop Christian,
ich nochmal:
Hast Du vielleicht ein Stückliste der benötigten Bauteile?
Danke
ED
Admin:
Stückliste habe ich nun in das ZIP-File hinzugefügt. Bitte einfach nochmal runter laden.
Christian
14 Februar 2015 14.35
Gravatar
ED (Östereich) sagt...
Hallo Christian,
bin gerade dabei Extensions für Loxone zu erwerben. Werde vorher deine RS485 Lösung probieren. gefällt mir sehrt gut !! Brauchst Du vielleicht Prints? Ich werde 10 Stk. bestellen.
LG
ED
Admin:
Laufen bis jetzt auch problemlos, zumindest seit dem Loxone ihre RS485-Extension im Griff haben. ;-)
Platinen brauche ich keine, danke der Nachfrage.
Christian
14 Februar 2015 14.27
Gravatar
Henry (Deutschland) sagt...
Ist eine Anbindung an eine S7 300 über den Kommunikationsprozessor CP340 (6ES7340-1CH00-0AE0) möglich?

Technische Daten des CP:
Punkt-zu-Punkt
● Leitungslänge, max. 1 200 m
● unterstützte Drucker HP-Deskjet, HP-Laserjet, IBM-Proprinter, Benutzerdefiniert
Telegrammlänge, max.
— 3964 (R) 1 024 byte
— ASCII 1 024 byte
Übertragungsgeschwindigkeit, RS 422/485
— mit 3964 (R)-Protokoll, max. 19,2 kbit/s
— mit ASCII-Protokoll, max. 9,6 kbit/s
— mit Druckertreiber, max. 9,6 kbit/s
Admin:
Hallo Henry.
Ich kenne mich leider mit Siemens SPSen überhaupt nicht aus, da ich normalerweise auf Beckhoff arbeite. Da dieser Kommunikationsprozessor anscheinend nur max. 9600 bit/s kann, müsst man die Firmware der Busankoppler etwas modifizieren. Bedeutet das ASCII-Protokoll bei Siemens, dass man frei definierbare Strings senden und empfangen kann?
Christian
15 Januar 2015 16.45
Seite 2 von 3

Kommentar Hinzufügen

* Pflichtfeld
(wird nicht veröffentlicht)

 
Bold Italic Underline Strike Superscript Subscript Code PHP Quote Line Bullet Numeric Link Email Image Video
 
Smile Sad Huh Laugh Mad Tongue Crying Grin Wink Scared Cool Sleep Blush Unsure Shocked
 
1000
 
Informiere mich via E-Mail über neue Kommentare.
 
Meine Daten auf diesem Computer speichern (Cookie).
 
Ich habe die Datenschutzrichtlinien gelesen und verstanden. *
 
Ich habe die Bedingungen und Konditionen gelesen und stimme ihnen zu. *
 
 
Powered by Commentics
.: Christians Technikseite 28.02.2015 10:02:43