Zum Inhalt springen
RailFX Effekte für Modellbahn und Modellbau mit Arduino Nano Jahrmarkt Modul Titel

RailFX Jahrmarkt-Modul

Das erste Modul der RailFX-Serie ist das Jahrmarkt-Modul. Es handelt sich dabei um verschiedene Effekte, die man auf einem Jahrmarkt erwarten darf:

  • Riesenrad
  • Karussell
  • Lauflicht
  • Straßenbeleuchtung
  • Stroboskop
  • Soundmodul

Video – RailFX, Jahrmarkt-Modul

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.

Jmx0O2RpdiBjbGFzcz0mcXVvdDtudi1pZnJhbWUtZW1iZWQmcXVvdDsmZ3Q7Jmx0O2lmcmFtZSB0aXRsZT0mcXVvdDtSYXlsRlggSmFocm1hcmt0ICZuZGFzaDsgRWZmZWt0ZSBmJnV1bWw7ciBNb2RlbGxiYWhuIHVuZCBNb2RlbGxiYXUgbWl0IEFyZHVpbm8mcXVvdDsgd2lkdGg9JnF1b3Q7MTIwMCZxdW90OyBoZWlnaHQ9JnF1b3Q7Njc1JnF1b3Q7IHNyYz0mcXVvdDtodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC9kcGJ2RjV3WHo5ND9mZWF0dXJlPW9lbWJlZCZxdW90OyBmcmFtZWJvcmRlcj0mcXVvdDswJnF1b3Q7IGFsbG93PSZxdW90O2FjY2VsZXJvbWV0ZXI7IGF1dG9wbGF5OyBjbGlwYm9hcmQtd3JpdGU7IGVuY3J5cHRlZC1tZWRpYTsgZ3lyb3Njb3BlOyBwaWN0dXJlLWluLXBpY3R1cmUmcXVvdDsgYWxsb3dmdWxsc2NyZWVuJmd0OyZsdDsvaWZyYW1lJmd0OyZsdDsvZGl2Jmd0Ow==

Bauteile

Das hier sind die Komponenten, die ich verwendet habe:

Schaltplan

RailFX Jahrmarkt Rummel Karussell Schaltplan mit Arduino für die Modelleisenbahn Modellbahn

Wie alle RailFX-Module benötigt auch das Jahrmarkt-Modul Verbindungen zum Control-Modul (Davon benötigt man nur ein einziges Modul im gesamten System!). Dabei handelt es sich um eine Verbindung aller A4 Pins (benutzt wird dieser Pin als digitaler Input 18) und eine Verbindung zur Stromversorgung (5V+ und GND).


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


Achtung: Am Pin A4 ist das Control-Signal des RailFX Control-Moduls angelegt. Es steuert die Tageszeit und ist zwingend erforderlich, um alle Module zu synchronisieren.

RailFX Effekte für Modellbahn und Modellbau mit Arduino Nano  Jahrmarkt-Modul Überblick

Bei dem Riesenrad und Karussell handelt es sich um zwei Schrittmotoren, die die Modelle der jeweiligen Fahrgeschäfte antreiben. Beide Schrittmotoren werden über jeweils einen Schrittmotortreiber gesteuert.

Die LEDs für die Lauflichter, die Straßenbeleuchtung und das Stroboskop sind jeweils über einen Vorwiderstand an digitale Arduino Pins angeschlossen. Der Widerstand begrenz den Stromfluss. Wenn man mehr LEDs benötigt, kann man diese einfach nach dem Vorwiderstand parallel schalten. Sie leuchten dann alle weniger hell. Sicherlich gibt es ein Maximum an LEDs, die man so verschalten kann. Eine genaue Zahl kenne ich nicht. Hier empfehle ich, das einfach auszuprobieren.

Wenn man viel mehr LEDs benötigt, sollte man die Kanäle verstärken. Das kann man z.B. mit einem ULN2803A Darlington-Transistor-Array erreichen.

