Zum Inhalt springen
RailFX Arduino Truppenübungsplatz Schießbahn Effekte Modellbahn Modellbau Diorama

RailFX-Truppenübungsplatz für Modellbahn und Modellbau

    Dieses Modul des RailFX-Systems steuert einen Truppenübungsplatz, bietet Action der besonderen Art. Es verfügt über eine Schießbahn-Steuerung, auf der sechs LEDs Mündungsfeuer simulieren. Über ein Audio-Modul wird der dazugehörige Gewehrknall abgespielt. Wie oft und wie schnell geschossen wird, wird per Zufall bestimmt. So kommt keine Langeweile auf.

    Für die Freunde größeres Kalibers gibt es die Steuerung für einen Panzer. Dabei wird ein Schrittmotor verwendet, um z.B. den Panzerturm auf das Ziel auszurichten oder um den ganzen Panzer zu bewegen. Die Abfolge hat drei Phasen: Vor, Zurück, Vor. Nach kurzer Pause löst sich ein Schuss. Der Abschusssound erklingt aus dem Soundmodul und eine LED blitzt als Mündungsfeuer auf. Einen Wimpernschlag später schlägt die Ladung in einem Bombenkrater ein. Auch hier blitzt eine LED als Explosion, ein Elektromagnet schlägt von unten gegen die Einschlagstelle und schleudert Dreck nach oben. Eine rote und eine gelbe LED simulieren noch ein kleines Feuer im Krater, dann herrscht wieder gespenstische Ruhe über der Szene. Die Häufigkeit der beiden Animationen lässt sich leicht im Konfigurationsabschnitt im Code einstellen. 

    Wir benötigen Ihre Zustimmung um den Inhalt von YouTube laden zu können.

    Mit dem Klick auf das Video werden durch den mit uns gemeinsam Verantwortlichen Youtube [Google Ireland Limited, Irland] das Video abgespielt, auf Ihrem Endgerät Skripte geladen, Cookies gespeichert und personenbezogene Daten erfasst. Damit kann Google Aktivitäten im Internet verfolgen und Werbung zielgruppengerecht ausspielen. Es erfolgt eine Datenübermittlung in die USA, diese verfügt über keinen EU-konformen Datenschutz. Weitere Informationen finden Sie hier.

    Jmx0O2RpdiBjbGFzcz0mcXVvdDtudi1pZnJhbWUtZW1iZWQmcXVvdDsmZ3Q7Jmx0O2lmcmFtZSB0aXRsZT0mcXVvdDtSYWlsRlggVHJ1cHBlbnXMiGJ1bmdzcGxhdHomcXVvdDsgd2lkdGg9JnF1b3Q7MTIwMCZxdW90OyBoZWlnaHQ9JnF1b3Q7Njc1JnF1b3Q7IHNyYz0mcXVvdDtodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC9MSG9HdEJzSHEwUT9mZWF0dXJlPW9lbWJlZCZxdW90OyBmcmFtZWJvcmRlcj0mcXVvdDswJnF1b3Q7IGFsbG93PSZxdW90O2FjY2VsZXJvbWV0ZXI7IGF1dG9wbGF5OyBjbGlwYm9hcmQtd3JpdGU7IGVuY3J5cHRlZC1tZWRpYTsgZ3lyb3Njb3BlOyBwaWN0dXJlLWluLXBpY3R1cmU7IHdlYi1zaGFyZSZxdW90OyBhbGxvd2Z1bGxzY3JlZW4mZ3Q7Jmx0Oy9pZnJhbWUmZ3Q7Jmx0Oy9kaXYmZ3Q7

    Bauteile

    Schaltplan

    RailFX Truppenübungsplatz Modul für Modellbahn und Modellbau – Schießanlage und Panzer

    Die Schaltung basiert auf dem Arduino Nano Board. Die LEDs der Schießbahn sind mit der Kathode (kurzes Beinchen) an den Arduino-Pins 13, A0, A1, A2, A3 und A5 verbunden. Die Anode (langes Beinchen) verbindet die LED über einen 220 Ohm Widerstand mit dem 5V+. Anstelle der großen 5mm LEDs kann man natürlich auch SMD-LEDs und Lackdraht verwenden.


    Sieh dir jetzt meinen neuen Arduino-Videokurs an: Jetzt ansehen!


    Als Schrittmotor verwende ich hier den 28BYJ-48 mit der ULN2003 Treiberplatine. Sie ist mit den Arduino-Pins 5, 6, 7 und 8 verbunden. Das ganze Set sollte um die drei Euro kosten. Die LED für das Mündungsfeuer des Panzers ist mit dem Pin 12 verbunden.

    Der Elektromagnet für den Bombenkrater wird mit einem externen Netzteil betrieben, das per Schaltrelais-Modul ausgelöst wird. Die Spannung des Netzteils muss zum Elektromagneten passen. Eine Diode in Sperrrichtung fängt die induzierte Spannung ab, die beim Abschalten des Elektromagnetes auftritt.

    Das Schaltrelais-Modul ist mit 5V+, GND und dem digitalen Pin 4 des Arduino-Boards verbunden.

    Die Explosion wird mit der LED am Pin 9 des Arduinos visualisiert. Sie blitzt beim Einschlag auf. Zusätzlich simulieren die LEDs an den Pins 10 und 11 ein Nachbrennen im Bombenkrater.

    Akustisch begleitet werden die Animationen durch das DF-Player-Modul. Es ist mit den Pins 2 und 3 am Arduino angeschlossen. Zusätzlich erhält es die Versorgungsspannung 5V+ und GND. Der DF-Player spielt MP3-Dateien von einer SD-Karte ab. Die Karte sollte in FAT-16 oder FAT-32 formatiert sein. Die Dateien müssen auf der SD-Karte im Verzeichnis 01 gespeichert werden.

    Nähere Infos zum DF-Player auf dieser Seite: DFPlayer Mini-MP3-Player für Arduino.

    Normalerweise wird am Pin A4 das Control-Signal des RailFX Control-Moduls angelegt. Es steuert die Tageszeit, ist aber für dieses Modul nicht erforderlich.

    Einstellungen im Code

    Im Code lassen folgende Einstellungen vornehmen:

    • Schießwahrscheinlichkeit
    • Panzerschuss-Wahrscheinlichkeit
    • Lautstärke
    • Anzahl der Gewehre auf der Schießbahn

    Im folgenden Teil des Programmes lassen sie die genannten Parameter anpassen:

    int schiesswahrscheinlichkeit = 10;
    int panzerwahrscheinlichkeit = 20;
    
    int lautstaerke = 20;                     // Lautstärke des DFPlayers (0 – 30);
    
    int mp3Anzahl = 6;                       // Menge der MP3-Dateien auf der SD-Karte
    int mp3Dauer[] = {2, 1, 1, 6, 5, 16};    // Dauer der MP3-Dateien in Sekunden
    
    int gewehrAnzahl = 6;                    // Anzahl der Gewehre

    Beim Upload muss man darauf achten, dass das richtige Board im Arduino-Menü ausgewählt ist. Dazu muss ebenfalls im Werkzeuge-Menü im Unterpunkt Prozessor »ATmega328P (Old Bootlaoder)« ausgewählt sein.

    Der folgende Programmcode kann mit den oben erwähnten Änderungen einfach kopiert und auf das Arduino-Nano geladen werden.

    Code für das RailFX-Modul Truppenübungsplatz

      /*
         Rail-FX Truppenübungsplatz
         Schießbahn
    
         StartHardware.org
    */
    
    #include <CheapStepper.h>
    #include "SoftwareSerial.h"              // Wird für den DFPlayer benötigt
    #include "DFRobotDFPlayerMini.h"         // Wird für den DFPlayer benötigt
    
    /* ***** ***** Einstellungen ***** ***** ***** *****  ***** ***** ***** *****  ***** ***** ***** ***** */
    
    int schiesswahrscheinlichkeit = 10;
    int panzerwahrscheinlichkeit = 20;
    
    int lautstaerke = 20;                     // Lautstärke des DFPlayers (0 – 30);
    
    int mp3Anzahl = 6;                       // Menge der MP3 Dateien auf der SD-Karte
    int mp3Dauer[] = {2, 1, 1, 6, 5, 16};    // Dauer der MP3 Dateien in Sekunden
    
    int gewehrAnzahl = 6;                    // Anzahl der Gewehre
    
    /* ***** ***** Ab hier beginnt der Programmcode, der nicht angepasst werden muss ***** ***** ***** ***** */
    
    int gunPins[6] = {13, 14, 15, 16, 17, 19};
    int magnetPin = 4;                        // Pin des Relais, an dem der Elektromagnet angeschlossen ist
    int cannonPin = 12;
    int impactPin = 9;
    int fire1Pin = 10;
    int fire2Pin = 11;
    
    /* Timer Variablen */
    long wartezeiten = 2000;                  // Allgemeine Wartezeit im Loop
    
    /* Objekte anlegen */
    SoftwareSerial mySoftwareSerial(3, 2);    // RX, TX für den DFPlayer
    DFRobotDFPlayerMini myDFPlayer;           // DFPlayer Objekt
    
    CheapStepper stepper1 (5, 6, 7, 8);       // Erstellen eines Stepperobjekts für den Panzerturm
    
    void setup() {
      Serial.begin(115200);                  // started die serielle Kommunikation
      mySoftwareSerial.begin(9600);          // started die serielle Kommunikation für den DFPlayer
    
      stepper1.setRpm(16);
      pinMode(magnetPin, OUTPUT);
      pinMode(cannonPin, OUTPUT);
      pinMode(impactPin, OUTPUT);
    
      for (int i = 0; i < 6; i++) {
        pinMode(gunPins[i], OUTPUT);
        digitalWrite(gunPins[i], HIGH);
      }
    
      digitalWrite(cannonPin, HIGH);
      digitalWrite(impactPin, HIGH);
    
      /* DFPlayer Setup */
      Serial.println(F("Initializing DFPlayer ... "));
      if (!myDFPlayer.begin(mySoftwareSerial,false)) {  // nutze softwareSerial um mit dem DFPlayer zu sprechen
        Serial.println(F("Fehler: Prüfe Verbindung zum DFPlayer und SD-Karte"));
      }
      Serial.println(F("DFPlayer Mini online."));
      myDFPlayer.volume(lautstaerke);       // Lautstärke wird zugewiesen
    }
    
    void loop() {
      if (random(schiesswahrscheinlichkeit)<2) schiessbahn();
      if (random(panzerwahrscheinlichkeit)<2) panzerschuss();
      delay(wartezeiten);
    }
    
    void schiessbahn() {
      // Abfolge auf der Schießbahn
      int theRepeations = random(30);
      for (int i = 0; i < theRepeations; i++) {
        myDFPlayer.playFolder(1, 3);
        int theGun = random(gewehrAnzahl);
        delay(100);
        digitalWrite(gunPins[theGun], LOW);
        delay(50);
        digitalWrite(gunPins[theGun], HIGH);
        delay(random(1000));
      }
    }
    
    void panzerschuss() {
      // Abfolge für das Abfeuern der Kanone 
      
      myDFPlayer.playFolder(1, 4);
      
      for (int i = 0; i <= 1000; i++) {
        stepper1.run();
        stepper1.newMoveDegrees (true, 1);
        delay(1);
      }
    
      for (int i = 0; i <= 1200; i++) {
        stepper1.run();
        stepper1.newMoveDegrees (false, 1);
        delay(1);
      }
    
      for (int i = 0; i <= 200; i++) {
        stepper1.run();
        stepper1.newMoveDegrees (true, 1);
        delay(1);
      }
    
      delay(2000);
      myDFPlayer.playFolder(1, 1);
      delay(50);
      digitalWrite(cannonPin, LOW);
      delay(20);
      digitalWrite(cannonPin, HIGH);
      delay(1500);
      myDFPlayer.playFolder(1, 2);
      delay(50);
      digitalWrite(impactPin, LOW);
      delay(30);
      digitalWrite(impactPin, HIGH);
      delay(50);
      digitalWrite(magnetPin, HIGH);
      digitalWrite(impactPin, LOW);
      delay(100);
      digitalWrite(magnetPin, LOW);
      digitalWrite(impactPin, HIGH);
      for (int i = 0; i < 5; i++) {
        analogWrite(fire1Pin, 125 + random(125));
        analogWrite(fire2Pin, 125 + random(125));
        delay(random(500) + 50);
      }
      for (int i = 0; i < 5; i++) {
        analogWrite(fire2Pin, 125 + random(125));
        delay(random(500) + 50);
      }
      analogWrite(fire1Pin, 255);
      analogWrite(fire2Pin, 255);
    }
    
    void printDetail(uint8_t type, int value) {     // DF Player Fehlermeldungen
      switch (type) {
        case TimeOut:
          Serial.println(F("Time Out!"));
          break;
        case WrongStack:
          Serial.println(F("Stack Wrong!"));
          break;
        case DFPlayerCardInserted:
          Serial.println(F("Card Inserted!"));
          break;
        case DFPlayerCardRemoved:
          Serial.println(F("Card Removed!"));
          break;
        case DFPlayerCardOnline:
          Serial.println(F("Card Online!"));
          break;
        case DFPlayerUSBInserted:
          Serial.println("USB Inserted!");
          break;
        case DFPlayerUSBRemoved:
          Serial.println("USB Removed!");
          break;
        case DFPlayerPlayFinished:
          Serial.print(F("Number:"));
          Serial.print(value);
          Serial.println(F(" Play Finished!"));
          break;
        case DFPlayerError:
          Serial.print(F("DFPlayerError:"));
          switch (value) {
            case Busy:
              Serial.println(F("Card not found"));
              break;
            case Sleeping:
              Serial.println(F("Sleeping"));
              break;
            case SerialWrongStack:
              Serial.println(F("Get Wrong Stack"));
              break;
            case CheckSumNotMatch:
              Serial.println(F("Check Sum Not Match"));
              break;
            case FileIndexOut:
              Serial.println(F("File Index Out of Bound"));
              break;
            case FileMismatch:
              Serial.println(F("Cannot Find File"));
              break;
            case Advertise:
              Serial.println(F("In Advertise"));
              break;
            default:
              break;
          }
          break;
        default:
          break;
      }
    }

    Wenn dir das Projekt gefallen hat und du von weiteren interessanten Projekten inspiriert werden willst, sieh dir doch mal mein neues E-Book »Arduino Projekte Volume 1« an!

    • Die beliebtesten Arduino-Projekte von StartHardware
    • Inklusive Schaltplan, Beschreibung und Code
    • Arduino-Schnellstart-Kapitel
    • Kompakter Programmierkurs


    7 Gedanken zu „RailFX-Truppenübungsplatz für Modellbahn und Modellbau“

    1. Tolles Modul!
      Ich bin durch mein geplantes Projekt auf deinen Beitrag gestoßen.
      Leider war er nicht ganz für mein Ziel geeignet, aber Ideen sind dennoch entstanden.
      Bei meinem Projekt soll ein Flugzeug Motorengeräusche von sich geben.
      Sobald ein Knopf gedrückt wird, soll simultan ein kurzes Salvengeräusch abgespielt werden.
      Mein Problem ist, wie bekomme ich das hin? Nur eine Datei abspielen ist ja kein Hexenwerk, aber 2 gleichzeitig?
      Vielleicht hast du Tipps :)

      1. Hi Leon, misch die beiden Sounds doch mit dem Computer, z.B. mit dem Programm Audacity oder Audition zu einer Datei zusammen. Zwei Files kann das Modul nicht zeitgleich abspielen. Liebe Grüße

        1. Hay,
          danke für deine nette und schnelle Antwort.
          Korrigiere mich bitte, wenn ich falsch liege, aber dann kommt ja auch nur der Motorenton auf Knopfdruck, oder?

          1. Na ich meine, dass du die beiden Dateien mit einem Audioprogramm zusammen mischst. Dann wird auf Knopfdruck eine Datei abgespielt, in der beide Töne zusammen geführt sind.

            1. Wäre der Übergang so geschmeidig?
              Muss ich mal ausprobieren.
              Vielen Dank für deinen Rat. Hätte jetzt erwartet, dass der Übergang etwas ruppig, bzw abgehackt wäre.

    2. Danke Stefan,

      für diese grandiose Idee. Das muß ich erweitern mit einem Panzer, der vor- zurück fährt, Turm schwenken ist klar und die Kanone hebt bzw. senkt. Sehr geile Idee.

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

     

    Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.