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
- Sharp Infrarot-Entfernungssensor
- Segment-Anzeige
- Servo-Motor
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.

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



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.
Hallo Michel, ja, das geht auch ohne Zähler. Andere Infrarot-Sensoren gehen sicherlich auch. Hier habe ich mal eine Übersicht geschrieben: https://starthardware.org/abstandsmessung-mit-dem-sharp-gp2y0a21yk-ir-entfernungssensor/ Liebe Grüße Stefan