IoTLAB 2024 - Neues Tutorial - Automatische Schranke

    Für 2024 gibt es eine spezielle Herausforderung für interessierte.

    Über dieses Tutorial hatte ich schon in 2022 nachgedacht. Damals wurde es aber nicht realisiert. In diesem Jahr kommt es mit in das LAB. Es ist ein spezielles Tutorial für Schüler, die die Herausforderung suchen.

    Es handelt sich hierbei um eine Erweiterung meiner diversen Ampelschaltungen. Ja richtig, eine Ampel ist auch hier noch beteiligt. Diese steht aber absolut nicht mehr im Vordergrund. 

    Im Mittelpunkt stehen hier eine automatische Schranke mit einer integrierten Ampel, sowie ein RFID-Leser um die Schranke zu öffnen.

    Die Schranke wird mit einem Servomotor realisiert, an dessen Rotor noch der Schrankenbalken angebracht wird. Weiterhin kommt eine RFID-Leser Platine zum Einsatz, die die Zugangsberechtigung über das kontaktlose Lesen einer Ausweiskarte erfasst.

    Für die einzelnen Bauteile habe ich Halterungen im LEGO Raster über 3D-Druck erstellt. Damit kann ich diese Szenerie auf eine Legobauplatte als Modell aufbauen.

     

    In diesen LEGO City Bausatz, wird die Szene aufgebaut. Aber damit das Tutorial auch richtig rund wird, wird die Schranke auf der Ausfahrseite durch einen Bodensensor erweitert. Hier nutzen wird den im LAB bereitgestellten Reflexoptokoppler CNY70.

    Die Herausforderung besteht also im Zusammenspiel folgender Komponenten:

    - RFID-Leser für die Einfahrt

    - Schranke mit Servomotor und Rot-/Grün-Ampel

    - Bodensensor für die Ausfahrt  (Steigerung: mit Fehlertoleranz) 

    - Ein Ultraschallsensor für die Kontrolle der Schrankendurchfahrt

    Das Tutorial stellt dabei einen ganz üblichen Anwendungsfall dar, der alles im LAB gelernte Wissen abfordert.   

    Der Aufbau zeigt die Komplexität der Aufgabe. Auf der Hardware Seite werden die Ein-/Ausgänge fast komplett ausgenutzt. Da bleibt nicht mehr viel übrig.

    Anspruchsvoller wird es aber in der Software. Die eingesetzten Sensoren haben alle unterschiedliche Konzepte, wie diese in der Software eingebunden werden.  Als Kern des Hauptprogramms kommt wieder das Konzept der Statusmaschine zum Einsatz. Die Schüler müssen hier genau aufpassen, was zu welcher Zeit wirklich passieren soll. Die eingesetzten Sensoren bringen gleichzeitig den Arduino an seine Grenzen. Hier muss also intelligent mit den Ressourcen umgegangen werden, sonst gibt es Quereffekte, die eine reibungslose Funktion stören.

    Genau das soll auch hier vermittelt werden. Ressourcen sind nicht grenzenlos. Man muss oft mit begrenzten Mitteln das Ziel erreichen. Man kann nicht einfach immer einen größeren, oder schnelleren Chip einsetzen. Die Möglichkeit steht oft einfach nicht zur Auswahl.

    Ein kleiner Auszug aus dem vorbereiteten Programm. Hier die Funktion zur Ansteuerung der Schranke per Servomotor. 

    /**************************************************************************/
    /*!
       @brief    Steuert die Schrankenanlage auf oder zu
                 WICHTIG: doSchranke mit gleichem state im loop weiter aufrufen
                          damit der Busy-Status ermittelt werden kann.
       @parms    state - Schranke auf(True) oder zu(False)
       @return   boolean busy - Schrankenlaufzeit
    */
    /**************************************************************************/
    boolean doSchranke(boolean state) {
      int valSchrankeZu = 9;  // ggf. anpassen
      int valSchrankeAuf = 100;

      // Der Status hat sich geaendert, Schrankenlauf aktivieren
      if (state != mySchrankeLastState) {
        mySchrankeLastState = state;
        myServo.attach(ServoPin);
        mySchrankeBusy = true;
        mySchrankeTime = myAktTime;
        if (state) {
          myServo.write(valSchrankeAuf);
        } else {
          myServo.write(valSchrankeZu);
        }
      }

      // Pruefen, sind wir noch Busy?
      // Ermittlung ueber eine Totzeit, Besser Sensor an der Schranke....
      if (mySchrankeBusy && mySchrankeTime + mySchrankeWaitTime < myAktTime) {
        mySchrankeBusy = false;
        myServo.attach(0);
      }
      return mySchrankeBusy;
    }

    Bei genauer Betrachtung fällt der Befehl myServo.attach(0) auf, der am Ende den Motor wieder von seinem analogen Ausgang abkoppelt.  Hierbei handelt es sich schon um eine Schutzfunktion zur Schonung der Ressourcen. Der Servomotor reagiert auf ein PWM Signal, bei dem es auf das genaue Timing ankommt. Hier entsteht aber ein Problem. Gerade bei der Abfrage des Ultraschall Sensors, schafft es der Arduino nicht immer, das Timing für das PWM-Signal stabil zu halten. Damit fängt die Schranke an zu tanzen. Keine gute Sache...

    Getreu einem sehr wahren Zitat:

    Only half of programming is coding. The other 90% is debugging :-)