Effekte steuern mit VB und MicroController (> µC)

Oftmals besteht der Wunsch, mit unserem Programm nicht nur die Modellbahn zu steuern, sondern auch andere Dinge wie z.B. eine Lampe oder eine Windmühle ein-/ausschalten usw.
Mit Hilfe von Magnetartikel-Decodern kann man schon einiges erreichen, ein Nachteil dabei aber ist, dass viele Decoder die Schaltzeit begrenzen, d.h. nach wenigen Sekunden wird der Ausgang deaktiviert. Folglich nur für kurzzeitige Effekte nutzbar.
Bei länger dauernden Schaltzeiten kann man mit einem bistabilen Relais einen zeitlich unbegrenzten Zeitraum erreichen, benötigt jedoch einen zweiten Decoderausgang um das Relais zurückzusetzen.

Effektiver und vielseitiger ist die Verwendung einer seriellen Schnittstelle (RS232 / V24) in Verbindung mit einem µC wie z.B einem ATMega 8 und einer nachfolgenden Relaiskarte.
Der µC ist in einem 28poligen DIL-Gehäuse untergebracht und bietet die Möglichkeit bis zu 20 Relais anzusteuern.
Die u.a. Relaiskarte kann direkt vom µC angesteuert werden, zusätzlich Transistoren sind nicht erforderlich.

Neuere PCs bieten kaum noch serielle Schnittstellen an, dafür jedoch USB-Schnittstellen in nahezu unbegrenzter Zahl.
USB to TTL-Konverter gibt es in verschiedensten Ausführungen, teilweise mit Kabel zum direkten Anschluss.(z.B.: CH340G-Profilic)

Allen gemeinsam sind die genormten Ausgänge hin zum µC, als da sind
+ 5V
TXD
RXD
GND
Manche Konverter besitzen noch weitere Ausgänge, welche in unserem Fall jedoch nicht benötigt werden.

Hinweis !
Eine herkömmliche serielle Schnittstelle darf keinesfalls direkt mit dem µC verbunden werden, da diese mit einem anderen Signalpegel arbeitet.
In diesem Fall muss ein Pegelkonverter wie z.B. ein MAX232 dazwischengeschaltet werden.

Die bereits o.e. USB to TTL-Konverter bieten beides:
- eine weitere serielle Schnittstelle und
- den zum µC passenden Signalpegel

Die folgende Zeichnung zeigt den prinzipiellen Aufbau



zu beachten ist, dass Sendeleitung (TXD) und Empfangsleitung (RXD) gekreuzt werden,
d.h., die Sendeleitung TXD des PCs wird auf den Eingang RXD des µC geführt und umgekehrt.
Mit dem Anschluss des µC an +5V und GND sind alle erforderlichen Verbindungen hergestellt.

Ist der Konverter in den PC eingesteckt findet man unter Arbeitsplatz > Eigenschaften > Hardware > Gerätemanager > Anschlüsse (COM und LPT) die vom PC zugeordnete Nummer der Schnittstelle.

In meiner Anwendung steuere ich u.a. den Drehkran von Märklin und die Drehscheibe 7186  über die o.a. Schaltung.
Die Hebe- und Drehbewegungen sind temporär, der Magnet dagegen bleibt für längere Zeit aktiv.
Um den Magnet dauerhaft aktiv zu halten nutze ich die Variable MagnetStatus:

 Variable deklarieren
 Dim MagnetStatus As Boolean


Die Funktionen werden mittels 5 Buttons (btnKran) ein- / ausgeschaltet.
Diese sind mit Index = 0  bis Index = 5 versehen.

 Funktion(en) einschalten
 Private Sub btnKran_MouseDown(Index As Integer, Button As Integer, Shift As Integer, x As Single, y As Single)

 Select Case Index
    Case 1 ' --- heben
    V24Kran.Output = "C5_0"

    Case 2 ' --- rechts drehen
    V24Kran.Output = "C4_0"

    Case 3 ' --- senken
    V24Kran.Output = "C3_0"

    Case 4 ' --- links drehen
    V24Kran.Output = "C2_0"

    Case 5 ' --- Magnet ein / aus
  
 If MagnetStatus = False Then                         ' --- wenn AUS
       V24Kran.Output = "C1_0"                           ' --- einschalten
       MagnetStatus = True                                  ' --- Status auf EIN ändern
    Else                                                             ' --- wenn EIN
       V24Kran.Output = "C1_1"                           ' --- ausschalten
       MagnetStatus = False                                ' --- Status auf AUS ändern
    End If
 End Select

 End Sub
 