Für die Tonausgabe wird der DFPlayer Mini verwendet. Er spielt MP3- und WAV-Dateien von einer SD-Karte ab. Für die Nutzung muss die DFPlayer Mini Bibliothek eingebunden werden. Klicke dafür im Arduino-Menü auf Sketch>Bibliotheken einbinden>Bibliotheken verwalten und gib im Suchfeld »dfplayer mini« ein. Installiere die Bibliothek DFPlayer Mini MP3 by Makuna in der aktuellen Version.

Die SD-Karte muss im FAT16 oder FAT32-Dateisystem formatiert sein. Darüber hinaus müssen sich die Dateien im Ordner »01« befinden und die Dateinamen müssen aufeinander folgend 001.mp3, 002.mp3, 003.mp3 usw. benannt sein. Wie erwähnt, dürfen auch WAV-Dateien verwendet werden: 001.mp3, 002.wav, 003.mp3 …

Da die Schrittmotoren einiges an Energie benötigen und das mit unter den DFPlayer stört, kann man einen Stützkondensator (100uF) in die Stromschienen nahe der Treiberplatinen stecken.

Ein paar Beispieldateien kann man hier herunterladen.

RailFX Effekte für Modellbahn und Modellbau mit Arduino Nano Schaltplan des Jahrmarkt-Moduls Close-Up

Einstellungen im Code

int lauflichtTimeout = 100;              // Lauflicht Geschwindigkeit (ms)
int strobeFlashTimeout = 100;            // Stroboskop Impulsdauer (ms)
int strobePauseTimeout = 1000;           // Stroboskop Pausendauer (ms)
int riesenradPauseTimeout = 3;           // Riesenrad Pausendauer (s)
int karussellPauseTimeout = 2;           // Karussell Pausendauer (s)
int strassenlampenTimeout = 100;         // Einschaltzeit der Straßenlampen (ms)
int lautstaerke = 10;                    // Lautstärke des DFPlayers (0 – 30);

int mp3Anzahl = 7;                       // Menge der MP3-Dateien auf der SD-Karte
int mp3Dauer[] = {28, 9, 20, 2, 4, 17, 23}; // Dauer der MP3-Dateien in Sekunden
int mp3Wahrscheinlichkeit = 10;          // Wahrscheinlichkeit, mit der MP3s abgespielt werden, 10 oft, 100 selten

Im Code lassen sich unterschiedliche Einstellungen treffen:

  • Lauflicht Geschwindigkeit in Millisekunden
  • Stroboskop Impulsdauer in Millisekunden
  • Stroboskop Pausendauer in Millisekunden
  • Riesenrad Pausendauer in Sekunden
  • Karussell Pausendauer in Sekunden
  • Einschaltzeit der Straßenlampen in Millisekunden
  • Lautstärke des DFPlayers (0 – 30);
  • Menge der MP3-Dateien auf der SD-Karte
  • Dauer der MP3-Dateien in Sekunden (kann kürzer als die MP3s sein)
  • Wahrscheinlichkeit, mit der MP3s abgespielt werden: 10 oft, 100 selten

Gesamter Programm-Code

/*
     Rail-FX Jahrmarkt-Modul
     StartHardware.org

     Permalink: https://starthardware.org/railfx-jahrmarkt-modul/
*/

#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 meineAdresse = 2;                    // muss im System einzigartig sein! Darf es also nur einmal geben.

int lauflichtTimeout = 100;              // Lauflicht Geschwindigkeit (ms)
int strobeFlashTimeout = 100;            // Stroboskop Impulsdauer (ms)
int strobePauseTimeout = 1000;           // Stroboskop Pausendauer (ms)
int riesenradPauseTimeout = 3;           // Riesenrad Pausendauer (s)
int karussellPauseTimeout = 2;           // Karussell Pausendauer (s)
int strassenlampenTimeout = 100;         // Einschaltzeit der Straßenlampen (ms)
int lautstaerke = 10;                    // Lautstärke des DFPlayers (0 – 30);

