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

#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;               // Anschluß 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


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.