Zum Inhalt springen
Arduino Schranke Modellbau

Arduino-Schranke mit Zähler für den Modellbau-Parkour

    Harald betreibt eine Modellbau-Halle in Österreich und möchte gern eine Schranke für Modellbau-LKWs haben, die automatisch öffnet und die Öffnungen zählt. Da bin ich dabei und ich hoffe, dass dieses Projekt auch für euch spannend ist.

    Wir verwenden zwei Infrarot-Entfernungssensoren. Je nach Typ können sie Objekte in einem bestimmten Abstandsbereich wahrnehmen und senden ein analoges Signal. Ein Servomotor bildet den Antrieb der Schranke, dazu kommt eine Segmentanzeige, die die Anzahl der Öffnungen ab Reset anzeigt.

    Bauteile

    Schaltung

    Die Entfernungssensoren sind mit den analogen Pins 0 und 1 des Arduino-Boards verbunden, die Segmentanzeige mit den Pins D2 und D3. Der Servo erhält seine Steuersignale über den Pin D9.


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


    Funktionsweise

    Wird einer der beiden Infrarot-Entfernungssensoren unterbrochen, öffnet sich die Schranke und der Zähler wird um eins erhöht. Sind beide Entfernungssensoren wieder frei, läuft eine einstellbare Wartezeit ab, danach schließt sich die Schranke wieder.

    Code Arduino-Schranke

    Achtung, du benötigst die folgenden Libraries:

    • MobaTools von MicroBahner
    • TM1637Display
    #include <TM1637Display.h>             // Bibliothek für das Zähler-Modul
    #include <MobaTools.h>                 // Bibliothek um den Servo langsam fahren zu lassen
    
    const int servoPin =  9;               // Anschluss für den Servo
    const int lichtschranke1Pin = 0;       // Anschluss der ersten Lichtschranke
    const int lichtschranke2Pin = 1;       // Anschluss der zweiten Lichtschranke
    
    int thresholdLS1 = 400;                // über diesem Wert gilt die Lichtschranke als durchbrochen
    int thresholdLS2 = 400;                // über diesem Wert gilt die Lichtschranke als durchbrochen
    
    int servoSpeedOeffnen = 50;            // Geschwindigkeit des Servos beim Öffnen der Schranke
    int servoSpeedSchliessen = 10;         // Geschwindigkeit des Servos beim Schließen der Schranke
    
    int servoPositionOffen = 120;          // Position des Servos bei geöffneter Schranke
    int servoPositionGeschlossen = 20;     // Position des Servos bei geöffneter Schranke
    
    int wartezeit = 1000;                  // so lange bleibt die Schranke oben, nachdem alle Objekte den Schrankenbereich verlassen haben
    
    int myCounter = 0;                     // speichert die Öffnungen
    int myState = 3;                       // speichert den Programmzustand (State maschine)
    int myLastState = 3;                   // speichert den Zustand des letzten Durchlaufes des Loops
    long schrankenTimer = 0;               // Timer für das Schließen der Schranke
    
    MoToServo schrankenServo;              // Servo-Objekt
    TM1637Display display(2, 3);           // Segmentanzeige an D2 und D3
    
    void setup() {
      Serial.begin(115200);                // Start der seriellen Kommunikation
      display.setBrightness(0x0c);         // Helligkeit des Displays einstellen
      display.clear();
      schrankenServo.attach(servoPin);     // Servo an Pin 9
      schrankenServo.setSpeed( 9 );        // Geschwindigkeit des Servos
    }
    
    void loop() {
      
      if ((analogRead(lichtschranke1Pin) >= thresholdLS1) || (analogRead(lichtschranke2Pin) >= thresholdLS2)) {   // wenn eine der Lichtschranken ausgelöst ist
        myState = 1;                                         // Schließe die Schranke
        if (myState!=myLastState) myCounter++;               // wenn die Lichtschranken vorher nicht ausgelöst waren, erhöhe die Zählervariable
      } else {                                               // sonst
        if (myState == 1) {                                  // wenn der aktuelle Zustand == 1 ist
          myState = 2;                                       // Ändere den Zustand auf 2 (Wartezeit vor dem Schließen der Schranke)
          schrankenTimer = millis();                         // Starte den Schranken-Timer (für die Wartezeit nötig)
        }
      }
    
      switch (myState) {
        case 1:                                              // Öffnen
          schrankenServo.setSpeed(servoSpeedOeffnen);        // Geschwindigkeit des Servos
          schrankenServo.write(servoPositionOffen);          // Servo in Öffnungsposition bringen
          break;
        case 2:                                              // Zeitverzögerung nach Verlassen des Schrankenbereiches
          if (schrankenTimer + wartezeit < millis()) {       // wenn Wartezeit abgelaufen ist
            myState = 3;                                     // gehe in den Schließ-Zustand
          }
          break;
        case 3:                                              // Schließen
          schrankenServo.setSpeed(servoSpeedSchliessen);     // Geschwindigkeit des Servos
          schrankenServo.write(servoPositionGeschlossen);    // Servo in Schließposition bringen
          break;
      }
    
      
      display.showNumberDecEx(myCounter, 0, true, 4, 0);     // Zeige die Anzahl der Öffnungen auf dem Display an
      myLastState=myState;                                   // Zustandsspeicherung für den nächsten Druchlauf des Loops
      delay(20);                                             // kurze Wartezeit
    
    
      /* Serialle Ausgabe zum Einstellen der Lichtschranken und zur Fehlersuche */ 
      Serial.print("LS1: "); Serial.print(analogRead(lichtschranke1Pin));
      Serial.print("\t LS2: "); Serial.print(analogRead(lichtschranke2Pin));
      Serial.print("\t myState: "); Serial.println(myState); 
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    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


    2 Gedanken zu „Arduino-Schranke mit Zähler für den Modellbau-Parkour“

    1. Hallo
      Das ist genau was ich gesucht habe
      Kann man das auch mit einem Nano machen ? Und geht das auch mit anderen Infrarot Entfernungssensor und welchen ?
      Es geht bestimmt auch ohne Zähler wie beim Seifenspänder oder.
      Brauch nur das die Schranke auf und zu gehen.

    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.