Staubsaugroboter
Die Schรผler:innen haben vorher mit LEGO Mindstorms EV3 Roboter gebaut und programmiert. Nun sollen sie sich mit einem Staubsaugroboter beschรคftigen. In kleinen Projekten wurden die verschiedenen Sensoren ausprobiert.
Material
Typst wird geladen...
โถBinรคrdateien
#import "@preview/polylux:0.4.0": slide, enable-handout-mode
// โโ Farbpalette โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#let C-BLUE = rgb("#0d47a1")
#let C-MID = rgb("#1565c0")
#let C-LIGHT = rgb("#e3f2fd")
#let C-AMBER = rgb("#e65100")
#let C-AMBER-L = rgb("#fff3e0")
#let C-GREEN = rgb("#2e7d32")
#let C-GREEN-L = rgb("#e8f5e9")
#let C-RED-L = rgb("#fce4ec")
#let C-YELLOW = rgb("#fff8e1")
#let C-WHITE = white
#let C-DARK = rgb("#212121")
#let C-GREY = rgb("#757575")
// โโ Globale Einstellungen โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#set page(paper: "presentation-16-9", fill: C-WHITE, margin: 0pt)
#set text(font: "Fira Sans", size: 19pt, fill: C-DARK)
#set list(indent: 0.5em, spacing: 0.7em)
// โโ Hilfs-Komponenten โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#let make-header(title) = block(
fill: C-BLUE, width: 100%,
inset: (x: 1.4em, y: 0.55em),
)[
#text(fill: C-WHITE, size: 25pt, weight: "bold")[#title]
]
#let make-footer = block(
fill: C-LIGHT, width: 100%,
inset: (x: 1.4em, y: 0.4em),
)[
#text(size: 13pt, fill: C-GREY)[Roboter im Alltag ยท 9. Klasse]
]
#let body(content) = pad(x: 1.4em, top: 0.9em, bottom: 0.2em)[#content]
#let content-slide(title, content) = slide[
#set page(footer: make-footer)
#make-header(title)
#body(content)
]
// Impuls-Folie: Schรผler:innen denken zuerst
#let think-slide(question, task: none, time: none) = slide[
#set page(fill: C-AMBER)
#align(center + horizon)[
#text(size: 30pt, fill: C-WHITE)[๐ค]
#v(0.4em)
#block(width: 80%)[
#text(size: 28pt, weight: "bold", fill: C-WHITE)[#question]
]
#if task != none [
#v(0.6em)
#block(
fill: white.transparentize(85%), inset: (x: 1.2em, y: 0.6em), radius: 8pt, width: 70%,
)[
#text(size: 19pt, fill: C-WHITE)[#task]
]
]
#if time != none [
#v(0.5em)
#text(size: 16pt, fill: white.transparentize(20%))[โฑ #time]
]
]
]
#let infobox(color: C-LIGHT, title: none, content) = block(
fill: color, width: 100%,
inset: 0.8em, radius: 6pt,
stroke: (left: 4pt + C-BLUE),
)[
#if title != none [#text(weight: "bold")[#title \ ]]
#content
]
#let step-box(n, content) = grid(
columns: (auto, 1fr), gutter: 0.6em,
block(fill: C-BLUE, inset: (x: 0.6em, y: 0.4em), radius: 6pt)[
#text(fill: white, weight: "bold")[#n]
],
align(horizon)[#content],
)
#let sensor-card(emoji, name, use) = block(
fill: C-LIGHT, inset: 0.7em, radius: 8pt, width: 100%,
)[
#text(size: 24pt)[#emoji] #h(0.3em)
#text(weight: "bold", fill: C-BLUE)[#name] \
#text(size: 16pt, fill: C-GREY)[#use]
]
#let section-slide(part, title, subtitle, fill: C-MID, text-muted: rgb("#90caf9"), text-sub: rgb("#bbdefb")) = slide[
#set page(fill: fill)
#align(center + horizon)[
#text(size: 18pt, fill: text-muted)[#part]
#v(0.2em)
#text(size: 38pt, weight: "bold", fill: C-WHITE)[#title]
#v(0.2em)
#text(size: 20pt, fill: text-sub)[#subtitle]
]
]
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// TITELFOLIE
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#slide[
#set page(fill: C-BLUE)
#align(center + horizon)[
#text(size: 16pt, fill: rgb("#90caf9"))[๐ค Roboter im Alltag]
#v(0.5em)
#text(size: 42pt, weight: "bold", fill: C-WHITE)[Staubsaugroboter]
#v(0.3em)
#text(size: 22pt, fill: rgb("#bbdefb"))[
Sensoren ยท Navigation ยท Eigener EV3-Roboter
]
#v(0.8em)
#block(fill: rgb("#1565c0"), inset: (x: 1.2em, y: 0.5em), radius: 6pt)[
#text(size: 15pt, fill: rgb("#90caf9"))[9. Klasse ยท Informatik]
]
]
]
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// AGENDA
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#content-slide("Heutiger Ablauf")[
#v(0.4em)
#grid(columns: 2, gutter: 0.8em,
step-box("1", [*Staubsaugroboter* โ Was steckt dahinter?]),
step-box("2", [*EV3-Sensoren* โ Was brauchen wir?]),
step-box("3", [*Navigation* โ Wie fรคhrt der Roboter?]),
step-box("4", [*Ideenfindung* โ Euer eigener Roboter]),
)
]
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// TEIL 1 โ STAUBSAUGROBOTER
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#section-slide("Teil 1", "๐ Staubsaugroboter", "Was steckt dahinter?")
// โโ Impuls 1a โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#think-slide(
"Kennt ihr einen Staubsaugroboter โ aus dem Alltag, aus der Werbung oder aus einem Video?",
task: [Tauscht euch kurz mit eurer Nachbarperson aus:\
Was weiร ihr schon darรผber?],
time: "2 Minuten",
)
// โโ Auflรถsung 1a โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#content-slide("Was ist ein Staubsaugroboter?")[
#grid(columns: (1fr, 1fr), gutter: 1em,
[
- Autonomes Haushaltsgerรคt
- Saugt Bรถden *ohne menschliche Steuerung*
- Erkennt Hindernisse & Stufen selbststรคndig
- Kehrt zur Ladestation zurรผck
- Bekanntestes Modell: *iRobot Roomba* (seit 2002)
],
[
#infobox(title: "Typische Merkmale")[
- Runde oder D-fรถrmige Form
- Bรผrsten unter dem Gerรคt
- Schmutzbehรคlter & Filter
- WLAN / App-Steuerung
]
#v(0.5em)
#infobox(color: C-YELLOW, title: "๐ก Wusstest du?")[
#text(size: 16pt)[
Roomba (2002) war der erste\
kommerzielle Staubsaugroboter โ\
heute: Milliarden-Markt, 50+ Hersteller.
]
]
]
)
]
// โโ Impuls 1b โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#think-slide(
"Welche Probleme muss ein Staubsaugroboter lรถsen, um einen ganzen Raum zu putzen?",
task: [Sammelt gemeinsam an der Tafel:\
Was muss der Roboter *kรถnnen*?],
time: "3 Minuten",
)
// โโ Auflรถsung 1b โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#content-slide("Grundprobleme โ und wie sie gelรถst werden")[
#grid(columns: (1fr, 1fr), gutter: 1em,
[
*Was muss der Roboter lรถsen?*
#v(0.4em)
#step-box("1", [Hindernisse erkennen & ausweichen])
#v(0.3em)
#step-box("2", [Absturzkanten (Stufen) erkennen])
#v(0.3em)
#step-box("3", [Den gesamten Bereich abfahren])
#v(0.3em)
#step-box("4", [Zur Ladestation zurรผckfinden])
],
[
*Verbaute Technik (Roomba):*
- Infrarot-Sensoren (Kanten)
- Stoรsensor / Bumper vorne
- Optischer Bodensensor
- Kamera / LiDAR (neuere Modelle)
- Encoder an den Rรคdern
#v(0.3em)
#infobox(color: C-GREEN-L, title: "๐ง Neuere Modelle")[
#text(size: 16pt)[
Erstellen automatisch eine Karte\
der Wohnung (SLAM-Verfahren)
]
]
]
)
]
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// TEIL 2 โ EV3 SENSOREN
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#section-slide("Teil 2", "๐ง EV3-Sensoren", "Was brauchen wir fรผr den Nachbau?")
// โโ Impuls 2a โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#think-slide(
"Stellt euch vor, ihr seid blind in einem unbekannten Zimmer. Wie orientiert ihr euch?",
task: [Was wรผrdet ihr benutzen โ und wie รผbertragt ihr\
das auf einen Roboter?],
time: "2 Minuten",
)
// โโ Impuls pro Sensor โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#think-slide(
"Ein Sensor misst Schallwellen, die er selbst aussendet. Was kรถnnte er damit erkennen?",
task: [รberlegt: Wofรผr wรคre das beim Staubsaugroboter nรผtzlich?],
time: "1 Minute",
)
#content-slide("Sensor 1 โ Ultraschallsensor ๐ก")[
#grid(columns: (1fr, 1fr), gutter: 1em,
[
*Wie funktioniert er?*
- Sendet Ultraschallwellen aus
- Misst Zeit bis Echo zurรผckkommt
- Berechnet *Distanz* (3โ250 cm)
#v(0.4em)
*Beim Staubsaugroboter:*
- Hindernisse *vor* dem Roboter erkennen
- Rechtzeitig bremsen & ausweichen
- Wรคnde als Orientierungspunkte nutzen
],
[
#infobox(color: C-GREEN-L, title: "โ
Wichtig fรผr uns")[
*Unverzichtbar* โ ohne ihn\
fรคhrt der Roboter gegen alles.
]
#v(0.5em)
#infobox(title: "โ ๏ธ Einschrรคnkungen")[
- Erkennt weiche/schrรคge Flรคchen\
schlechter
- Nur in Blickrichtung
- Keine 360ยฐ-Erkennung
]
]
)
]
#think-slide(
"Wie kรถnnte ein Roboter merken, dass er gleich eine Treppe hinunterfรคllt?",
task: [Welcher Sensor kรถnnte das lรถsen โ und wie mรผsste er montiert sein?],
time: "1 Minute",
)
#content-slide("Sensor 2 โ Farbsensor ๐")[
#grid(columns: (1fr, 1fr), gutter: 1em,
[
*Wie funktioniert er?*
- Erkennt Farben & Lichtintensitรคt
- Auch als *Helligkeitssensor* nutzbar
#v(0.4em)
*Beim Staubsaugroboter:*
- *Kanten & Stufen* erkennen\
(Helligkeit รคndert sich โ Absturzkante)
- Teppich vs. Hartboden unterscheiden
- Farbmarkierungen als Grenze nutzen
],
[
#infobox(color: C-GREEN-L, title: "โ
Wichtig fรผr uns")[
Verhindert, dass der Roboter\
*Treppen hinunterfรคllt* โ\
zeigt auf den Boden gerichtet.
]
#v(0.5em)
#infobox(color: C-YELLOW, title: "๐ก Tipp")[
Schwarzes Klebeband als\
โvirtuelle Wand" โ Roboter\
bleibt im markierten Bereich.
]
]
)
]
#think-slide(
"Was passiert, wenn der Ultraschall ein Hindernis zu spรคt erkennt โ z.B. ein dรผnnes Tischbein?",
task: [Welchen zweiten Sensor kรถnnte man als Backup nutzen?],
time: "1 Minute",
)
#content-slide("Sensor 3 โ Berรผhrungssensor ๐ค")[
#grid(columns: (1fr, 1fr), gutter: 1em,
[
*Wie funktioniert er?*
- Einfacher *Druckschalter*
- Meldet: gedrรผckt / losgelassen
- Sehr zuverlรคssig & gรผnstig
#v(0.4em)
*Beim Staubsaugroboter:*
- Als *Frontstoรstange* vorne anbringen
- Erkennt Kollisionen, die der\
Ultraschall nicht sieht
],
[
#infobox(color: C-GREEN-L, title: "โ
Sinnvoll")[
Backup-Sicherheit fรผr Objekte,\
die fรผr Ultraschall unsichtbar\
sind (z. B. Tischbeine).
]
#v(0.5em)
#infobox(title: "๐ Einbau-Tipp")[
Vorne links & rechts montiert\
= breitere Kollisionserkennung
]
]
)
]
#think-slide(
"Wie kรถnnte ein Roboter eine genaue 90ยฐ-Kurve fahren โ ohne nachzumessen?",
task: [Was braucht er dafรผr? Welche Information fehlt ihm ohne diesen Sensor?],
time: "1 Minute",
)
#content-slide("Sensor 4 โ Gyrosensor ๐")[
#grid(columns: (1fr, 1fr), gutter: 1em,
[
*Wie funktioniert er?*
- Misst *Drehrate* (ยฐ/Sekunde)
- Berechnet den genauen *Drehwinkel*
#v(0.4em)
*Beim Staubsaugroboter:*
- Prรคzise 90ยฐ-Kurven drehen
- Gerade Linien fahren
- Navigationsmuster genau einhalten
],
[
#infobox(color: C-GREEN-L, title: "โ
Fรผr Prรคzision")[
Ohne Gyro dreht der Roboter\
nur *ungefรคhr* โ mit Gyro\
werden Muster viel sauberer.
]
#v(0.5em)
#infobox(color: C-RED-L, title: "โ ๏ธ Drift")[
#text(size: 16pt)[
Der Gyro kann รผber Zeit\
leicht ungenau werden\
(โ Kalibrierung nรถtig)
]
]
]
)
]
// โโ Impuls: Sensor-Auswahl โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#think-slide(
"Ihr habt nur 2 Sensor-Ports frei. Welche zwei Sensoren wรคhlt ihr โ und warum?",
task: [Einigt euch in der Gruppe auf eine Antwort\
und begrรผndet eure Wahl.],
time: "3 Minuten",
)
#content-slide("Sensoren im รberblick")[
#v(0.3em)
#grid(columns: (1fr, 1fr), gutter: 0.8em,
sensor-card("๐ก", "Ultraschallsensor", "Hindernisse erkennen โ MUSS"),
sensor-card("๐", "Farbsensor", "Kanten & Stufen โ MUSS"),
sensor-card("๐ค", "Berรผhrungssensor", "Kollisionssicherheit โ EMPFOHLEN"),
sensor-card("๐", "Gyrosensor", "Prรคzise Navigation โ EMPFOHLEN"),
)
#v(0.5em)
#infobox(color: C-GREEN-L)[
*Fazit aus der Diskussion:* Ultraschall & Farbsensor sind das Minimum โ\
Berรผhrungssensor & Gyro machen den Roboter deutlich robuster.
]
]
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// TEIL 3 โ NAVIGATION
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#section-slide("Teil 3", "๐บ๏ธ Navigation", "Wie fรคhrt der Roboter einen Bereich ab?")
// โโ Impuls 3a: Raumskizze โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#think-slide(
"Wie wรผrdet ihr diesen Raum putzen, wenn ihr der Roboter wรคrt?",
task: [Zeichnet auf dem Papier eine Linie, die zeigt,\
welchen Weg euer Roboter fahren wรผrde.\
Ihr habt 3 Minuten โ dann vergleichen wir!],
time: "3 Minuten",
)
// โโ Strategien: รberblick โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#content-slide("Navigationsstrategien โ was haben echte Roboter?")[
#grid(columns: (1fr, 1fr), gutter: 0.8em,
[
#infobox(title: "๐ฒ Zufallsbewegung")[
Fahre geradeaus, erkenne\
Hindernis โ drehe zufรคllig,\
fahre weiter.
]
#v(0.4em)
#infobox(title: "๐ Spiralmuster")[
Start in der Mitte, fahre\
spiralfรถrmig nach auรen.
]
],
[
#infobox(title: "โ๏ธ Zeilenweise (Boustrophedon)")[
Fahre Reihen ab wie beim\
Rasenmรคhen โ Zeile fรผr Zeile.
]
#v(0.4em)
#infobox(title: "๐งฑ Wandfolge")[
Folge einer Wand, dann\
systematisch einwรคrts.
]
]
)
#v(0.3em)
#infobox(color: C-GREEN-L)[
Echte Roboter *kombinieren* oft mehrere Strategien!
]
]
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// TEIL 4 โ IDEENFINDUNG
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#section-slide(
"Teil 4", "๐ก Ideenfindung",
"Euer eigener EV3-Staubsaugroboter",
fill: C-GREEN,
text-muted: rgb("#a5d6a7"),
text-sub: rgb("#c8e6c9"),
)
#content-slide("Eure Aufgabe")[
#grid(columns: (1fr, 1fr), gutter: 1em,
[
Entwickelt in *Gruppen (2โ3 Personen)*\
ein Konzept fรผr euren EV3-Roboter:
#v(0.5em)
#step-box("1", [*Bau*: Form & Sensor-Montage skizzieren])
#v(0.4em)
#step-box("2", [*Sensoren*: Auswahl begrรผnden])
#v(0.4em)
#step-box("3", [*Strategie*: Navigationsmuster wรคhlen])
#v(0.4em)
#step-box("4", [*Extras*: Was macht euren Roboter besonders?])
],
[
#infobox(title: "๐ Konzeptskizze (Ergebnis)")[
- Zeichnung / Skizze des Aufbaus
- Sensoren & Begrรผndung
- Beschreibung der Strategie
- Pseudocode / Programmschritte
]
#v(0.4em)
#infobox(color: C-YELLOW, title: "โฑ๏ธ Zeit")[
~25 Minuten Gruppenarbeit,\
dann kurze Vorstellung\
der Ideen im Plenum
]
]
)
]
#content-slide("Leitfragen fรผr eure Planung")[
#grid(columns: (1fr, 1fr), gutter: 0.8em,
[
*๐ง Zum Aufbau:*
- Welche Form hat euer Roboter?
- Wie befestigt ihr die Sensoren?
- Wie breit ist euer Roboter?\
(โ beeinflusst Navigationsmuster!)
],
[
*๐ป Zur Programmierung:*
- Welche Strategie wรคhlt ihr?
- Wie reagiert der Roboter\
auf ein Hindernis?
- Wie genau dreht er sich?
]
)
#v(0.6em)
#infobox(color: C-GREEN-L, title: "๐ Bonusfragen")[
- Wie erkennt der Roboter, dass er fertig ist?
- Wie findet er zur Ladestation (Startpunkt) zurรผck?
- Wie verhรคlt er sich auf einem Teppich (Farbsensor!)?
]
]
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// ABSCHLUSSFOLIE
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#slide[
#set page(fill: C-BLUE)
#align(center + horizon)[
#text(size: 42pt, fill: C-WHITE)[๐ค]
#v(0.3em)
#text(size: 34pt, weight: "bold", fill: C-WHITE)[Viel Spaร beim Tรผfteln!]
#v(0.5em)
#text(size: 20pt, fill: rgb("#bbdefb"))[
Auch echte Ingenieur:innen scheitern oft beim ersten Versuch โ\
das gehรถrt dazu.
]
#v(1em)
#block(fill: rgb("#1565c0"), inset: (x: 1.5em, y: 0.7em), radius: 8pt)[
#text(fill: rgb("#90caf9"), size: 16pt)[
*Heute:* Ideenfindung & Konzept ยท *Nรคchste Stunde:* Bau & erste Tests
]
]
]
]
// โโ Hilfs-Komponenten โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#let make-header(title) = block(
fill: C-BLUE, width: 100%,
inset: (x: 1.4em, y: 0.55em),
)[
#text(fill: C-WHITE, size: 25pt, weight: "bold")[#title]
]
#let make-footer = block(
fill: C-LIGHT, width: 100%,
inset: (x: 1.4em, y: 0.4em),
)[
#text(size: 13pt, fill: C-GREY)[
Roboter im Alltag ยท 9. Klasse
]
]
#let body(content) = pad(x: 1.4em, top: 0.9em, bottom: 0.2em)[#content]
#let content-slide(title, content) = slide[
#set page(footer: make-footer)
#make-header(title)
#body(content)
]
#let infobox(color: C-LIGHT, title: none, content) = block(
fill: color, width: 100%,
inset: 0.8em, radius: 6pt,
stroke: (left: 4pt + C-BLUE),
)[
#if title != none [#text(weight: "bold")[#title \ ]]
#content
]
#let sensor-card(emoji, name, use) = block(
fill: C-LIGHT, inset: 0.7em, radius: 8pt,
width: 100%,
)[
#text(size: 26pt)[#emoji] #h(0.3em)
#text(weight: "bold", fill: C-BLUE)[#name] \
#text(size: 17pt, fill: C-GREY)[#use]
]
#let step-box(n, content) = grid(
columns: (auto, 1fr), gutter: 0.6em,
block(
fill: C-BLUE, inset: (x: 0.6em, y: 0.4em), radius: 6pt,
)[#text(fill: white, weight: "bold")[#n]],
align(horizon)[#content],
)
#let section-slide(part, title, subtitle, fill: C-MID, text-muted: rgb("#90caf9"), text-sub: rgb("#bbdefb")) = slide[
#set page(fill: fill)
#align(center + horizon)[
#text(size: 18pt, fill: text-muted)[#part]
#v(0.2em)
#text(size: 38pt, weight: "bold", fill: C-WHITE)[#title]
#v(0.2em)
#text(size: 20pt, fill: text-sub)[#subtitle]
]
]
Typst wird geladen...
โถBinรคrdateien
#import "@preview/cetz:0.4.2": canvas, draw
#let C-ACC = rgb("#6a1b9a") // lila
#let C-LITE = rgb("#f3e5f5")
#let C-CODE = rgb("#f5f5f5")
#let C-DARK = rgb("#212121")
#let C-GREY = rgb("#757575")
#let C-GRN = rgb("#1b5e20")
#let C-RED = rgb("#b71c1c")
#set page(paper: "a4", margin: (top: 1.4cm, bottom: 1.5cm, x: 1.8cm))
#set text(font: "Fira Sans", size: 10.5pt, fill: C-DARK)
#set par(spacing: 0.55em)
#let ab-header(icon, title) = {
block(fill: C-ACC, width: 100%, inset: (x: 1em, y: 0.55em), radius: (top: 6pt))[
#grid(
columns: (1fr, auto),
text(size: 17pt, weight: "bold", fill: white)[#title], text(size: 22pt)[#icon],
)
]
block(fill: C-LITE, width: 100%, inset: (x: 1em, y: 0.45em), radius: (bottom: 6pt), below: 0.9em)[
#grid(
columns: (2fr, 1fr, 1fr),
gutter: 1.5em,
[Name: #box(width: 1fr)[#line(length: 100%)]],
[Klasse: #box(width: 1fr)[#line(length: 100%)]],
[Datum: #box(width: 1fr)[#line(length: 100%)]],
)
]
}
#let section(title) = {
v(0.5em)
block(fill: C-ACC.lighten(88%), width: 100%, inset: (x: 0.7em, y: 0.38em), radius: 4pt, stroke: (left: 3pt + C-ACC))[
#text(weight: "bold", fill: C-ACC)[#title]
]
v(0.25em)
}
#let step(n, content) = {
v(0.25em)
grid(
columns: (auto, 1fr),
gutter: 0.5em,
block(fill: C-ACC, inset: (x: 0.45em, y: 0.25em), radius: 4pt)[
#text(fill: white, weight: "bold", size: 9pt)[#n]
],
align(horizon)[#content],
)
}
#let code(content) = block(
fill: C-CODE,
width: 100%,
inset: (x: 0.9em, y: 0.7em),
radius: 4pt,
stroke: 0.5pt + C-GREY,
)[
#set text(font: "DejaVu Sans Mono", size: 8.5pt)
#content
]
#let blank(w: 2cm) = box(
width: w,
height: 1em,
stroke: (bottom: 0.8pt + C-DARK),
)
#let aufgabe(content) = block(
fill: C-LITE,
width: 100%,
inset: 0.85em,
radius: 6pt,
stroke: 2pt + C-ACC,
)[#content]
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#ab-header("๐", "Strategie 3: Spiralfรถrmige Abdeckung")
// โโ Erklรคrung + Grafik โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#grid(
columns: (1fr, 5.5cm),
gutter: 1em,
align: top,
[
#section("Was ist diese Strategie?")
Der Roboter fรคhrt eine *nach innen werdende Spirale* und deckt so den
Raum von auรen nach innen ab. Die Spirale kann *rechteckig* oder
*kreisfรถrmig* sein.
Bei der *rechteckigen Spirale* fรคhrt er je eine gerade Seite,
dreht 90ยฐ, und die nรคchste Seite ist etwas kรผrzer.
Dieser Ablauf wiederholt sich, bis die Strecke zu kurz wird.
#v(0.3em)
*Schwierigkeit:* โญโญ (mittel) #h(1em)
*Sensoren:* Motorencoder (Odometrie)
],
[
#text(weight: "bold")[Bewegungsmuster]
#v(0.3em)
#canvas(length: 0.75cm, {
let C = rgb("#6a1b9a")
draw.rect((0, 0), (7, 5.5), stroke: 2pt)
draw.content((3.5, -0.4), text(size: 7pt, fill: rgb("#757575"))[Raum])
let runden = (
((0.4, 5.0), (6.6, 5.0)),
((6.6, 5.0), (6.6, 0.4)),
((6.6, 0.4), (0.4, 0.4)),
((0.4, 0.4), (0.4, 4.0)),
((0.4, 4.0), (5.7, 4.0)),
((5.7, 4.0), (5.7, 1.2)),
((5.7, 1.2), (1.2, 1.2)),
((1.2, 1.2), (1.2, 3.2)),
((1.2, 3.2), (4.8, 3.2)),
((4.8, 3.2), (4.8, 2.0)),
((4.8, 2.0), (2.0, 2.0)),
((2.0, 2.0), (2.0, 2.8)),
((2.0, 2.8), (3.8, 2.8)),
((3.8, 2.8), (3.8, 2.4)),
((3.8, 2.4), (2.8, 2.4)),
)
draw.circle(runden.first().first(), radius: 0.22, fill: rgb("#2e7d32"), stroke: none)
draw.content((0.4, 4.6), text(size: 7pt, fill: rgb("#2e7d32"))[Start])
for seg in runden {
draw.line(seg.first(), seg.last(), stroke: (paint: C, thickness: 1.2pt), mark: (end: ">"))
}
draw.circle((3.0, 2.6), radius: 0.18, fill: C, stroke: none)
draw.content((3.0, 2.1), text(size: 6.5pt, fill: C)[Ende])
})
],
)
// โโ Algorithmus โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#section("Algorithmus โ Schritt fรผr Schritt")
#step("1", [Setze *Startlรคnge* (z.B. Raumbreite) und *Verkรผrzungsschritt* (= Roboterbreite)])
#step("2", [*Fahre* die aktuelle Streckenlรคnge geradeaus])
#step("3", [*Drehe* 90ยฐ (immer in dieselbe Richtung)])
#step("4", [*Fahre* dieselbe Streckenlรคnge nochmals geradeaus, *drehe* wieder 90ยฐ])
#step("5", [*Verkรผrze* die Streckenlรคnge um den Verkรผrzungsschritt])
#step("6", [Wiederhole ab Schritt 2, bis Streckenlรคnge โค 0])
// โโ Vor- und Nachteile โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#section("Vor- und Nachteile โ ergรคnze nach der Klassendiskussion")
#table(
columns: (1fr, 1fr),
stroke: 0.5pt + C-GREY,
inset: (x: 0.7em, y: 0.5em),
fill: (col, row) => {
if row == 0 { if col == 0 { C-GRN.lighten(80%) } else { C-RED.lighten(85%) } } else { white }
},
[#text(weight: "bold", fill: C-GRN)[โ
Vorteile]], [#text(weight: "bold", fill: C-RED)[โ Nachteile]],
[Deckt den Raum vollstรคndig ab], [Setzt rechteckigen Raum voraus],
[Kein Sensor nรถtig (nur Encoder)], [#blank(w: 5cm)],
[#blank(w: 5cm)], [#blank(w: 5cm)],
)
// โโ EV3-Umsetzung โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#section("EV3-Umsetzung")
*Sensoren:*
- 2ร Motor (links/rechts)
- (optional) Ultraschall
Typst wird geladen...
โถBinรคrdateien
#import "@preview/cetz:0.4.2": canvas, draw
#let C-ACC = rgb("#2e7d32") // dunkelgrรผn
#let C-LITE = rgb("#e8f5e9")
#let C-CODE = rgb("#f5f5f5")
#let C-DARK = rgb("#212121")
#let C-GREY = rgb("#757575")
#let C-GRN = rgb("#1b5e20")
#let C-RED = rgb("#b71c1c")
#set page(paper: "a4", margin: (top: 1.4cm, bottom: 1.5cm, x: 1.8cm))
#set text(font: "Fira Sans", size: 10.5pt, fill: C-DARK)
#set par(spacing: 0.55em)
#let ab-header(icon, title) = {
block(fill: C-ACC, width: 100%, inset: (x: 1em, y: 0.55em), radius: (top: 6pt))[
#grid(
columns: (1fr, auto),
text(size: 17pt, weight: "bold", fill: white)[#title], text(size: 22pt)[#icon],
)
]
block(fill: C-LITE, width: 100%, inset: (x: 1em, y: 0.45em), radius: (bottom: 6pt), below: 0.9em)[
#grid(
columns: (2fr, 1fr, 1fr),
gutter: 1.5em,
[Name: #box(width: 1fr)[#line(length: 100%)]],
[Klasse: #box(width: 1fr)[#line(length: 100%)]],
[Datum: #box(width: 1fr)[#line(length: 100%)]],
)
]
}
#let section(title) = {
v(0.5em)
block(fill: C-ACC.lighten(88%), width: 100%, inset: (x: 0.7em, y: 0.38em), radius: 4pt, stroke: (left: 3pt + C-ACC))[
#text(weight: "bold", fill: C-ACC)[#title]
]
v(0.25em)
}
#let step(n, content) = {
v(0.25em)
grid(
columns: (auto, 1fr),
gutter: 0.5em,
block(fill: C-ACC, inset: (x: 0.45em, y: 0.25em), radius: 4pt)[
#text(fill: white, weight: "bold", size: 9pt)[#n]
],
align(horizon)[#content],
)
}
#let code(content) = block(
fill: C-CODE,
width: 100%,
inset: (x: 0.9em, y: 0.7em),
radius: 4pt,
stroke: 0.5pt + C-GREY,
)[
#set text(font: "DejaVu Sans Mono", size: 8.5pt)
#content
]
#let blank(w: 2cm) = box(
width: w,
height: 1em,
stroke: (bottom: 0.8pt + C-DARK),
)
#let aufgabe(content) = block(
fill: C-LITE,
width: 100%,
inset: 0.85em,
radius: 6pt,
stroke: 2pt + C-ACC,
)[#content]
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#ab-header("๐งฑ", "Strategie 4: Wandfolge (Wall-Following)")
// โโ Erklรคrung + Grafik โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#grid(
columns: (1fr, 5.5cm),
gutter: 1em,
align: top,
[
#section("Was ist diese Strategie?")
Der Roboter *folgt der Wand* mit einem konstanten Abstand.
Er hรคlt sich dabei immer an die *rechte* (oder linke) Wand.
Durch konzentrische Rechtecke arbeitet er sich
von auรen nach innen vor โ รคhnlich wie bei der Spirale,
aber gesteuert durch den *Abstandssensor* statt durch Encoder.
Dieses Prinzip wird auch *Right-Hand-Rule* genannt und
ist aus der Labyrinthnavigation bekannt.
#v(0.3em)
*Schwierigkeit:* โญโญโญ (anspruchsvoll)
*Sensoren:* Ultraschall (seitlich + vorne)
],
[
#text(weight: "bold")[Bewegungsmuster]
#v(0.3em)
#canvas(length: 0.75cm, {
let C = rgb("#2e7d32")
let CD = rgb("#a5d6a7")
draw.rect((0, 0), (7, 5.5), stroke: 2pt)
draw.content((3.5, -0.4), text(size: 7pt, fill: rgb("#757575"))[Raum])
let rects = (
(0.4, 0.4, 6.6, 5.0),
(1.2, 1.2, 5.8, 4.2),
(2.0, 2.0, 5.0, 3.4),
(2.8, 2.8, 4.2, 2.8),
)
let colors = (C, C.lighten(25%), C.lighten(45%), C.lighten(60%))
for i in range(rects.len()) {
let r = rects.at(i)
let col = colors.at(i)
let pts = (
(r.at(0), r.at(3)),
(r.at(2), r.at(3)),
(r.at(2), r.at(1)),
(r.at(0), r.at(1)),
)
for j in range(pts.len()) {
let from = pts.at(j)
let to = pts.at(calc.rem(j + 1, pts.len()))
draw.line(from, to, stroke: (paint: col, thickness: 1.3pt), mark: (end: ">"))
}
}
draw.circle((0.4, 5.0), radius: 0.22, fill: rgb("#e65100"), stroke: none)
draw.content((0.8, 4.65), text(size: 7pt, fill: rgb("#e65100"))[Start])
draw.line((0.4, 0.4), (1.2, 1.2), stroke: (paint: CD, thickness: 0.8pt, dash: "dashed"))
draw.line((1.2, 1.2), (2.0, 2.0), stroke: (paint: CD, thickness: 0.8pt, dash: "dashed"))
draw.line((2.0, 2.0), (2.8, 2.8), stroke: (paint: CD, thickness: 0.8pt, dash: "dashed"))
draw.circle((3.5, 2.8), radius: 0.18, fill: C, stroke: none)
})
],
)
// โโ Algorithmus โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#section("Algorithmus โ Schritt fรผr Schritt")
#step("1", [*Fahre* an die Wand heran, stoppe bei Soll-Abstand (z.B. 10 cm)])
#step("2", [*Drehe* 90ยฐ (die Wand ist jetzt rechts vom Roboter)])
#step("3", [*Fahre* geradeaus und *halte den Abstand* zur rechten Wand konstant])
#step("4", [*Ecke erkannt* (vorderer Sensor < Schwellwert): Drehe 90ยฐ nach links])
#step("5", [*Innen-Kurve* (keine Wand mehr rechts): Drehe 90ยฐ nach rechts, fahre Versatz])
#step("6", [Wiederhole ab Schritt 3, bis der Raum vollstรคndig abgefahren ist])
// โโ Vor- und Nachteile โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#section("Vor- und Nachteile โ ergรคnze nach der Klassendiskussion")
#table(
columns: (1fr, 1fr),
stroke: 0.5pt + C-GREY,
inset: (x: 0.7em, y: 0.5em),
fill: (col, row) => {
if row == 0 { if col == 0 { C-GRN.lighten(80%) } else { C-RED.lighten(85%) } } else { white }
},
[#text(weight: "bold", fill: C-GRN)[โ
Vorteile]], [#text(weight: "bold", fill: C-RED)[โ Nachteile]],
[Funktioniert auch in unbekannten Rรคumen], [Braucht zwei Ultraschallsensoren],
[Reagiert flexibel auf Hindernisse], [#blank(w: 5cm)],
[#blank(w: 5cm)], [#blank(w: 5cm)],
)
// โโ EV3-Umsetzung โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#section("EV3-Umsetzung")
*Sensoren:*
- ๐ก Ultraschall vorne
- ๐ก Ultraschall seitlich (rechts)
- 2ร Motor (links/rechts)
Typst wird geladen...
โถBinรคrdateien
#import "@preview/cetz:0.4.2": canvas, draw
#let C-ACC = rgb("#0d47a1") // tiefes Blau
#let C-LITE = rgb("#e3f2fd")
#let C-CODE = rgb("#f5f5f5")
#let C-DARK = rgb("#212121")
#let C-GREY = rgb("#757575")
#let C-GRN = rgb("#1b5e20")
#let C-RED = rgb("#b71c1c")
#set page(paper: "a4", margin: (top: 1.4cm, bottom: 1.5cm, x: 1.8cm))
#set text(font: "Fira Sans", size: 10.5pt, fill: C-DARK)
#set par(spacing: 0.55em)
#let ab-header(icon, title) = {
block(fill: C-ACC, width: 100%, inset: (x: 1em, y: 0.55em), radius: (top: 6pt))[
#grid(
columns: (1fr, auto),
text(size: 17pt, weight: "bold", fill: white)[#title], text(size: 22pt)[#icon],
)
]
block(fill: C-LITE, width: 100%, inset: (x: 1em, y: 0.45em), radius: (bottom: 6pt), below: 0.9em)[
#grid(
columns: (2fr, 1fr, 1fr),
gutter: 1.5em,
[Name: #box(width: 1fr)[#line(length: 100%)]],
[Klasse: #box(width: 1fr)[#line(length: 100%)]],
[Datum: #box(width: 1fr)[#line(length: 100%)]],
)
]
}
#let section(title) = {
v(0.5em)
block(fill: C-ACC.lighten(88%), width: 100%, inset: (x: 0.7em, y: 0.38em), radius: 4pt, stroke: (left: 3pt + C-ACC))[
#text(weight: "bold", fill: C-ACC)[#title]
]
v(0.25em)
}
#let step(n, content) = {
v(0.25em)
grid(
columns: (auto, 1fr),
gutter: 0.5em,
block(fill: C-ACC, inset: (x: 0.45em, y: 0.25em), radius: 4pt)[
#text(fill: white, weight: "bold", size: 9pt)[#n]
],
align(horizon)[#content],
)
}
#let code(content) = block(
fill: C-CODE,
width: 100%,
inset: (x: 0.9em, y: 0.7em),
radius: 4pt,
stroke: 0.5pt + C-GREY,
)[
#set text(font: "DejaVu Sans Mono", size: 8.5pt)
#content
]
#let blank(w: 2cm) = box(
width: w,
height: 1em,
stroke: (bottom: 0.8pt + C-DARK),
)
#let aufgabe(content) = block(
fill: C-LITE,
width: 100%,
inset: 0.85em,
radius: 6pt,
stroke: 2pt + C-ACC,
)[#content]
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#ab-header("๐", "Strategie 2: Zeilenweise Abdeckung")
// โโ Erklรคrung + Grafik โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#grid(
columns: (1fr, 5.5cm),
gutter: 1em,
align: top,
[
#section("Was ist diese Strategie?")
Der Roboter fรคhrt den Raum *bahnenweise* ab โ รคhnlich einem Rasenmรคher.
Er fรคhrt eine Zeile lang, dreht dann um, fรคhrt die nรคchste Zeile zurรผck
und so weiter (sog. *Boustrophedon*-Muster).
Damit dies funktioniert, muss der Roboter wissen, *wie groร der Raum ist*
oder er misst die Wand und wendet daran.
#v(0.3em)
*Schwierigkeit:* โญโญ (mittel) #h(1em)
*Sensoren:* Ultraschall + Farbsensor (optional)
],
[
#text(weight: "bold")[Bewegungsmuster]
#v(0.3em)
#canvas(length: 0.78cm, {
let C = rgb("#0d47a1")
let CD = rgb("#90caf9")
draw.rect((0, 0), (7, 5), stroke: 2pt)
draw.content((3.5, -0.4), text(size: 7pt, fill: rgb("#757575"))[Raum])
let rows = (4.4, 3.2, 2.0, 0.8)
let left = 0.4
let right = 6.6
draw.circle((left, rows.at(0)), radius: 0.22, fill: rgb("#2e7d32"), stroke: none)
draw.content((left + 0.05, rows.at(0) - 0.45), text(size: 7pt, fill: rgb("#2e7d32"))[Start])
for i in range(rows.len()) {
let y = rows.at(i)
let (from, to) = if calc.rem(i, 2) == 0 {
((left, y), (right, y))
} else {
((right, y), (left, y))
}
draw.line(from, to, stroke: (paint: C, thickness: 1.3pt), mark: (end: ">"))
if i < rows.len() - 1 {
let ny = rows.at(i + 1)
let wx = if calc.rem(i, 2) == 0 { right } else { left }
draw.line((wx, y), (wx, ny), stroke: (paint: CD, thickness: 1pt, dash: "dashed"))
}
}
draw.content((3.5, 2.6), text(size: 7pt, fill: rgb("#757575"))[โ Wende])
})
],
)
// โโ Algorithmus โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#section("Algorithmus โ Schritt fรผr Schritt")
#step("1", [*Fahre geradeaus*, bis Ultraschall < Schwellwert (= Wand erkannt)])
#step("2", [*Stoppe* und *drehe* 90ยฐ in Wenderichtung])
#step("3", [*Fahre* eine Bahnbreite vor (= Breite des Roboters)])
#step("4", [*Drehe* nochmals 90ยฐ (jetzt in entgegengesetzte Richtung)])
#step("5", [*Fahre* zur gegenรผberliegenden Wand โ zurรผck zu Schritt 1])
#step("6", [*Ende*, wenn keine freie Bahn mehr vorhanden (optionales Abbruchkriterium)])
// โโ Vor- und Nachteile โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#section("Vor- und Nachteile โ ergรคnze nach der Klassendiskussion")
#table(
columns: (1fr, 1fr),
stroke: 0.5pt + C-GREY,
inset: (x: 0.7em, y: 0.5em),
fill: (col, row) => {
if row == 0 { if col == 0 { C-GRN.lighten(80%) } else { C-RED.lighten(85%) } } else { white }
},
[#text(weight: "bold", fill: C-GRN)[โ
Vorteile]], [#text(weight: "bold", fill: C-RED)[โ Nachteile]],
[Deckt den Raum systematisch ab], [Braucht genaue Wand-Erkennung],
[#blank(w: 5cm)], [Ecken und unregelmรครige Rรคume schwierig],
[#blank(w: 5cm)], [#blank(w: 5cm)],
)
// โโ EV3-Umsetzung โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#section("EV3-Umsetzung")
*Sensoren:*
- ๐ก Ultraschallsensor (vorne)
- โ๏ธ Motordrehung messen (Odometrie)
- 2ร Motor (links/rechts)
Typst wird geladen...
โถBinรคrdateien
#import "@preview/cetz:0.4.2": canvas, draw
#let C-ACC = rgb("#e65100") // deep orange
#let C-LITE = rgb("#fff3e0")
#let C-CODE = rgb("#f5f5f5")
#let C-DARK = rgb("#212121")
#let C-GREY = rgb("#757575")
#let C-GRN = rgb("#1b5e20")
#let C-RED = rgb("#b71c1c")
#set page(paper: "a4", margin: (top: 1.4cm, bottom: 1.5cm, x: 1.8cm))
#set text(font: "Fira Sans", size: 10.5pt, fill: C-DARK)
#set par(spacing: 0.55em)
// โโ Komponenten โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#let ab-header(icon, title) = {
block(fill: C-ACC, width: 100%, inset: (x: 1em, y: 0.55em), radius: (top: 6pt))[
#grid(
columns: (1fr, auto),
text(size: 17pt, weight: "bold", fill: white)[#title], text(size: 22pt)[#icon],
)
]
block(fill: C-LITE, width: 100%, inset: (x: 1em, y: 0.45em), radius: (bottom: 6pt), below: 0.9em)[
#grid(
columns: (2fr, 1fr, 1fr),
gutter: 1.5em,
[Name: #box(width: 1fr)[#line(length: 100%)]],
[Klasse: #box(width: 1fr)[#line(length: 100%)]],
[Datum: #box(width: 1fr)[#line(length: 100%)]],
)
]
}
#let section(title) = {
v(0.5em)
block(fill: C-ACC.lighten(88%), width: 100%, inset: (x: 0.7em, y: 0.38em), radius: 4pt, stroke: (left: 3pt + C-ACC))[
#text(weight: "bold", fill: C-ACC)[#title]
]
v(0.25em)
}
#let step(n, content) = {
v(0.25em)
grid(
columns: (auto, 1fr),
gutter: 0.5em,
block(fill: C-ACC, inset: (x: 0.45em, y: 0.25em), radius: 4pt)[
#text(fill: white, weight: "bold", size: 9pt)[#n]
],
align(horizon)[#content],
)
}
#let code(content) = block(
fill: C-CODE,
width: 100%,
inset: (x: 0.9em, y: 0.7em),
radius: 4pt,
stroke: 0.5pt + C-GREY,
)[
#set text(font: "DejaVu Sans Mono", size: 8.5pt)
#content
]
#let blank(w: 2cm) = box(
width: w,
height: 1em,
stroke: (bottom: 0.8pt + C-DARK),
)
#let aufgabe(content) = block(
fill: C-LITE,
width: 100%,
inset: 0.85em,
radius: 6pt,
stroke: 2pt + C-ACC,
)[#content]
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#ab-header("๐ฒ", "Strategie 1: Zufallsbewegung")
// โโ Erklรคrung + Grafik โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#grid(
columns: (1fr, 5.5cm),
gutter: 1em,
align: top,
[
#section("Was ist diese Strategie?")
Der Roboter fรคhrt *immer geradeaus*, bis er ein Hindernis erkennt.
Dann stoppt er, dreht sich um einen *zufรคlligen Winkel* und fรคhrt wieder los.
Dieser Ablauf wiederholt sich unendlich oft.
Das Prinzip รคhnelt einem Billardball, der von Wรคnden abprallt โ
nur mit zufรคlligem Abprallwinkel.
#v(0.3em)
*Schwierigkeit:* โญ (einfach) #h(1em)
*Sensoren:* Ultraschall + Berรผhrung
],
[
#text(weight: "bold")[Bewegungsmuster]
#v(0.3em)
#canvas(length: 0.78cm, {
let C = rgb("#e65100")
draw.rect((0, 0), (7, 5), stroke: 2pt)
draw.content((3.5, -0.4), text(size: 7pt, fill: rgb("#757575"))[Raum])
let pts = ((0.4, 4.4), (3.2, 4.4), (5.8, 1.2), (1.1, 2.0), (6.5, 3.8), (3.5, 0.4))
for i in range(pts.len() - 1) {
draw.line(pts.at(i), pts.at(i + 1), stroke: (paint: C, thickness: 1.3pt), mark: (end: ">"))
}
draw.circle(pts.first(), radius: 0.22, fill: rgb("#2e7d32"), stroke: none)
draw.content((0.4, 4.0), text(size: 7pt, fill: rgb("#2e7d32"))[Start])
draw.line((3.2, 4.4), (3.2, 3.8), stroke: (paint: rgb("#999999"), thickness: 0.7pt, dash: "dashed"))
draw.content((3.6, 3.9), text(size: 6.5pt, fill: rgb("#757575"))[Zufall-\nwinkel])
})
],
)
// โโ Algorithmus โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#section("Algorithmus โ Schritt fรผr Schritt")
#step("1", [*Fahre geradeaus* mit konstanter Geschwindigkeit])
#step("2", [*Prรผfe* jeden Moment: Ist ein Hindernis nรคher als X cm? Oder Berรผhrung?])
#step("3", [*Stoppe* den Roboter sofort])
#step("4", [*Wรคhle* einen zufรคlligen Drehwinkel (z.B. 90ยฐ โ 270ยฐ)])
#step("5", [*Drehe* den Roboter um diesen Winkel โ zurรผck zu Schritt 1])
// โโ Vor- und Nachteile โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#section("Vor- und Nachteile โ ergรคnze nach der Klassendiskussion")
#table(
columns: (1fr, 1fr),
stroke: 0.5pt + C-GREY,
inset: (x: 0.7em, y: 0.5em),
fill: (col, row) => {
if row == 0 { if col == 0 { C-GRN.lighten(80%) } else { C-RED.lighten(85%) } } else { white }
},
[#text(weight: "bold", fill: C-GRN)[โ
Vorteile]], [#text(weight: "bold", fill: C-RED)[โ Nachteile]],
[Sehr einfach zu programmieren], [Deckt nicht alle Stellen garantiert ab],
[#blank(w: 5cm)], [Ecken werden oft ausgelassen],
[#blank(w: 5cm)], [#blank(w: 5cm)],
)
// โโ EV3-Umsetzung โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#section("EV3-Umsetzung")
*Sensoren:*
- ๐ก Ultraschallsensor (vorne)
- ๐ค Berรผhrungssensor (vorne)
- 2ร Motor (links/rechts)