id: wrFIoY73UQ8skrwj createdBy: 15sg55AmHTPu dateCreated: 1689064662293 name: Komplexaufgabe 1 - Distanzmessung meta: logo: >- https://raw.githubusercontent.com/TUBAF-IfI-LiaScript/VL_EAVD/master/excercise/images/excercise_04.png 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 defaultNumberOfRooms: '3' members: teacher: [] student: [] modules: - url: https://edrys-labs.github.io/module-markdown-it/index.html config: content: >- # Komplexaufgabe 1 - Distanzmessung 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. Wir haben uns für eine Remote-Lösung entschieden, da die Aufbauten Schritt für Schritt der Labore immer aufwändiger werden. Entsprechend erlaubt uns der Webzugriff einen ressourcensparenden und zeiteffizienten Einsatz der Setups. Die Umsetzung ist Bestandteil eines Forschungsprojektes und wir freuen uns über Ihr Feedback. > Die Aufgabenstellung umfasst zwei Aufgabenkomplexe A und B. Der Bereich A) richtet sich insbesondere an Studierende mit bislang wenig ausgeprägter Programmiererfahrung. Studierende, die mit dem Mikrocontroller vertraut sind, nutzen diese Aufgabe um Ihre Fähigkeiten mit dem Aufgabenkomplex B) zu vertiefen. 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. Für beide Aufgabenkomplexe erläutert Raum 1 die Fragestellungen und Lernziele. Danach sind für A) zunächst "Raum 2" und für B) der "Raum 3" zu bearbeiten. Die praktische Umsetzung auf dem Laborsetup erfolgt in beiden Fällen auf der "Station". > Ihre Codeänderungen werden auf der Station anonymisiert gespeichert. Wir wollen damit tatsächliche Problemfelder identifizieren, um damit die Veranstaltung systematisch weiterzuentwickeln. Aus den Daten können keine Rückschlüsse auf den Teilnehmenden oder spezifika des Rechners gezogen werden. Wenn Sie Fragen dazu haben, sprechen Sie uns gern an. Wir freuen uns auf Ihr Feedback und Ihre Anregungen. _Ihr CrossLab Team_ studentConfig: content: '' teacherConfig: content: '' stationConfig: content: '' showInCustom: lobby width: full height: huge - url: https://edrys-labs.github.io/module-markdown-it/index.html config: content: >- # Tutorial für Studierende **Einführung in die Arbeit mit den Remote-Laboren auf der Basis des Edrys-Frameworks** studentConfig: content: '' teacherConfig: content: '' stationConfig: content: '' showInCustom: lobby width: half height: tall - url: https://edrys-labs.github.io/module-markdown-it/index.html config: content: >- # Aufgabeninhalt ## Lernziele ### Aufgabenkomplex A > Entwickeln Sie einen Programmcode, mit dem einfache Distanzmessungen mit Hilfe eines [Ultraschallsensors](https://www.conrad.de/de/ratgeber/industrie-40/ultraschallsensoren.html) umgesetzt werden können. Im Rahmen dieser Aufgabenstellung: 1. erarbeiten Sie sich die Methoden für die systematische Analyse eines Sensordatenblattes 2. setzen die Muster für die Ansteuerung des Sensors um und 3. entwickeln Codes in C für die Auswertung von Messungen. Sie erarbeiten sich dafür die Struktur eines Code Fragmentes, das auf der Basis von Arduino-Bibliotheken geschrieben und ergänzen Funktionen. Die Ausgabe erfolgt über die Serielle Schnittestelle oder wahlweise über das Display. > Der Zeitaufwand für die Umsetzung der Aufgabe beträgt etwa 45 Minuten. ### Aufgabenkomplex B Im Rahmen dieser Aufgabenstellung: > Entwickeln Sie ein Distanzmessystem, dass es Ihnen erlaubt, per Serielle Schnittstelle auszuwählen, ob die Ausgaben auf dem Display in cm oder inch realisiert werden sollen. Diese Aufgabenstellung baut hauptsächlich auf der "Nutzung" bestehender Implementierungen auf. 1. arbeiten Sie sich in den Quellcode eines Open-Source Projektes ein, 2. explorieren Sie das Programmierinterface der LCD Implementierung 3. kombinieren Methoden in einem kleinen Projekt, dass einen Nutzerkonfiguration des Messystems zulässt. > Der Zeitaufwand für die Umsetzung der Aufgabe beträgt etwa 45 Minuten. ## Technische Basis Als eingebettetes System wird ein Mikrocontroller der Firma Atmel verwendet. Der Mikrocontroller ist auf einem [Arduino-Board Uno Rev. 3](https://docs.arduino.cc/hardware/uno-rev3/) verbaut. Grundlage der eigentlichen Aufgabe ist ein einfacher, zweiäugiger Ultraschallsensor des Typs ([SRF04](https://datasheetspdf.com/pdf-file/523589/ETC/SRF04/1)). Dieser ist in der Lage Reichweiten bis etwa 10 m abzudecken. In unserer Anwendung wird er auf kurze Distanzen bis etwa 50cm verwendet. Zusätzlich ist ein 16x2 Display mit dem Mikrocontroller verbunden. | Bautteil | Bezeichnung | Elektrische Verbindung | | ----------------------- | ----------- | ---------------------------------------- | | Ultraschallsensor | SRF04 | 5V, GND, Trigger (Pin 11), Echo (Pin 12) | | LCD module display 2x16 | | 5V, GND, SCL (Pin 19), SDA (Pin 18) | studentConfig: content: '' teacherConfig: content: '' stationConfig: content: '' showInCustom: Room 1 width: full height: tall - url: https://edrys-labs.github.io/module-markdown-it/index.html config: content: >- # Arduino Layout ![ArduinoLayout](https://docs.arduino.cc/static/6ec5e4c2a6c0e9e46389d4f6dc924073/a6d36/Pinout-UNOrev3_latest.png) studentConfig: content: '' teacherConfig: content: '' stationConfig: content: '' showInCustom: Room 1 width: half height: tall - url: https://edrys-labs.github.io/module-markdown-it/index.html config: content: >- # Simulatorübung Aufgabenkomplex A) Der Ultraschallsensor kommuniziert mit dem Mikrocontroller über eine Abfolge von Spannungswechseln. Darin wird der Start einer Messung genauso kommuniziert, wie die Zeitdauer bis zum Empfang des Echos. Entsprechend müssen wir uns zunächst damit beschäftigen die Flankenwechsel in den Signalverläufen zu erkennen und die zugehörigen Zeitfenster zu vermessen. Wir nehmen an, dass am Pin 2 des Mikrocontrollers ein Button befestigt ist. Das nebenstehende Programm wertet dessen Zustand aus und signalisiert dessen Wechsel. > **Praktische Aufgabe 1**: Ergänzen Sie das Programm, um eine Zeitmessung, um zu erfassen wie lange der Button gedrückt wurde. > **Konzeptionelle Aufgabe 1**: Betrachten Sie dabei in der [Dokumentation](https://docs.arduino.cc/language-reference/de/funktionen/time/millis/) die unterschiedlichen Möglichkeiten der Zeitmessung mit `millis()` und `micros()`. Begründen Sie quantitativ warum welche Funktion mit Blick auf den Einsatz mit dem Ultraschallsensor genutzt werden sollte. studentConfig: content: '' teacherConfig: content: '' stationConfig: content: '' showInCustom: Room 2 width: half height: medium - url: https://edrys-labs.github.io/module-editor/index.html config: runCommand: execute language: cpp synchronize: false editorText: | const int buttonPin = 2; bool buttonPressed = false; void setup() { pinMode(buttonPin, INPUT); Serial.begin(9600); } void loop() { int buttonState = digitalRead(buttonPin); if (buttonState==HIGH && buttonPressed == false){ buttonPressed = true; Serial.println("Button pressed"); } if (buttonState==LOW && buttonPressed == true){ buttonPressed = false; Serial.println("Button released"); } delay(10); } studentConfig: '' teacherConfig: '' stationConfig: '' showInCustom: Room 2 width: full height: huge - url: https://edrys-labs.github.io/module-avr8js/index.html config: modules: > execute: execute studentConfig: '' teacherConfig: '' stationConfig: '' showInCustom: Room 2 width: half height: medium - url: https://edrys-labs.github.io/module-markdown-it/index.html config: content: >- # Simulatorübung Aufgabenkomplex B Zunächst soll das Interface für die Konfiguration anhand einer Simulation vorbereitet. Der Quellcode im Simulator stellt Ihnen einen Zugriff auf das LCD bereit. > **Praktische Aufgabe 1**: Erweitern Sie den Code so, dass der Nutzende durch Anweisungen auf dem Display angeleitet wird, eine maximale Messdistanz und ein Maßeinheit für die Distanzmessung anzugeben. > **Konzeptionelle Aufgabe 1**: Überlegen Sie sich inbesondere welche fehlerhaften Eingaben durch den Nutzenden möglich sind und wie diese "abgefangen" werden können . studentConfig: content: '' teacherConfig: content: '' stationConfig: content: '' showInCustom: Room 3 width: full height: medium - url: https://edrys-labs.github.io/module-editor/index.html config: runCommand: execute synchronize: false language: cpp editorText: | #include #define I2C_ADDR 0x27 #define LCD_COLUMNS 20 #define LCD_LINES 4 LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES); void setup() { lcd.init(); lcd.backlight(); lcd.setCursor(3, 0); lcd.print("Simulator"); } void loop() { } studentConfig: '' teacherConfig: '' stationConfig: '' showInCustom: Room 3 width: full height: medium - url: https://edrys-labs.github.io/module-avr8js/index.html config: modules: |

