Windows:
Linux/Raspberry Pi:
sudo apt update sudo apt install python3 python3-pip python3-venv
macOS:
brew install python3
Die Software benötigt folgende Python-Bibliotheken:
| Bibliothek | Zweck | Erforderlich |
|---|---|---|
opencv-python |
Bildverarbeitung und Bewegungserkennung | ✅ Ja |
numpy |
Numerische Berechnungen (wird mit OpenCV installiert) | ✅ Ja |
Pillow |
Bildkonvertierung für Tkinter-Anzeige | ✅ Ja |
tkinter |
Grafische Benutzeroberfläche (meist vorinstalliert) | ✅ Ja |
RPi.GPIO |
GPIO-Steuerung für Raspberry Pi | ❌ Optional (nur Raspberry Pi) |
pip install opencv-python pillow numpy
pip install RPi.GPIO
Hinweis: tkinter ist normalerweise bereits in Python enthalten. Falls nicht:
Linux/Raspberry Pi: sudo apt install python3-tk
macOS: Sollte mit Python mitgeliefert werden
Navigieren Sie zum Programmverzeichnis und starten Sie die Anwendung:
python Moba_cam_v0.6.py
config.txt erstelltProblem: "ModuleNotFoundError: No module named 'cv1.0'"
Lösung: pip install opencv-python
Problem: "ModuleNotFoundError: No module named 'PIL'"
Lösung: pip install pillow
Problem: Kamera wird nicht erkannt
video_source in der config.txt (0, 1, 2, etc.)Problem: GPIO funktioniert nicht auf Raspberry Pi
pip install RPi.GPIOsudo python Moba_cam_v1.0_alt1.pyscript.txt neu.config.txt.config.txt neu.localhost).8051).Motion löst Skript aus: Die konfigurierten Motion-Trigger werden aktiv und können Skripte auslösen.Manuelles Skript: Ermöglicht die manuelle Auswahl und Ausführung eines Skripts.script.txt.🏹 NEU: Bewegungsrichtungserkennung!
Die Anwendung kann die Bewegungsrichtung erkannter Objekte anzeigen:
Dies ist nützlich um zu erkennen, in welche Richtung sich Züge auf der Modellbahn bewegen.
Die folgenden Parameter können live angepasst werden und werden in der config.txt gespeichert:
| Parameter | Standard | Beschreibung | Tipps |
|---|---|---|---|
| Schwelle | 25 | Helligkeitsunterschied ab dem eine Bewegung erkannt wird (0-255). | 10-15 für dunkle/kontrastarme Objekte. 30-50 für hellere Umgebungen. |
| Min.Größe | 500 | Mindestfläche in px² für erkannte Bewegungen. | 100-200 für kleine Objekte (N-Spur). 500-1000 für größere Objekte (H0). |
| Blur | 21 | Gaussian Blur Kernel-Größe (muss ungerade sein). | 5-11 für mehr Details. 21-31 für weniger Rauschen. |
| Dilate | 2 | Anzahl der Dilate-Iterationen zur Konturerweiterung. | 3-5 verbindet nahe Bewegungen. 0-1 für präzisere Erkennung. |
Tipp für dunkle Objekte: Schwelle=10-15, Blur=9-11, Dilate=3-4
Die ROI-Funktion ermöglicht es, nur einen bestimmten Bildbereich für die Bewegungserkennung zu verwenden.
Mit dem Zonen-Editor können Sie Trigger-Zonen interaktiv anpassen.
config.txt - Programmeinstellungen
[Camera]
video_source = 0
width = 800
height = 600
[ROI]
enabled = false
x = 0
y = 0
width = 800
height = 600
[Connection]
host = localhost
port = 8051
[Motion]
motion_threshold = 25
motion_min_area = 500
motion_blur_size = 21
motion_dilate_iter = 2
debug_mode = false
debug_log_file = false
[TriggerZonen]
; Format: zonen_name = x_mitte, y_mitte, halbe_breite, halbe_hoehe
zone_1_links = 200,300,50,50
zone_2_mitte = 400,300,50,50
zone_3_rechts = 600,300,50,50
; ... weitere Zonen ...
[Scripting]
ausloesemodus = ki_trigger
; Trigger 1-9
trigger_1_active = true
trigger_1_target_script = mein_skript_script
trigger_1_target_zone = zone_1_links
; ... für Trigger 2-9 analog ...
; Kombinierter Trigger 10
trigger_10_active = false
trigger_10_target_zone1 = zone_10_A
trigger_10_target_zone2 = zone_10_B
trigger_10_target_script = kombi_skript_script
[CommandHistory]
count = 2
cmd0 = lc id="Lok1" cmd="velocity" v="30"
cmd1 = switch id="sw1" cmd="straight"
[GPIO]
gpio_1_pin = 17
gpio_2_pin = 27
gpio_3_pin = 22
gpio_4_pin = 23
gpio_5_pin = 24
gpio_6_pin = 25
gpio_7_pin = 5
gpio_8_pin = 6
[Weichen]
; Weiche W1
w1_name = W1
w1_rund_pin = 17
w1_rund_time = 500
w1_gerade_pin = 27
w1_gerade_time = 500
; Weiche W2
w2_name = W2
w2_rund_pin = 22
w2_rund_time = 500
w2_gerade_pin = 23
w2_gerade_time = 500
[Gleise]
; Gleisanzeige
gleis1_name = Gleis1
gleis1_pin = 24
gleis2_name = Gleis2
gleis2_pin = 25
gleis3_name = Gleis3
gleis3_pin = 12
script.txt - Rocrail-Aktionsskripte
[einfahrt_script]
; Weichenstraße für Einfahrt Gleis 1
cmd1 = <switch id="sw1" cmd="straight"/>
cmd2 = <switch id="sw2" cmd="turn"/>
cmd3 = <pause=0.5>
cmd4 = <signal id="einfahrt_signal" state="green"/>
[lok_start_script]
; Lok langsam anfahren
cmd1 = <lc id="BR218" cmd="velocity" v="30"/>
cmd2 = <pause=3>
cmd3 = <lc id="BR218" cmd="velocity" v="50"/>
[rangierfahrt_script]
; Rangierfahrt mit Rückmelder-Warten
cmd1 = Log: Starte Rangierfahrt
cmd2 = <lc id="Lok1" cmd="velocity" v="20"/>
cmd3 = <waitfb:fb_gleis2:timeout=30>
cmd4 = <lc id="Lok1" cmd="velocity" v="0"/>
cmd5 = Log: Ziel erreicht
# Deaktivierter Befehl (wird nicht ausgeführt):
# cmd6 = <lc id="Lok1" cmd="velocity" v="100"/>
<lc id="..." .../>, <switch .../>, <signal .../> etc.<pause=SEKUNDEN> (z.B. <pause=2.5>)<waitfb:ID:timeout=SEKUNDEN><zone:NUMMER:enable><zone:NUMMER:disable><gpio:PIN:on> (z.B. <gpio:17:on>)<gpio:PIN:off> (z.B. <gpio:17:off>)<weiche:NAME:rund> oder <weiche:NAME:gerade> (z.B. <weiche:W1:rund>)<weiche:NAME:PIN:MS> (z.B. <weiche:W1:17:500>)<gleis:NAME:on> (z.B. <gleis:Gleis1:on> oder <gleis:1:on>)<gleis:NAME:off> (z.B. <gleis:Gleis2:off> oder <gleis:2:off>)<sbf:enable> - Schattenbahnhof-Automatik aktivieren<sbf:disable> - Schattenbahnhof-Automatik deaktivieren<sbf:reset> - Alle Gleisbelegungen zurücksetzen<sbf:ausfahrt> - Manuell Ausfahrt auslösen<sbf:status> - Aktuellen SBF-Status anzeigen# am Anfang werden ignoriert.< werden nur geloggt.Die Schattenbahnhof-Automatik ermöglicht eine vollautomatische Steuerung eines Schattenbahnhofs mit 3 Gleisen basierend auf Motion-Detection-Zonen.
📷 Bildvergleich mit Referenzbild! Das System erkennt automatisch beim Programmstart, welche Gleise belegt sind.
sbf_ref.png gespeichert.Die Erkennung verwendet 4 Methoden - mindestens 2 müssen erfüllt sein:
| Methode | Schwellwert | Beschreibung |
|---|---|---|
| Mittlerer Unterschied | > 8 | Durchschnittlicher Helligkeitsunterschied |
| Maximaler Unterschied | > 60 | Maximaler Helligkeitsunterschied in der Zone |
| Standardabweichung | > 12 | Streuung der Unterschiede (lokale Varianz) |
| Prozent über Schwelle | > Konfig. | Prozent der Pixel mit Unterschied > 5 |
[Schattenbahnhof] → belegung_schwellwert.| Ziel-Gleis | Weiche W1 | Weiche W2 |
|---|---|---|
| Gleis 1 | gerade | - |
| Gleis 2 | rund | rund |
| Gleis 3 | rund | gerade |
[Schattenbahnhof]
auto_enabled = true
ausfahrt_zone = zone_ausfahrt
gleis1_zone = zone_1_gleis_1
gleis2_zone = zone_1_gleis_2
gleis3_zone = zone_1_gleis_3
belegung_schwellwert = 2.0
[sbf_einfahrt]
; Schattenbahnhof-Automatik starten
cmd1 = Log: Schattenbahnhof-Betrieb aktiviert
cmd2 = <sbf:enable>
cmd3 = <sbf:status>
[sbf_reset]
; Alle Gleise freigeben
cmd1 = Log: Schattenbahnhof wird zurückgesetzt
cmd2 = <sbf:reset>
cmd3 = <gleis:1:on>
cmd4 = <gleis:2:on>
cmd5 = <gleis:3:on>
[sbf_belegung_pruefen]
; Belegung per Bildvergleich prüfen
cmd1 = Log: Prüfe Gleisbelegung...
cmd2 = <sbf:check>
cmd3 = <sbf:status>
Wichtig für Belegungserkennung:
🍓 NEU in v1.0! Direkte Relais-Steuerung über GPIO-Pins auf dem Raspberry Pi.
pip install RPi.GPIO)| Relais | GPIO-Pin | Physischer Pin |
|---|---|---|
| R1 | 17 | Pin 11 |
| R2 | 27 | Pin 13 |
| R3 | 22 | Pin 15 |
| R4 | 23 | Pin 16 |
| R5 | 24 | Pin 18 |
| R6 | 25 | Pin 22 |
| R7 | 5 | Pin 29 |
| R8 | 6 | Pin 31 |
[weichenheizung_script]
; Weichenheizung für 5 Sekunden einschalten
cmd1 = <gpio:17:on>
cmd2 = <pause=5>
cmd3 = <gpio:17:off>
[beleuchtung_script]
; Mehrere Relais schalten
cmd1 = <gpio:17:on>
cmd2 = <gpio:27:on>
cmd3 = <gpio:22:on>
cmd4 = <pause=10>
cmd5 = <gpio:17:off>
cmd6 = <gpio:27:off>
cmd7 = <gpio:22:off>
Hinweis: Auf nicht-Raspberry-Pi-Systemen (Windows, Linux PC) wird eine Warnung angezeigt, und GPIO-Befehle werden ignoriert. Das Programm funktioniert aber weiterhin für alle anderen Funktionen.
🔀 NEU in v1.0! Grafische Weichensteuerung mit klickbaren Symbolen.
| Weiche | Rund Pin | Gerade Pin | Impulszeit |
|---|---|---|---|
| W1 | 17 | 27 | 500ms |
| W2 | 22 | 23 | 500ms |
[weichenstrasse_script]
; Weichenstraße für Einfahrt mit GUI-Weichen
cmd1 = <weiche:W1:gerade>
cmd2 = <weiche:W2:rund>
cmd3 = <pause=0.5>
cmd4 = Log: Weichenstraße gestellt
[weiche_direkt_script]
; Weiche mit direkten Parametern (PIN:ZEIT_MS)
cmd1 = <weiche:W1:17:500>
cmd2 = <pause=1>
cmd3 = <weiche:W1:27:500>
[gleise_script]
; Gleise ein- und ausschalten
cmd1 = <gleis:Gleis1:on>
cmd2 = <gleis:2:on>
cmd3 = <pause=5>
cmd4 = <gleis:1:off>
cmd5 = <gleis:Gleis2:off>
Hinweis: Wenn der Skript-Befehl den gleichen Namen wie eine GUI-Weiche verwendet, wird das Symbol automatisch aktualisiert. Auch bei direkter Pin-Angabe wird das Symbol aktualisiert, wenn der Pin einer konfigurierten Weiche entspricht.
🚃 NEU in v1.0! Drei Gleisanzeige-Buttons mit farbiger Statusanzeige.
| Gleis | GPIO-Pin |
|---|---|
| Gleis1 | 24 |
| Gleis2 | 25 |
| Gleis3 | 12 |
[beleuchtung_script]
; Gleisspannung einschalten
cmd1 = <gleis:Gleis1:on>
cmd2 = <gleis:2:on>
cmd3 = Log: Gleise 1 und 2 aktiv
[abschalten_script]
; Alle Gleise ausschalten
cmd1 = <gleis:1:off>
cmd2 = <gleis:2:off>
cmd3 = <gleis:3:off>
Jeder Motion-Trigger (1-10) hat eine LED-Anzeige:
Version: v1.0 - Moba Cam mit automatischer Belegungserkennung
Reine Motion-Detection basierte Bewegungserkennung für Modellbahnen: