-
Notifications
You must be signed in to change notification settings - Fork 9
Steuerungkonfiguration
Um den Einsatz der Steuerung einfach zu halten, wird die Konfigurationen direkt im Code erledigt. CV's etc. existieren nicht.
Die Konfiguration im Code bietet sich auch durch die Arbeitsweise der Arduino IDE an:
- Code schreiben
- Code compilieren
- Code Uploaden in Arduino
Die Konfiguration der Zentrale findet im jeweiligen Sketch statt.
Es werden zwei Protokolle für die Verbindung Host - Arduino und ein Protokoll zur Arduino - Arduino Kommunkation zur Verfügung gestellt.
- SRCP_SERIAL: Host und Arduino sind durch eine Serielle Schnittstelle (USB Kabel!) verbunden. Das ist die bevorzugte Methode welche keine weitere Konfiguration braucht.
- SRCP_ETHERNET: Der Arduino hat einen Ethernet Shield ist direkt in das Netzwerk integriert. Die Kommunikation erfolgt mittels dem TCP/IP Protokoll.
- SRCP_I2C: Der Arduino ist ein I2C Slave, d.h. es muss mindestens noch ein Arduino existieren, welche die Verbindung Host - Arduino übernimmt. Die zwei oder mehrere Arduino (max. 10) sind mittels den Pins SDA/SDL/GND verbunden.
////////////////////////////////////////////////////////////////////////////////////////// // Konfiguration Protokoll #define SRCP_ETHERNET 100 #define SRCP_SERIAL 101 #define SRCP_I2C 102 #define SRCP_PROTOCOL SRCP_SERIAL #define SENSOR_POLLING 500 // Intervall in welcher Sensor Aenderungen an die Zentrale gemeldet werden #if ( SRCP_PROTOCOL == SRCP_SERIAL ) // SRCP I/O Server srcp::SRCPServerSerial server; #elif ( SRCP_PROTOCOL == SRCP_ETHERNET ) srcp::SRCPEthernetServer server; // Enter a MAC address and IP address for your controller below. // The IP address will be dependent on your local network: byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip( 192, 168, 178, 241 ); #elif ( SRCP_PROTOCOL == SRCP_I2C ) // SRCP I2C - Slave i2c::I2CServer server = WireServer; #else #error "kein Prokotoll definiert" #endif
Wird SRCP_ETHERNET aktiviert, müssen zusätzlich die Variablen mac und ip entsprechend dem eigenen Netzwerk geändert werden. Meistens genügt es nur ip zu ändern. mac muss nur geändert werden, wenn sich mehrere Arduino's im gleichen Netzwerk befinden.
SENSOR_POLLING bestimmt die Zeit in Millisekunden in welcher Änderungen der Sensoren an den Host (RocRail) gemeldet werden. Ein Wert zwischen 250 - 500 reicht in der Regel problemlos. Werden kürzere Zeiten und viele I2C Slaves verwendet kann sich die Antwortzeit sogar verschlechtern. Dieser Wert ist nicht zu verwechseln mit dem Refresh der Sensoren. Änderungen an den Sensoren werden praktisch Realtime erkannt, aber eben erst nach SENSOR_POLLING an den Host gesendet.
Neben der bevorzugten Verbindung Host - Arduino, wo für jeden Arduino eine Zentrale in RocRail eingerichtet wird. Gibt es noch die Variante Host - Arduino - I2C Protokoll - Arduino. Dabei können bis zu 10 Arduino's an einen Master Arduino angeschlossen werden.
ACHTUNG: beim Einschalten sucht der Master Arduino den I2C Bus nach weiteren Board ab. Ist dabei ein Board verbunden, welches keinen Strom hat, blockiert der Master! Um dies zu vermeiden sollten neben den I2C Pin's auch die Pin's GND und 5V verbunden sein.
Für den Arduino Master sind die Einstellungen wie folgt zu setzen (siehe Sketch microSRCPServer):
// Konfiguration I2C #define I2C_ADDR 0 // Eigene I2C Adresse - muss pro I2C Board angepasst werden! - Master = 0 #define I2C_OFFSET 16 // Offset, d.h. wieviele Adressen pro Board reserviert werden #define I2C_ENABLED 1 #define I2C_MAX_SLAVES 10 // Maximale Anzahl I2C Slave Boards am Master #define ADDR(x) ((I2C_ADDR * I2C_OFFSET) + x) // Berechnung effektive Adresse
- I2C_ADDR: I2C Adresse ist beim Master (= Arduino wo direkt mit dem Host/RocRail verbunden ist) = 0
- Arduino's welche an den Master angeschlossen sind benötigten jeweils einen eigene Adresse von 1 - 10.
- I2C_OFFSET: Adresse welche pro Gerätegruppe (FB, GA, GL) reserviert werden sollen. Anhand der I2C Adresse und dem Offset werden automatisch die Adressen der Geräte berechnet. Bsp. ein Led mit der Adresse 1 bekommt am ersten I2C Slave automatisch die Adresse 17.
- I2C_ENABLED: Nur beim Master relevant, wird dieser Wert auf 0 gesetzt, ist die I2C Anbindung deaktiviert und die I2C Pins (SDA/SDL) stehen zur Verfügung.
- I2C_MAX_SLAVES: Maximale Anzahl von I2C Slave Board's. Werden mehr als 10 Board's angegeben, welche Sensoren haben, ist mit längeren Reaktionszeiten zu rechnen.
// Konfiguration Protokoll #define SRCP_ETHERNET 100 #define SRCP_SERIAL 101 #define SRCP_I2C 102 #define SRCP_PROTOCOL SRCP_I2C // Konfiguration I2C #define I2C_ADDR 1 // Eigene I2C Adresse - muss pro I2C Board angepasst werden! #define I2C_OFFSET 16 // Offset, d.h. wieviele Adressen pro Board reserviert werden #define I2C_ENABLED 1 #define ADDR(x) ((I2C_ADDR * I2C_OFFSET) + x) // Berechnung effektive Adresse
Wobei zu beachten ist, dass jeder Slave eine eigene Adresse (I2C_ADDR) haben muss.
Die Geräte werden direkt in der setup() Methode des Sketches initialisiert bzw. registriert.
Geräte sind:
- Lichtsignale
- Servos
- Rückmelder
- Shields wie z.B. MotorShield
Mehrere Geräte Konfigurationen sind vordefiniert und brauchen nur die entsprechende #define BOARD = ...Konfiguration... Anweisung aktiviert werden.
Die Konfigurationen sind abgestimmt auf den Arduino mit ATmega328P (z.B. UNO). Für den Arduino Mega sind sie entsprechend zu erweitert. Der Arduino DUE wird nicht unterstützt.
////////////////////////////////////////////////////////////////////////////////////////// // Konfiguration Board #define BOARD_STANDARD 200 #define BOARD_I2C_MASTER 201 #define BOARD_MINIMAL 202 // Minialer Board Aufbau, nur Resonator, 10K, Atmega328P #define BOARD_FB 203 // Beispiel ATmega328P: nur Sensoren (Feedback) #define BOARD_GA 204 // Beispiel ATmega328P: nur Generic Accessoires - Geraete #define BOARD_GL 205 // Beispiel ATmega328P: nur Motorenansteuerung #define BOARD BOARD_STANDARD
Dieser dient vor allem zu Testzwecken. Darauf sind die wichtigsten Geräte definiert.
Die Konfigurationen benötigt folgendes:
- 1 x Arduino mit ATmega328P (z.B. UNO)
- 1 x MotoMama Motor Shield
- 1 x I/O Extension Shield
void setup() { ..... // Geraete initialisieren, je nach Board und Verwendung DeviceManager.addAccessoire( new dev::GASignal( ADDR(1), 4, 5 ) ); // 2 Signale mit 2 LED an Ports 4 - 7. DeviceManager.addAccessoire( new dev::GASignal( ADDR(2), 6, 7 ) ); DeviceManager.addAccessoire( new dev::GAServo( ADDR(3), 2, 60, 90 ) ); // Servo mit Addr 3 an Pin 2, min. Stellung 60, max. Stellung 90 von 180. DeviceManager.addAccessoire( new dev::GAServo( ADDR(4), 3, 60, 90 ) ); DeviceManager.addFeedback( new dev::FBSwitchSensor( ADDR(1), A0, A3 ) ); // Sensoren, jeweils in Gruppen von 8 (auch wenn nicht 8 Pins belegt). A4+A5 = I2C Bus DeviceManager.addLoco( new dev::GLMotoMamaAnalog( ADDR(2), 11, 12, 13 ) ); // nur Motor 2 weil Pin 9 durch Servo Library belegt }
In RocRail sind folgende Geräte einzutragen:
- zwei Signale mit Adressen 1 und 2. Pro Signal ist Port 1 für Rot und Port 0 für Grün einzutragen
- zwei Weichen (Servo's) mit der Adresse 3 und 4
- eine Lokomotive mit der Adresse 2
- vier Sensoren (Rückmelder) mit den Adressen 1 - 4
Diese Konfigurationen besteht aus 2 Blöcken à 8 Sensoren. Der Pin 13 (Sensor 12) ist ohne Funktion, weil dort sich beim Arduino eine LED befindet. Trotzdem bleiben 15 Sensoren übrig.
DeviceManager.addFeedback( new dev::FBSwitchSensor( ADDR(1), 2, 9 ) ); // 1 x Sensorblock mit 8 x Sensor an Pin D2 - D9 DeviceManager.addFeedback( new dev::FBSwitchSensor( ADDR(9), 10, 17 ) ); // 1 x Sensorblock mit 7 x Sensor an Pin D10 - A4 (A0 = 14), Pin 13 ohne Funktion wegen LED
Benötigt werden ein Arduino mit ATMega328P (z.B. UNO) und keine Shield's. Die Sensoren sind vom jeweiligen Pin nach GND verdrahtet.
In RocRail sind folgende Geräte einzutragen:
- fünfzehn Sensoren (Rückmelder) mit den Adressen 1 - 11 und 13 - 17
Diese Konfigurationen besteht nur aus Zubehör Geräten (Signale, Servo's). Die Zuordnungen der Pin's zu den Geräten ist abgestimmt auf den I/O Expansion Shield, können jedoch frei gewählt werden.
Benötigt wird ein Arduino mit ATMega328P (z.B. UNO) und keine Shield's. Die maximale Anzahl von Servo's, bei diesem Board, sind acht (siehe Arduino Dokumentation).
DeviceManager.addAccessoire( new dev::GASlowServo( ADDR(1), 2, 60, 90 ) ); // 8 x Servo (max. fuer ATmega328P) DeviceManager.addAccessoire( new dev::GASlowServo( ADDR(2), 3, 60, 90 ) ); DeviceManager.addAccessoire( new dev::GASlowServo( ADDR(3), 8, 60, 90 ) ); // abgestimmt auf DF Robot I/ Expansion Shield, darum die Luecke DeviceManager.addAccessoire( new dev::GASlowServo( ADDR(4), 9, 60, 90 ) ); DeviceManager.addAccessoire( new dev::GASlowServo( ADDR(5), 10, 60, 90 ) ); DeviceManager.addAccessoire( new dev::GASlowServo( ADDR(6), 11, 60, 90 ) ); DeviceManager.addAccessoire( new dev::GASlowServo( ADDR(7), 12, 60, 90 ) ); DeviceManager.addAccessoire( new dev::GASlowServo( ADDR(8), 13, 60, 90 ) ); DeviceManager.addAccessoire( new dev::GASignal( ADDR(9), 4, 5 ) ); // 4 x Lichtsignal DeviceManager.addAccessoire( new dev::GASignal( ADDR(10), 6, 7 ) ); DeviceManager.addAccessoire( new dev::GASignal( ADDR(11), A0, A1 ) ); DeviceManager.addAccessoire( new dev::GASignal( ADDR(12), A2, A3 ) );
Zur Beachtung: die Servo's müssen bei dieser Konfigurationen mit einer eigenen Stromquelle gespiesen werden, ansonsten kann es zur einer Überlastung des Arduino's kommen.
In RocRail sind folgende Geräte einzutragen:
- acht Weichen (Servo's) mit den Adressen 1 - 8
- vier Signale mit Adressen 9 - 12. Pro Signal ist Port 1 für Rot und Port 0 für Grün einzutragen
Diese Konfigurationen dient zum Steuern von analogen Lokomotiven. Damit können auch nicht auf Digital (DCC) umgebaute Lokomotiven auf eigenen Stromkreisen betrieben werden.
Benötigt wird ein ATMega328P (z.B. UNO) und der MotoMama Shield. Für Andere Shield's ist die Konfigurationen entsprechend anzupassen, siehe Ansteuerung von Motoren.
DeviceManager.addLoco( new dev::GLMotoMamaAnalog( ADDR(1), 10, 8, 9 ) ); // Moto Mama Shield, Pin 10 Geschwindigkeit, 8 Vor-, 9 Rueckwaerts DeviceManager.addLoco( new dev::GLMotoMamaAnalog( ADDR(2), 11, 12, 13 ) );
Zur Beachtung: es wird einen externe Stromquelle (12 - 16V) benötigt. Diese ist direkt am Shield anzuschliessen. Wenn der I/O Expansion Shield aufgesteckt ist, funktioniert das Umschalten der Spannung am 1. Treiber nicht.
In RocRail sind folgende Geräte einzutragen:
- zwei Lokomotiven mit der Adresse 1 und 2
Die Logik der einzelnen Geräte ist in C++ Klassen implementiert. Die Details dazu findet man im Verzeichnis libraries/dev.
Werden Änderungen der Standard Konfiguration vorgenommen, müssen evtl. Überschneidungen von Pins oder Registern berücksichtigt werden. So braucht die Servo Library z.B. beim AtMega328 das Register B womit die Pin 8 - 10 nicht zur Verfügung stehen. Shield sind in der Regel fest Pins zugeordnet, z.B. verwendet der Ethernet Shield beim AtMega328 fix die Pin 10 - 13, wodurch ein gleichzeitiges Verwenden von MotoMama und Ethernet Shield nicht möglich ist.
Zu jedem Gerät hat es eine Beschreibung wie RocRail im Tab Schnittstelle zu Konfigurieren ist. Fehlende Angaben, z.B. Bus oder Protokoll werden nicht ausgewertet. Die Adressen beziehen sich immer auf das vorherige Codebeispiel und müssen bei Änderungen angepasst werden.
Einfache Led Ansteuerung. Mittels Start- und End-Pin werden die Anzahl Led bestimmt. Ein GASignal hat eine Adresse und die einzelnen Led werden mittels der Port Adresse angesteuert.
DeviceManager.addAccessoire( new dev::GASignal( ADDR(1), 4, 5 ) ); // 1 Signal an Pin 4 + 5
Konfiguration in RocRail:
- Tabelle: Signal
- Schnittstellenkennung: wie Zentrale
- Adresse: 1 bzw. bei einem I2C Board ((I2C_ADDR * I2C_OFFSET) + 1)
- Port: 0 = 1. Pin (4), 1 = 2. Pin (5), etc. bei noch mehr Pin's
- Steuerung: Standard
- Zubehör - aktiviert
Einfaches Led, z.B. für eine Hausbeleuchtung, Braucht ein Pin und eine Adresse.
DeviceManager.addAccessoire( new dev::GALed( ADDR(1), 4, LOW ) ); // Led mit Adresse 1 an Pin 4. Anfangszustand ist Aus.
Konfiguration in RocRail:
- Tabelle: Signal
- Schnittstellenkennung: wie Zentrale
- Adresse: 1 bzw. bei einem I2C Board ((I2C_ADDR * I2C_OFFSET) + 1)
- Steuerung: Standard
- Zubehör - aktiviert
Blinkende Led welche ein uns ausgeschaltet werden kann.
DeviceManager.addAccessoire( new dev::GABlinkLed( ADDR(1), 4, 1000 ) ); // Led mit Adresse 1 an Pin 4, nach einem On Signal blinkt sie in 1000 Millisekunden Abständen.
Wird in RocRail als Signal eintragen und bei Schnittstelle ist Weiche zu aktivieren. Das Geraet muss mit Adresse und Port = 0 angesprochen werden, weil nicht value sondern port zum Umschalten von RocRail geschickt wird.
Konfiguration in RocRail:
- Tabelle: Signal
- Schnittstellenkennung: wie Zentrale
- Adresse: 1 bzw. bei einem I2C Board ((I2C_ADDR * I2C_OFFSET) + 1)
- Port: 0 (siehe oben)
- Steuerung: Standard
- Zubehör - aktiviert
- Weiche - aktiviert
Wechselblinklicht mit 2 Led's welche ein uns ausgeschaltet werden kann.
DeviceManager.addAccessoire( new dev::GABlinkLed2( ADDR(1), 4, 5, 1000 ) ); // 2 Led's mit Adresse 1 an Pin 4 und 5, nach einem On Signal blinken sie in 1000 Millisekunden Abständen.
Wird in RocRail als Signal eintragen und bei Schnittstelle ist Weiche zu aktivieren. Das Geraet muss mit Adresse und Port = 0 angesprochen werden, weil nicht value sondern port zum Umschalten von RocRail geschickt wird.
Konfiguration in RocRail:
- Tabelle: Signal
- Schnittstellenkennung: wie Zentrale
- Adresse: 1 bzw. bei einem I2C Board ((I2C_ADDR * I2C_OFFSET) + 1)
- Port: 0 (siehe oben)
- Steuerung: Standard
- Zubehör - aktiviert
- Weiche - aktiviert
Einfache Servo Ansteuerung, verwendet die Arduino Servo Library.
DeviceManager.addAccessoire( new dev::GAServo( ADDR(3), 2, 60, 90 ) ); // Servo mit Addr 3 an Pin 2, min. Stellung 60, max. Stellung 90 von 180.
Konfiguration in RocRail:
- Tabelle: Weichen
- Schnittstellenkennung: wie Zentrale
- Adresse: 3 bzw. bei einem I2C Board ((I2C_ADDR * I2C_OFFSET) + 3)
- Ein-/Ausgang - aktiviert
- Zubehör - aktiviert
Servo Ansteuerung, verwendet die Arduino Servo Library, bei der die Schrittgeschwindigkeit eingestellt werden kann. Dazu werden die letzten zwei Argumente verwendet.
// Servo mit Addr 3 an Pin 2, min. Stellung 60, max. Stellung 90 von 180 // und Weiterschalten um 1ne Position alle 50 Millisekunden DeviceManager.addAccessoire( new dev::GASlowServo( ADDR(3), 2, 60, 90, 1, 50 ) );
Wird Weiterschalten (step) und Millisekunden (delay) nicht angegeben werden die Standardwerte 1 und 100 genommen.
Konfiguration in RocRail:
- Tabelle: Weichen
- Schnittstellenkennung: wie Zentrale
- Adresse: 3 bzw. bei einem I2C Board ((I2C_ADDR * I2C_OFFSET) + 3)
- Ein-/Ausgang - aktiviert
- Zubehör - aktiviert
8 Sensoren welche jeweils einen Digitalen Eingang belegen. Der interne Pullup Wiederstand ist aktiviert, dadurch muss der Sensor gegen GND geschaltet werden um aktiv zu sein.
Ideal für die Auswertung von Reedschaltern
DeviceManager.addFeedback( new dev::FBSwitchSensor( ADDR(1), A0, A3 ) ); // Sensoren, jeweils in Gruppen von 8 (auch wenn nicht 8 Pins belegt). A4+A5 = I2C Bus
Konfiguration in RocRail:
- Tabelle: Rückmelder
- Schnittstellenkennung: wie Zentrale
- Adresse: 1 - 8 bzw. bei einem I2C Board ((I2C_ADDR * I2C_OFFSET) + 1)
- Typ: Sensor
- Optionen: Zurücksetzen
Ansteuerung des Arduino Motor Shield, siehe auch Ansteuerung von Motoren. Mittels eines PWM Signals und der Verstärkerstufe auf dem Shield wird eine regelbare Spannung erzeugt. Diese dient zum Steuern von Analogen Lokomotiven.
DeviceManager.addLoco( new dev::GLArduinoMotor ( ADDR(2), 3, 12 ) ); // Motor Shield, Pin 3, Geschwindigkeit, 12 Vor- und Rueckwaerts
Konfiguration in RocRail:
- Tabelle: Lokomotiven (egal ob Analog oder DCC)
- Schnittstellenkennung: wie Zentrale
- Adresse: 1 bzw. bei einem I2C Board ((I2C_ADDR * I2C_OFFSET) + 1) bei Analog, bei DCC die DCC Adresse.
- Fahrstufen: nur Analog, dient zum Umrechnen der maximalen Geschwindigkeit, wenn nicht sicher 128 eingeben.
Ansteuerung des Motor Shield, hier MotoMama. Mittels eines PWM Signals und der Verstärkerstufe auf dem Shield wird eine regelbare Spannung erzeugt. Diese dient zum Steuern von Analogen Lokomotiven.
DeviceManager.addLoco( new dev::GLMotoMamaAnalog( ADDR(2), 11, 12, 13 ) ); // Moto Mama Shield, Pin 11, Geschwindigkeit, 12 Vor-, 13 Rueckwaerts
Konfiguration in RocRail:
- Tabelle: Lokomotiven (egal ob Analog oder DCC)
- Schnittstellenkennung: wie Zentrale
- Adresse: 1 bzw. bei einem I2C Board ((I2C_ADDR * I2C_OFFSET) + 1) bei Analog, bei DCC die DCC Adresse.
- Fahrstufen: nur Analog, dient zum Umrechnen der maximalen Geschwindigkeit, wenn nicht sicher 128 eingeben.
Leitet die Zubehör und Lok Befehle weiter an den DCC Booster bzw. den Motor Shield welcher ein DCC Signal erzeugt. Dabei kommt die OpenDCC Library zum Einsatz.
DeviceManager.addAccessoire( new dcc::GAOpenDCC( 1, 2048 ) ); // Weichen, Signale Adressen 1 - 2048 abhandeln DeviceManager.addLoco( new dcc::GLOpenDCC( 1, 4096 ) ); // Loks mit Adressen 1 - 4096 abhandeln
Konfiguration in RocRail: - Standard
Leitet die Zubehör und Lok Befehle weiter an den DCC Booster bzw. den Motor Shield welcher ein DCC Signal erzeugt. Dabei kommt die neu Erstellte DCC Library zum Einsatz.
DeviceManager.addAccessoire( new dcc::GADCCBooster ( 1, 2048 ) ); // Weichen, Signale Adressen 1 - 2048 abhandeln DeviceManager.addLoco( new dcc::GLDCCBooster ( 1, 4096 ) ); // Loks mit Adressen 1 - 4096 abhandeln
Konfiguration in RocRail: - Standard