int mp3Anzahl = 7;                       // Menge der MP3 Dateien auf der SD-Karte
int mp3Dauer[] = {28, 9, 20, 2, 4, 17, 23}; // Dauer der MP3 Dateien in Sekunden
int mp3Wahrscheinlichkeit = 10;          // Wahrscheinlichkeit, mit der MP3s abgespielt werden, 10 oft, 100 selten

/* ***** ***** Ab hier beginnt der Programmcode, der nicht angepasst werden muss ***** ***** ***** ***** */

int strassenlampenPin = 9;              // an diesem Pin sind die Straßenlampen angeschlossen
int lauflicht1Pin = 8;                  // an diesem Pin sind die Lauflicht A Lampen 2 angeschlossen
int lauflicht2Pin = 7;                  // an diesem Pin sind die Lauflicht A Lampen 3 angeschlossen
int lauflicht3Pin = 6;                  // an diesem Pin sind die Lauflicht B Lampen 1 angeschlossen
int lauflicht4Pin = 5;                  // an diesem Pin sind die Lauflicht B Lampen 2 angeschlossen
int strobePin = 4;                      // an diesem Pin ist ein Stroboskop (weiße LED?) angeschlossen

//int motorPins1[4] = {10, 11, 12, 13};    // Pins des Stepper-Motors 1
//int motorPins2[4] = {14, 15, 16, 17};    // Pins des Stepper-Motors 2

/* Speicher-Variablen */
int lauflichtPosition = 0;              // speichert die Position des Lauflichts A
int strassenlampenHelligkeit = 0;       // speichert, wie hell die Straßenlampen leuchten

/* Timer Variablen */
long strassenlampenTimer = 0;            // Timer der Straßenlampen
long lauflichtTimer = 0;                 // Timer Lauflicht
long strobeTimer = 0;                    // Timer des Stroboskop
long riesenradTimer = 0;                 // Timer des Risenrads
long karussellTimer = 0;                 // Timer des Karussells
long soundTimer = 0;                     // Timer des DFPlayers
long soundTimeout = 0;                   // Speichert die Abspieldauer des aktuellen MP3
long moveStartTime1 = 0; // this will save the time (millis()) when we started each new move
long moveStartTime2 = 0; // this will save the time (millis()) when we started each new move

/* State Variablen */
int myState = 3;                         // Status der Haupt-Statemachine, startet bei 3, da hier alles abgeschaltet ist
int riesenradState = 0;                  // Status des Riesenrads
int karussellState = 0;                  // Status des Karussell
int strobeState = 0;                     // Status des Stroboskops
int soundState = 0;                      // Status des DFPlayers
bool moveClockwise21 = true;
bool moveClockwise22 = true;
int stepsLeft1 = 0;
int stepsLeft2 = 0;

int soundRandom;
int theSound;
int soundPlaying = false;

bool moveClockwise1 = true;
bool moveClockwise2 = true;

String stateName;

/* Variablen vom Controlmodul um die Uhrzeit festzustellen*/
boolean receive = false;
boolean receiveStarted = false;
int receiveTimeout = 10;
long receiveTimer = 0;
int receivedTime = 0;
int receivePulse = 0;
int lastReceivePulse = 0;
int receivePin = 18;
int myTime = 0;

/* Objekte anlegen */
SoftwareSerial mySoftwareSerial(3, 2);   // RX, TX für den DFPlayer
DFRobotDFPlayerMini myDFPlayer;          // DFPlayer Objekt

CheapStepper stepper1 (14, 15, 16, 17);  // Erstellen eines Stepperobjekts für das Risenrad
CheapStepper stepper2 (10, 11, 12, 13);  // Erstellen eines Stepperobjekts für das Karussell