Da die ersten 4 Funktionen (heben, senken, links drehen und rechts drehen) nur für jeweils kurze Zeit aktiv sind, werden sie beim 'Loslassen' des Buttons wieder deaktiviert,
 

 Funktion(en) ausschalten
 Private Sub btnKran_MouseUp(Index As Integer, Button As Integer, Shift As Integer, x As Single, y As Single)

 Select Case Index
    Case 1 ' --- heben
    V24Kran.Output = "C5_1"

    Case 2 ' --- rechts drehen
    V24Kran.Output = "C4_1"

    Case 3 ' --- senken
    V24Kran.Output = "C3_1"

    Case 4 ' --- links drehen
    V24Kran.Output = "C2_1"
 End Select

 End Sub
 

Wie man erkennen kann, wird der Magnet im Mouse_Up-Ereignis nicht aufgeführt, da er beim Loslassen der Taste weiterhin aktiv bleiben muss.
Sein jeweiliger Zustand wird in der Variablen MagnetStatus gespeichert und erst beim nächsten Tastendruck geändert.

Als zu übertragendes Kommando habe ich die Portbezeichnungen des µC gewählt, selbstverständlich kann hier jede andere Art von Kommando übertragen werden (der µC muss selbstverständlich entspr. programmiert werden).

Was noch auffallen könnte:
die einschalte-Kommandos setzen den jeweiligen Port auf '0' !
Das liegt an der verwendeten Relaiskarte - diese aktiviert das zugehörige Relais bei '0'-Pegel.

Um die Kommandos des PC ' verstehen' zu können muss der µC entspr. programmiert werden:

 das Programm des µC
 [...]

 Dim Zeichen As String * 3
 Dim Befehl As String * 10

 DDRB = &B11111111                ' --- Datenregister B: alle Output
 PORTB = &B11111111              ' --- alle Ports auf '1'

 DDRC = &B11111111                ' --- Datenregister C: alle Output
 PORTC = &B11111111              ' --- alle Ports auf '1'

 DDRD  = &B11111100               ' --- Datenregister D: 2 - 7 Output
 PORTD = &B11111111              ' --- alle Ports auf '1'

 Echo Off

 Do
   Warten:
   Zeichen = Waitkey()
   Befehl = Befehl + Left(zeichen , 1)

   If Instr(befehl , "Z") <> 0 Then       ' --- RESET auslösen
      Befehl = ""
      Goto Warten
   End If

   If Len(Befehl) < 4 Then
      Goto Warten
   Elseif Len(Befehl) > 4 Then
      Befehl = ""
    Goto Warten
   End If

   Select Case Befehl
   Case "B0_1"
   Portb.0 = 1
   Case "B0_0"
   Portb.0 = 0

   [...]

   Case "C1_1"
   Portc.1 = 1
   Case "C1_0"
   Portc.1 = 0

   Case "C2_1"
   Portc.2 = 1
   Case "C2_0"
   Portc.2 = 0

   Case "C3_1"
   Portc.3 = 1
   Case "C3_0"
   Portc.3 = 0

   Case "C4_1"
   Portc.4 = 1
   Case "C4_0"
   Portc.4 = 0

   Case "C5_1"
   Portc.5 = 1
   Case "C5_0"
   Portc.5 = 0

   [...]

   Case "D7_1"
   Portd.7 = 1
   Case "D7_0"
   Portd.7 = 0

   Case "Ping"
   Print "Ping ok"

   End Select

   Befehl = ""
 Loop

 End               '--- End Program
 


Die Möglichkeit "Ping" dient nicht der direkten Steuerung des µC sondern veranlaßt diesen, eine Antwort zurück zusenden.
Indem man die Antwort auswertet, kann man die Erreichbarkeit des µC und die ordnungsgemäße Funktion der Verbindung prüfen.
Dazu wird im PC-Programm ein Label (lblPing) angelegt, welches dann die Antwort des µC anzeigt.

 Verbindung zum µC prüfen
 Private Sub btnKranTest_Click()

 V24Kran.Output = "Ping"             ' --- zum µC senden

 lblPing.Caption = V24Kran.Input   ' --- Antwort des µC ausgeben

 End Sub

 

Ein kleiner Nachteil dieser Art der Steuerung ist, dass zur gleichen Zeit immer nur  e i n e  Funktion ausgeführt werden kann.
Während bei der Steuerung des Krans über das zugehörige Stellpult heben und drehen zusammen erfolgen können, ist das hier nicht möglich.


die einzelnen Bauteile


USB to TTL-Konverter  CH340G-Profilic
Preis: ca. 5 EUR



AVR Atmel 8-16
Preis: ca. 2 EUR



Relaiskarte
Preis: 3 EUR (1 Relais) bis 12 EUR (16 Relais)

(Stand 2019)