execute: execute studentConfig: '' teacherConfig: '' stationConfig: '' showInCustom: Room 3 width: half height: tall - url: https://edrys-labs.github.io/module-editor/index.html config: runCommand: execute theme: light editorText: | // Kopieren Sie den für Ihren Aufgabenkomplex // relevanten initalen Code aus der untenstehenden // Erläuterung heraus. void setup() { } void loop() { } showInCustom: station width: full height: medium - url: https://edrys-labs.github.io/module-station-stream/index.html stationConfig: video: true audio: false showInCustom: station width: half height: medium - url: https://edrys-labs.github.io/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://edrys-labs.github.io/module-markdown-it/index.html config: content: >- # Remote Labor (Aufgabe A) > **Praktische Aufgabe 2**: Ergänzen Sie das Programm, die Implementierungen für die Funktionen `runUSmeasurement` . Gehen Sie dabei davon aus,, dass der Trigger Pin entsprechend den Zeitvorgaben im nachfolgenden Diagramm gesetzt werden muss. Nutzen Sie für die am Simulator entwickelten Methoden für die Messung des Zeitintervalls als Antwort des Sensors ![](https://www.researchgate.net/profile/Gavin-Anjitha/publication/341480237/figure/fig2/AS:892805480189952@1589872822526/Timing-Diagram-for-HC-SR04-Ultrasonic-Sensor_W640.jpg) *Autor: Gavin Anjitha, "Obstacle avoidance robot using FPGA"* > **Praktische Aufgabe 3**: Fügen Sie die Implementierung der Funktion `duration2dist_cm` hinzu. Welche Annahmen treffen Sie dabei? **Initialer Code für Aufgabenkomplex A** ``` cpp InitialCode.cpp const int trigPin = 12; const int echoPin = 11; // Führt die US Messung aus, Rückgabewert ist die Zeitdauer bis // zum Empfang des Echos long runUSmeasurement(int trig, int echo) { return 1000; } float duration2dist_cm(long duration) { return 10000; } void setup() { Serial.begin(9600); Serial.print("Los geht's"); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { long duration = runUSmeasurement(trigPin, echoPin); Serial.println(duration); // float distance = duration2dist_cm(duration); // Serial.print(distance); // Serial.println("cm"); delay(1000); } ``` studentConfig: content: '' teacherConfig: content: '' stationConfig: content: '' showInCustom: station width: half height: huge - url: https://edrys-labs.github.io/module-markdown-it/index.html config: content: >- # Remote Labor (Aufgabe B) > **Praktische Aufgabe 2**: Nutzen Sie die Implementierung der [NewPing](https://bitbucket.org/teckel12/arduino-new-ping/src/master/) Bibliothek für die objektorientierte Ansteuerung des SRF04 Sensors. Arbeiten Sie sich dazu in die Dokumentation ein und identifizieren Sie die Methoden, die Sie für die Bereitstellung der Distanzmessungen in unterschiedlichen Einheiten benötigen. > **Praktische Aufgabe 3**: Fügen Sie Ihr Konfigurationsinterface ein, so dass Sie zwischen verschiedenen Reichweiten und Ausgabeformaten unterscheiden können. Warum ist die Reichweite ein wichtiger Parameter? **Initialer Code für Aufgabenkomplex B** ``` cpp InitialCode.cpp /* * Posted on https://randomnerdtutorials.com * created by http://playground.arduino.cc/Code/NewPing */ #include #define TRIGGER_PIN 11 #define ECHO_PIN 12 #define MAX_DISTANCE 200 // NewPing setup of pins and maximum distance NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); void setup() { Serial.begin(9600); } void loop() { delay(50); unsigned int distance = sonar.ping_cm(); Serial.print(distance); Serial.println("cm"); } ``` studentConfig: content: '' teacherConfig: content: '' stationConfig: content: '' showInCustom: station width: half height: huge - url: https://edrys-labs.github.io/module-code-logger/ config: '' studentConfig: '' teacherConfig: '' stationConfig: '' showInCustom: station, station-only width: full height: tall - url: https://edrys-labs.github.io/module-station-light-control/index.html config: '' studentConfig: '' teacherConfig: '' stationConfig: '' showInCustom: station, station-only width: third height: short