-
Notifications
You must be signed in to change notification settings - Fork 0
/
lab.yaml
306 lines (224 loc) · 9.28 KB
/
lab.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
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
[email protected] 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