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

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

*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