#define PAYLOAD_SIZE 2                   // nötig für die Kommunikation zum Master
int uhrzeit = 0;                         // speichert die uhrzeit vom Master-Modul (0 und 255)
byte nodePayload[PAYLOAD_SIZE];          // speichert die Daten vom Master-Modul zwischen

void setup() {
  mySoftwareSerial.begin(9600);          // started die serielle Kommunikation für den DFPlayer
  Serial.begin(115200);                  // started die serielle Kommunikation
  
  pinMode(receivePin, INPUT);            // Empfangspin vom Control-Modul
  pinMode(lauflicht1Pin, OUTPUT);        // Lauflicht als Output festlegen
  pinMode(lauflicht2Pin, OUTPUT);        // Lauflicht als Output festlegen
  pinMode(lauflicht3Pin, OUTPUT);        // Lauflicht als Output festlegen
  pinMode(lauflicht4Pin, OUTPUT);        // Lauflicht als Output festlegen
  pinMode(strobePin, OUTPUT);            // Strobe als Output festlegen
  lauflichtAus();
  strobeAus();
  strassenlampenAus();
  stepper1.setRpm(16);
  stepper2.setRpm(12);

  randomSeed(19);

  /* DFPlayer Setup */
  Serial.println(F("Initializing DFPlayer ... "));
  if (!myDFPlayer.begin(mySoftwareSerial,false,true)) {  // nutze softwareSerial um mit dem DFPlayer zu sprechen 
    Serial.println(F("Fehler: Prüfe Verbindung zum DFPlayer und SD-Karte"));
    while (true) {
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini online."));
  myDFPlayer.volume(lautstaerke);       // Lautstärke wird zugewiesen
  delay(500);
}

void loop() {

  receiveFunction();              // Führe Anweisungen für Empfang aus
  if (receiveStarted == false) {
    if (myTime > 22) {              // ***** Später Abend *****
      strassenlampenAn();           // Straßenlampen an
      lauflichtAn();                // Lauflicht an
      strobeAn();                   // Stroboskop an
      soundAn();                    // Sound An
      riesenradmotorAn();           // Risenradmotor an
      karussellmotorAn();           // Karussellmotor an
    } else if (myTime > 18) {       // ***** Abend *****
      strassenlampenAn();          // Straßenlampen an
      lauflichtAn();               // Lauflicht an
      strobeAn();                  // Stroboskop an
      soundAn();                   // Sound An
      riesenradmotorAn();          // Risenradmotor an
      karussellmotorAn();          // Karussellmotor an
    } else if (myTime > 12) {       // ***** Nachmittag *****
      strassenlampenAus();          // Straßenlampen aus
      lauflichtAus();               // Lauflicht aus
      strobeAus();                  // Stroboskop aus
      soundAus();                   // Sound aus
      riesenradmotorAn();           // Risenradmotor an
      karussellmotorAus();          // Karussellmotor aus

    } else if (myTime > 9) {        // ***** Vormittag *****
      strassenlampenAus();          // Straßenlampen aus
      lauflichtAus();               // Lauflicht aus
      strobeAus();                  // Stroboskop aus
      soundAus();                   // Sound aus
      riesenradmotorAus();          // Risenradmotor aus
      karussellmotorAus();          // Karussellmotor aus

    } else if (myTime > 7) {        // ***** Morgen *****
      strassenlampenAus();           // Straßenlampen an
      lauflichtAus();               // Lauflicht aus
      strobeAus();                  // Stroboskop aus
      soundAus();                   // Sound aus
      riesenradmotorAus();          // Risenradmotor aus
      karussellmotorAus();          // Karussellmotor aus

    } else {                        // ***** Nacht *****
      strassenlampenAn();           // Straßenlampen an
      lauflichtAus();                // Lauflicht aus
      strobeAus();                  // Stroboskop aus
      soundAus();                   // Sound aus
      riesenradmotorAus();          // Risenradmotor aus
      karussellmotorAus();          // Karussellmotor aus
    }
  }
}

void strassenlampenAn() {
  if (strassenlampenTimer + strassenlampenTimeout < millis()) {
    strassenlampenHelligkeit++;
    if (strassenlampenHelligkeit > 255) strassenlampenHelligkeit = 255;
    strassenlampenTimer = millis();
    analogWrite(strassenlampenPin, 255-strassenlampenHelligkeit);
  }
}

void strassenlampenAus() {
  strassenlampenHelligkeit = 0;
  analogWrite(strassenlampenPin, 255);
  strassenlampenTimer = millis();
}

void lauflichtAn() {
  if (lauflichtTimer + lauflichtTimeout < millis()) {
    lauflichtTimer = millis();
    lauflichtPosition++;
    if (lauflichtPosition > 3) {
      lauflichtPosition = 0;
    }
    if (lauflichtPosition == 0) {
      digitalWrite(lauflicht1Pin, HIGH);
      digitalWrite(lauflicht2Pin, HIGH);
      digitalWrite(lauflicht3Pin, HIGH);
      digitalWrite(lauflicht4Pin, LOW);
    } else if (lauflichtPosition == 1) {
      digitalWrite(lauflicht1Pin, HIGH);
      digitalWrite(lauflicht2Pin, HIGH);
      digitalWrite(lauflicht3Pin, LOW);
      digitalWrite(lauflicht4Pin, HIGH);
    } else if (lauflichtPosition == 2) {
      digitalWrite(lauflicht1Pin, HIGH);
      digitalWrite(lauflicht2Pin, LOW);
      digitalWrite(lauflicht3Pin, HIGH);
      digitalWrite(lauflicht4Pin, HIGH);
    } else if (lauflichtPosition == 3) {
      digitalWrite(lauflicht1Pin, LOW);
      digitalWrite(lauflicht2Pin, HIGH);
      digitalWrite(lauflicht3Pin, HIGH);
      digitalWrite(lauflicht4Pin, HIGH);
    }
  }
}

void lauflichtAus() {
  lauflichtTimer = millis();
  digitalWrite(lauflicht1Pin, HIGH);
  digitalWrite(lauflicht2Pin, HIGH);
  digitalWrite(lauflicht3Pin, HIGH);
  digitalWrite(lauflicht4Pin, HIGH);
}

void strobeAn() {
  switch (strobeState) {
    case 0:
      digitalWrite(strobePin, LOW);
      if (strobeTimer + strobeFlashTimeout < millis()) {
        strobeTimer = millis();
        strobeState = 1;
      }
      break;
    case 1:
      digitalWrite(strobePin, HIGH);
      if (strobeTimer + strobePauseTimeout < millis()) {
        strobeState = 0;
        strobeTimer = millis();
      }
      break;
  }
}

void strobeAus() {
  digitalWrite(strobePin, HIGH);
  strobeTimer = millis();
}

void riesenradmotorAn() {
  stepper1.run();

  switch (riesenradState) {
    case 0: // fahren
      stepsLeft1 = stepper1.getStepsLeft();
      if (stepsLeft1 == 0) {
        moveClockwise1 = !moveClockwise1;
        if (random(3) <= 1) {
          riesenradState = 1;
          riesenradTimer = millis();
        } else {
          stepper1.newMoveDegrees (moveClockwise1, 360 + random(360));
        }
      }
      break;
    case 1: // pause
      if (riesenradTimer + (riesenradPauseTimeout * 1000) < millis()) {
        riesenradState = 0;
      }
      break;
  }
}

void riesenradmotorAus() {
  /*stepsLeft1 = stepper1.getStepsLeft();
    if (stepsLeft1>0) stepper1.stop();*/
}

void karussellmotorAn() {
  stepper2.run();
  switch (karussellState) {
    case 0: // fahren
      stepsLeft2 = stepper2.getStepsLeft();
      if (stepsLeft2 == 0) {
        moveClockwise2 = !moveClockwise2;
        if (random(5) <= 1) {
          karussellState = 1;
          karussellTimer = millis();
        } else {
          stepper2.newMoveDegrees (moveClockwise2, 90 + random(360));
        }
      }
      break;
    case 1: // pause
      if (karussellTimer + (karussellPauseTimeout * 1000) < millis()) {
        karussellState = 0;
      }
      break;
  }
}

void karussellmotorAus() {
  /*stepsLeft2 = stepper2.getStepsLeft();
    if (stepsLeft2>0) stepper2.stop();*/
}

void soundAn() {
  switch (soundState) {
    case 0:
      Serial.println("soundTimer 0");
      soundRandom = random(mp3Wahrscheinlichkeit);
      if (soundRandom < 1) {
        soundState = 1;
        theSound = random(mp3Anzahl) + 1;
        soundTimer = millis();
        soundTimeout = mp3Dauer[theSound - 1] * 1000;
        Serial.print("Playsound: \t\t\t"); Serial.print(theSound); Serial.print("\t\t\t"); Serial.println(soundTimeout);
        myDFPlayer.playFolder(1, theSound); //play specific mp3 in SD:/15/004.mp3; Folder Name(1~99); File Name(1~255)
        soundPlaying = true;
      } else {
        soundTimer = millis();
        soundTimeout = 500;
        soundState = 1;
      }
      break;
    case 1:
      if (soundTimer + soundTimeout < millis()) {
        soundPlaying = false;
        soundState = 0;
      }
      break;
  }
}

void soundAus() {
  if (soundPlaying == true) {
    Serial.println(soundPlaying);
    myDFPlayer.pause();
    soundPlaying = false;
  }
}

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;
  }
}

