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