id: Msw5YCj3DZzflNZTRLTr8PbUQO721rmpCxZlDqRN
createdBy: Mj92OSQdrbcE
dateCreated: 1689064662293
name: Komplexaufgabe 0
meta:
  logo: >-
    https://raw.githubusercontent.com/edrys-labs/lab-arduino-basics/main/logo.jpeg
  description: >-
    Die Studierenden wenden die Kenntnisse zur hardwarenahen Konfiguration und
    Nutzung von Eingangs-/Ausgangs-Pins an. Dazu wird ein Anwendungsbeispiel aus
    der Arduino-Welt teilweise auf die Nutzung der avrlibc umgestellt. Im
    Ergebnis steht eine Applikation die kontinuierlich die Distanz zu einem
    Hindernis vermisst.
  selfAssign: true
members:
  teacher: []
  student: []
modules:
  - url: >-
      https://raw.githubusercontent.com/cross-lab-project/edrys_module-markdown-it/2.0.0/index.html
    config: >
      # Komplexaufgabe 0


      Liebe Teilnehmerinnen und Teilnehmer,



      dies ist die erste Komplexaufgabe, die Ihnen Gelegenheit geben soll,  sich
      zusätzlich zu den praktischen Übungen mit den Grundlagen der 
      Programmierung eingebetteter Systeme vertraut zu machen.

      Wir werden  nunmehr jede Woche eine neue Aufgabe für Sie freischalten.

      Die Aufgaben  sind so konzipiert, dass Sie die Lösung selbstständig
      erarbeiten können.

      Sollten Sie dennoch Fragen haben, können Sie sich gerne an die Betreuer 
      wenden.



      Wir haben uns für eine Remote-Lösung entschieden, da die Aufbauten 
      Schritt für Schritt immer aufwändiger werden.

      Entsprechend erlaubt uns der Webzugriff einen ressourcensparenden und
      zeiteffizienten Einsatz der  Setups.

      Die Umsetzung dieser Remote-Lösung ist für uns alle neu und wir  bitten
      Sie daher um Verständnis, falls es zu Anfang noch zu Problemen  kommen
      sollte.



      Noch umfasst unsere Lösung keinen Multi-User-Modus - entsprechend könnten
      Sie einen Kommilitonen ziemlich ärgern, wenn Sie ihm die Kontrolle
      entziehen.

      Prüfen Sie also bitte vorher, ob das Setup gerade von jemand  anderem
      verwendet wird.

      Die „Station“ merkt sich immer den letzten Stand, verlassen Sie Ihren
      Arbeitsplatz ordentlich und kopieren sie vor dem verlassen einfach den
      Original-Code in den Editor ...



      Wir freuen uns auf Ihr Feedback und Ihre Anregungen.


      _Ihr CrossLab Team_



      > Bei __Problemen und Bugs__ helfen uns Screenshots und auch Kopien der
      Developer-Konsole, diese öffnet sich in den meisten Browsern durch

      > die Tasten-Kombination <kdb>Ctrl</kdb>-<kdb>Shift</kdb>-<kdb>i</kdb> ...

      > Zögern Sie nicht direkt eine Mail an
      andre.dietrich@informatik.tu-freiberg.de zu schreiben. 
    studentConfig: ''
    teacherConfig: ''
    stationConfig: ''
    showInCustom: lobby
    width: full
    height: huge
  - url: https://cross-lab-project.github.io/edrys_module-editor/index.html
    config:
      editorText: |
        #include <Wire.h>
        #include <LiquidCrystal_PCF8574.h>

        int lcdi2c = 0x27; // <- Hart eingecodete Adresse, vgl. Datenblatt
        LiquidCrystal_PCF8574 lcd(lcdi2c);

        const int trigPin = 12;
        const int echoPin = 11;

        void setup()
        {
          lcd.begin(16, 2);
          lcd.setBacklight(255);
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("#CrossLab - 2024");
          lcd.setCursor(0, 1);
          lcd.print("Komplexaufgabe 0");

          Serial.begin(9600);
          Serial.print("Los geht's");

          // Aufgabe 1: Ersetzen Sie die Konfiguration der 
          // Pins trigPin und echoPin als Aus- bzw. Eingang
          pinMode(trigPin, OUTPUT);
          pinMode(echoPin, INPUT);
        }

        void loop() {
          digitalWrite(trigPin, LOW);
          delayMicroseconds(5);
          digitalWrite(trigPin, HIGH);
          delayMicroseconds(10);
          digitalWrite(trigPin, LOW);
          while (digitalRead(echoPin) == LOW);
          unsigned long start_time = micros();
          while (digitalRead(echoPin) == HIGH);
          unsigned long duration = micros() - start_time; 
          Serial.println(duration);

          // Aufgabe 3: Berechnen Sie die Entfernung in cm und geben 
          // Sie diese über den seriellen Port und Display aus.
          // float distance = duration ....
          // Serial.print(distance);
          // Serial.println("cm");
          // lcd.setCursor(0, 1);
          // lcd.print(distance);

          delay(1000);
        }
      runCommand: execute
      language: cpp
      theme: light
    showInCustom: station
    width: full
    height: huge
  - url: https://cross-lab-project.github.io/edrys_module-station-stream/index.html
    stationConfig:
      video: true
      audio: false
    showInCustom: station
    width: half
    height: medium
  - url: https://cross-lab-project.github.io/edrys_module-pyxtermjs/index.html
    stationConfig:
      server: http://localhost:5000/pty
      execute: execute
      script: >
        echo $CODE | base64 --decode > Hello.ino

        arduino-cli sketch new Hello

        olddir=$(pwd)

        mv Hello.ino Hello

        cd Hello

        arduino-cli board attach -p /dev/ttyACM0 -b arduino:avr:uno

        cd $olddir

        arduino-cli compile Hello && arduino-cli upload -p /dev/ttyACM0 Hello &&
        arduino-cli monitor -p /dev/ttyACM0
      enable:
        teacher: true
        student: true
    showInCustom: station
    width: half
    height: medium
  - url: >-
      https://raw.githubusercontent.com/cross-lab-project/edrys_module-markdown-it/2.0.0/index.html
    config: >-

      # Komplexaufgabe 0


      > Im Rahmen dieser Aufgabe machen Sie sich mit der
      Remote-Entwicklungsumgebung vertraut und wenden Ihre Kenntnisse zur
      digitalen I/O Programmierung an.


      Grundlage ist ein Arduino-Beispielprogramm, dass Sie __in Teilen auf eine
      `avrlibc` Implementierung__ transformieren. 


      Die Arduino-Implementierung illustriert die erwartete Funktionalität - ein
      Distanzwert in `cm` wird über den seriellen Port ausgegebenen. Die Vorlage
      sendet einen Triggerimpuls an den Ultraschallsensor und misst die Zeit bis
      zum Empfang des Echos. Dieser Trigger ist so konfiguriert, dass zunächst
      für 5 Mikrosekunden ein `LOW` Pegel anliegt, danach für 10 Mikrosekunden
      ein `HIGH` Pegel. Wenn der Trigger-Pin dann auf `LOW` gesetzt wird,
      startet die Messung (vgl [Datenblatt
      SRF04](https://datasheetspdf.com/pdf-file/523589/ETC/SRF04/1)). Für die
      Bestimmung der Distanz müssen wir also, wie im Arduino-Code gezeigt, die
      Laufzeit des Echos erfassen. Dafür können Sie die auch in Ihrer Lösung die
      `micros()` Funktion verwenden (die wir in einem späteren Projekt auch
      ersetzen). Der Ultraschallsensor ist an den Pins 12 und 11 angeschlossen.


      Folgen Sie den Anweisungen im Code und ersetzen Sie die Arduino-Funktionen
      durch die entsprechenden `avrlibc` Befehle:


      0. Aufgabe: Kritisieren Sie die Implementierung des Arduino-Beispiels.
      Welches Problem tritt ggf. auf? Betrachten Sie dabei insbesondere die
      Verwendung der `delayMicroseconds()` Funktion. Welche Verbesserungen
      würden Sie vorschlagen?


      1. Aufgabe: Ersetzen Sie die Zeilen 25 und 26 durch `DDRx`
      Registerkonfigurationen. Ermitteln Sie dafür den zugehörigen für `trigPin`
      und `echoPin` aus dem Datenblatt des Atmega328p.


      2. Aufgabe: Ersetzen Sie die Zeilen 30, 32 und 34 durch eine `PORTx`
      Registerkonfiguration. Evaluieren Sie in Zeile 37 den Status des `echoPin`
      mittels `PINx`.


      3. Aufgabe: Stellen Sie eine Formel zur Berechnung der Entfernung in cm
      auf. Fügen Sie diese ein und geben Sie den Wert über den seriellen Port
      und das Display aus.


      ### Original Code


      ``` cpp

      #include <Wire.h>

      #include <LiquidCrystal_PCF8574.h>


      int lcdi2c = 0x27; // <- Hart eingecodete Adresse, vgl. Datenblatt

      LiquidCrystal_PCF8574 lcd(lcdi2c);


      const int trigPin = 12;

      const int echoPin = 11;


      void setup()

      {
        lcd.begin(16, 2);
        lcd.setBacklight(255);
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("#CrossLab - 2024");
        lcd.setCursor(0, 1);
        lcd.print("Komplexaufgabe 0");

        Serial.begin(9600);
        Serial.print("Los geht's");

        // Aufgabe 1: Ersetzen Sie die Konfiguration der 
        // Pins trigPin und echoPin als Aus- bzw. Eingang
        pinMode(trigPin, OUTPUT);
        pinMode(echoPin, INPUT);
      }


      void loop() {
        digitalWrite(trigPin, LOW);
        delayMicroseconds(5);
        digitalWrite(trigPin, HIGH);
        delayMicroseconds(10);
        digitalWrite(trigPin, LOW);
        while (digitalRead(echoPin) == LOW);
        unsigned long start_time = micros();
        while (digitalRead(echoPin) == HIGH);
        unsigned long duration = micros() - start_time; 
        Serial.println(duration);

        // Aufgabe 3: Berechnen Sie die Entfernung in cm und geben 
        // Sie diese über den seriellen Port und Display aus.
        // float distance = duration ....
        // Serial.print(distance);
        // Serial.println("cm");
        // lcd.setCursor(0, 1);
        // lcd.print(distance);
        
        delay(1000);
      }

      ```
    studentConfig: ''
    teacherConfig: ''
    stationConfig: ''
    showInCustom: station
    width: full
    height: medium