void receiveFunction() {                      // Empfängt die Uhrzeit vom Control-Modul
  receivePulse = digitalRead(receivePin);     // Lies den Empfangspin aus
  
  if ((receiveTimer + receiveTimeout < millis()) && (receiveStarted == true)) {
    // Bei Timeout und aktivem Empfang
    receiveStarted = false;                   // beende aktiven Empfang
    myTime = receivedTime - 1;                // speichere die empfangene Zeit
    receivedTime = 0;                         // setze die Hilfsvariable zum Zeitempfang zurück
    Serial.println(myTime);                   // serielle Ausgabe
  }
  // falls ein Puls am Empfangspin erfasst wird, der vorher nicht da war
  if ((receivePulse == 0) && (lastReceivePulse == 1)) {
    receiveTimer = millis();                  // starte Timer neu
    if (receiveStarted == false) receiveStarted = true;  // starte aktiven Empfang, wenn noch nicht geschehen
    receivedTime++;                           // es gab einen Puls, also erhöhe die Hilfsvariable zum Zeitempfang
  }
  lastReceivePulse = receivePulse;            // aktuellen Zustand am Pin für nächsten Durchlauf merken
}

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


11 Gedanken zu „RailFX Jahrmarkt-Modul“

  1. Hallo Stefan,
    ich werde so gut wie alle Projekte sehr gern übernehmen, denn sie gefallen mir ungemein, tolle Arbeit.

    Darüber hinaus habe ich noch 2 Vorhaben, bei denen ich auf Grund mangelhafter Programmierkenntnisse einfach nicht weiterkomme. In beiden Fällen geht es darum, Prozesse gleichzeitig ablaufen zu lassen.
    1. Eine Windmühle, angetrieben von einem ruhig laufenden Schrittmotor, bewegt sich permanent und
    langsam. Windgeräusche werden von einem Soundmodul mit SD-Card (MH, einfaches Modell aus China
    mit gutem Klang), das nur eingeschaltet werden soll, erzeugt.
    Ebenfalls über den Motorshield auf einem Arduino Uno sollen 2 DC-Motoren als Antrieb für jeweils
    einen Bergwerksschacht (Vorlauf – Halten – Rücklauf – Halten) angetrieben werden. Dazu sollen
    natürlich auch die nötigen Geräusche von einem MP3-Player (mehrere Sounds) erzeugt werden.
    2. An einer Wassermühle (angetrieben von einem langsam laufenden Schrittmotor) plätschert der Bach,
    Vögel zwitschern. Der Sound wird zu Beginn aktiviert und mehrere MP3-Sounds nacheinander mit
    einem einfachen MH-Modul mit SD-Card abgespielt. Am Bachlauf befindet sich darüber gelegen ein
    Schloss, das dem Schlossherrn namens Dracula gehört. Zu später Stunde (Interrupt-gesteuert?)
    verstummt die Mühle, es herrscht Stille. Das Szenario: Glocken läuten – Wolfsgeheul – knarrend öffnet sich ein Sargdeckel, es blitzt und donnert, Dracula ist zu sehen – ein junges Mädchen kommt vorbei, erschrickt und läuft weg, ihr folgt ein Jäger mit Hammer und Holzkeil – Draculars böses Gelächter -der Sargdeckel schließt sich. Am Rande stehen weitere Vampire, (Figuren von der Fima NOCH erhältlich), ein Oldtimer-Pkw der 30-ger Jahre passt auch gut zum Szenario. Während dieser Zeit ändert sich das Licht im Schloss auf ab- und aufschwellend in gelb und orange. Der Schrei von Fledermäusen oder ähnlich ist zu vernehmen und das Szenario wird beendet, die Vögel zwitschern wieder, die Wassermühle klappert. Für die Bewegung des Sargdeckels und die kreisförmige Bewegung von Mädchen und folgendem Jäger würde ich 2 Servos benutzen, wodurch wohl die Benutzung eines MP3-Soundmoduls ausfällt, oder man benutzt ebenfalls ein MP3-Abspieler und lässt MP3 nacheinander abspielen, gut zeitlich abgestimmt? Für das Szenario wollte ich wieder ein Arduino Uno mit Motor Shield V1 benutzen und LED für Beleuchtung Wassermühle, Scheinwerfer zum Sarg Draculars sowie Burgbeleuchtung und Blitz.
    Ich würde mich sehr freuen, wenn es zu diesen Szenarien Anregungen geben würde.
    Viele Grüße von Manne aus Berlin

  2. guten Tag, ich bin´s nochmal. Ich habe ein Problem. Und zwar, wenn ich den code starte, geht das Stroboskob, sowie das Lautlich in die Dauerbeleuchtung. Die Straßenlaterne mal so, mal so. Manchmal geht sie nach ein paar Sekunden aus und manchmal eben nicht. Es kann aber nicht im Code an der If Abfrage “myTime” liegen, ich habe ausprobiert, in jeder Abfrage alle Lampen auszuschalten, sie gehen allerdings unverändert an. Die Hardware habe ich auch überprüft, ich habe den Schaltplan 1 zu 1 nachgebaut. Bei den Steppern passiert übrigens, genauso wie bei der Uhrzeit, gar nichts. Vielleicht gibt es ja eine Lösung, ich würde mich darüber riesig freuen. Mfg Jukka

    ps: danke für die Antwort auf den Kommentar davor :)

    1. Hi Jukka, oh, das hab ich nicht in den Bauteilen angeben. Das muss ich echt nachholen. Also ich hab das hier verwendet: Netzteil 5V, 10A – das ist recht groß dimensioniert und sollte eine größere Menge von Modulen betreiben können. Viel Spaß damit und schön, dass dir das System gefällt. Liebe Grüße Stefan

  3. Pingback: DFPlayer Mini-MP3-Player für Arduino – Arduino Tutorial

  4. Hallo,
    gefällt mir sehr gut. Leider kann ich den Nano nicht flashen. Mir fehlen die Header-Dateien
    (CheapStepper.h, SoftwareSerial.h und DFRobotDFPlayerMini.h).
    Wäre schön, wenn jemand eine Antwort darauf hätte, wo ich die her bekomme.
    Danke

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

 

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