Mike Barkmin

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)
Staubsaugroboter

Teilbare URL erstellen

Abschnitte auswรคhlen