Skip to content
This repository was archived by the owner on Nov 7, 2026. It is now read-only.

Commit 20e587d

Browse files
committed
Web 0.15.28: Block-Lektion 7 „Der Linie folgen“
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ugz28UyJP4CyzFezJTWZbD
2 parents ea81789 + 0b02ecf commit 20e587d

13 files changed

Lines changed: 1560 additions & 1233 deletions

‎CHANGELOG.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ The format is loosely inspired by Keep a Changelog.
88

99
### Changed
1010

11+
- **Web 0.15.28, VisuBot block lesson 7 „Der Linie folgen“:** the line sensor for younger learners: turn around at the black edge (`solange Linie == 0`), then a simple two-case line follower with „Linie links?“ and „Räder einzeln“ (wenn links Schwarz: 10, 40, sonst 40, 10), checked in both line worlds; game „Was passiert?“ with four rounds.
1112
- **Web 0.15.27, VisuBot block lessons 5 „Lichter und Töne“ and 6 „Immer wieder prüfen“:** LEDs in RGB colours, blinking with „wiederhole“ and „kurz warten“, a siren with „Ton spielen“, and a free light show. The game „Was passiert?“ (`spiel frage`) shows its rounds as blocks in the block lessons, like „Wo landet der mBot2?“. Lesson 6 „Immer wieder prüfen“: wait for button A (solange nicht …), endless loop with an emergency brake, free obstacle avoidance. Blocks also show „nicht“, „und“, „oder“ and „verlasse die Schleife“ instead of `!`, `&&`, `||` and `break`.
1213
- **Web 0.15.26, VisuBot: short block lessons for younger learners (grades 5/6):** when the block view is on in VisuBot, the learning area shows its own short lesson series from `web/lessons/<lang>/visubot/bloecke/` instead of the Java series (switching back restores it; no exercises tab content there). Lessons are about trying things out: step 1 „Das schaffst du heute“, a few hands-on exercises, a game, and „Das hab ich geschafft“ as the checklist; no knowledge test. First lessons (German): 1 „Losfahren“ (drive, change numbers, turn), 2 „Immer wieder“ (square, „wiederhole“, triangle and other shapes), 3 „Der mBot2 misst“ (show the distance, drive while the way is free) and 4 „Entscheidungen“ (wenn/sonst with the wall and the colour sensor). The blocks now show their keywords in the UI language: „wenn“, „sonst“, „solange“, „wiederhole immer“, „mache“ (en: if, else, while, forever, do; pt: se, senão, enquanto, repetir sempre, faz). In „Wo landet der mBot2?“ the rounds are shown as blocks instead of Java (`blockPicture.ts`). Tests in `blockLessons.test.ts`.
1314
- **Web 0.15.25, VisuBot blocks (stage 5): variables and operators:** new areas in „Elemente“ (VisuBot): **Operatoren** (plus, minus, mal, geteilt durch, Rest beim Teilen, Zufallszahl, kleiner als, größer als, gleich, und, oder, nicht; round = number, hexagonal = yes/no, green), **Variablen** (Variable anlegen → `int zahl = 0` with a free name, setze Variable auf → `zahl = 0`, ändere Variable um → `zahl = zahl + 1`; every declared variable appears as an orange building block) and **Steuerung** („wiederhole 10 mal“ → `for (int i = 0; i < 10; i++)`). In the blocks, operators and variables are dropped onto a white field (an operator gets brackets only when needed) or onto a condition (replaces it; „und“/„oder“/„nicht“ combine with the old condition). Variables show as orange pills; the one being declared or set is not a field. „Zufallszahl von [1] bis [10]“ is a green pill with two fields (`(int) (Math.random() * 10) + 1`). A count loop whose variable is not used in its body reads „wiederhole [10] mal“; its end can also be a variable. Commands from „Elemente“ with empty brackets (`mbot.forward()`) get an empty white field to type the number. The rules come from VisuBlocks (`expressions.ts`, `variables.ts`). Tests in `blockView.test.ts`.
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
---
2+
titel: Der Linie folgen
3+
bereich: Sensoren und Entscheidungen
4+
kurz: Mit dem Liniensensor am Rand umkehren und einer schwarzen Linie folgen.
5+
---
6+
7+
## Das schaffst du heute
8+
9+
::: kompetenzen
10+
- mit dem Liniensensor eine schwarze Linie erkennen
11+
- den mBot2 am Rand umkehren lassen
12+
- den mBot2 einer Linie folgen lassen
13+
:::
14+
15+
## Augen nach unten
16+
17+
Unter dem mBot2 sitzt vorn der **Liniensensor**. Er leuchtet auf den Boden und sieht, ob es dort hell oder dunkel ist.
18+
19+
::: mbot2
20+
fokus: lineSensor
21+
ansicht: unten
22+
:::
23+
24+
Der Sensor **Linie** aus der Gruppe **➖ Linie** liefert **0**, wenn unter dem mBot2 alles hell ist. Sieht er etwas Schwarzes, ist die Zahl größer als 0.
25+
26+
## Am Rand umkehren
27+
28+
Stell dir einen Tisch vor, um den schwarzes Klebeband klebt. Der mBot2 soll vorfahren, bis er das Band sieht, und dann umkehren. So fällt er nicht herunter.
29+
30+
1. Zieh eine **While-Schleife** unter 🏁.
31+
2. Zieh aus **Operatoren** den Baustein **gleich** auf die Frage hinter **solange**.
32+
3. Leg den Sensor **Linie** in das linke Feld und tipp rechts **0** ein.
33+
4. Leg **fahre vor** in die Schleife und **drehe rechts** mit **180** darunter.
34+
35+
::: übung vbb-rand
36+
titel: Am Rand umkehren
37+
auftrag: Der mBot2 fährt vor, solange er keine Linie sieht. Dann dreht er sich um. Es gibt zwei Welten, der Rand ist mal näher und mal weiter weg.
38+
welt: rand-1 -> forward 20, turnRight 180
39+
welt: rand-2 -> forward 50, turnRight 180
40+
braucht: whileSchleife
41+
tipp: Die Frage der Schleife heißt `mbot.getLine() == 0`.
42+
tipp: **drehe rechts** mit 180 liegt unter der Schleife, nicht darin.
43+
lösung: vbb-rand-loesung.visustruct
44+
:::
45+
46+
## Der Linie folgen
47+
48+
Jetzt kommt ein Klassiker: Der mBot2 fährt eine schwarze Linie entlang, auch durch Kurven. Dafür brauchst du zwei neue Dinge:
49+
50+
- **Linie links?** aus der Gruppe **➖ Linie** sagt ja, wenn der linke Fühler Schwarz sieht.
51+
- **Räder einzeln** aus der Gruppe **⚙️ Räder einzeln** lässt jedes Rad anders schnell drehen. Die erste Zahl ist das linke Rad, die zweite das rechte. Dreht das rechte schneller, fährt er eine Linkskurve.
52+
53+
Die Idee ist ganz einfach: **Wenn** links Schwarz ist, lenkt er nach links. **Sonst** lenkt er nach rechts. So wackelt er an der Linie entlang.
54+
55+
::: übung vbb-linienfolger
56+
titel: Linienfolger
57+
auftrag: Solange die Wand mehr als 15 cm weg ist, folgt der mBot2 der Linie. Danach hält er an. In der einen Welt biegt die Linie nach rechts ab, in der anderen nach links.
58+
welt: linie-1, linie-2
59+
braucht: whileSchleife, verzweigung
60+
tipp: Außen eine While-Schleife mit `mbot.getDistance() > 15`. Darin eine Verzweigung mit **Linie links?**. Unter der Schleife liegt **anhalten**.
61+
tipp: Unter **wenn** liegt **Räder einzeln** mit `10, 40`, unter **sonst** **Räder einzeln** mit `40, 10`.
62+
lösung: vbb-linienfolger-loesung.visustruct
63+
:::
64+
65+
Probier aus: Was passiert mit `20, 60` und `60, 20`? Wird er schneller oder fliegt er aus der Kurve?
66+
67+
::: ludwig
68+
Am echten mBot2 klebst du die Linie mit schwarzem Isolierband auf einen hellen Boden. Fang langsam an, sonst schießt er in der Kurve über die Linie hinaus.
69+
:::
70+
71+
## Spiel: Was passiert?
72+
73+
::: spiel frage
74+
titel: Spiel: Was passiert?
75+
intro: Schau dir die Blöcke an. Was macht der mBot2? Vier Runden.
76+
77+
runde:
78+
mbot.drive(40, 40);
79+
frage: Wie fährt der mBot2?
80+
- [x] geradeaus
81+
- Linkskurve
82+
- Rechtskurve
83+
> Beide Räder drehen gleich schnell.
84+
85+
runde:
86+
mbot.drive(10, 40);
87+
frage: Wie fährt der mBot2?
88+
- geradeaus
89+
- [x] Linkskurve
90+
- Rechtskurve
91+
> Das rechte Rad ist schneller, also schiebt es ihn nach links.
92+
93+
runde:
94+
if (mbot.isLineLeft()) {
95+
mbot.drive(10, 40);
96+
} else {
97+
mbot.drive(40, 10);
98+
}
99+
frage: Nur der rechte Fühler sieht die Linie. Wie fährt er?
100+
- Linkskurve
101+
- [x] Rechtskurve
102+
- Er hält an.
103+
> Links ist kein Schwarz, also nimmt er den sonst-Teil: das linke Rad ist schneller.
104+
105+
runde:
106+
while (mbot.getLine() == 0) {
107+
mbot.forward();
108+
}
109+
mbot.turnRight(180);
110+
frage: Der mBot2 steht schon auf der schwarzen Linie. Was tut er?
111+
- Er fährt erst ein Stück vor.
112+
- [x] Er dreht sich sofort um.
113+
- Er fährt immer weiter.
114+
> Die Frage der Schleife ist gleich am Anfang nein, also läuft sie gar nicht.
115+
:::
116+
117+
## Das hab ich geschafft
118+
119+
Wie gut klappt es schon? ☂️ noch nicht, ⛅ ein bisschen, ☀️ klappt prima. Bei ☂️ und ⛅ bringt dich **Nachlesen** zum passenden Schritt.
120+
121+
::: checkliste
122+
- Ich kann mit dem Liniensensor eine Linie erkennen. → Augen nach unten
123+
- Ich kann den mBot2 am Rand umkehren lassen. → Am Rand umkehren
124+
- Ich kann den mBot2 einer Linie folgen lassen. → Der Linie folgen
125+
:::
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<struktogramm caption="-1;">
3+
<strelem typ="4" zx="0" zy="0">
4+
<text>109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53;</text>
5+
<schleifeninhalt>
6+
<strelem typ="1" zx="0" zy="0">
7+
<text>109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41;</text>
8+
<fall fallname="116;114;117;101;">
9+
<strelem typ="0" zx="0" zy="0">
10+
<text>109;98;111;116;46;100;114;105;118;101;40;49;48;44;32;52;48;41;</text>
11+
</strelem>
12+
</fall>
13+
<fall fallname="102;97;108;115;101;">
14+
<strelem typ="0" zx="0" zy="0">
15+
<text>109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;49;48;41;</text>
16+
</strelem>
17+
</fall>
18+
</strelem>
19+
</schleifeninhalt>
20+
</strelem>
21+
<strelem typ="0" zx="0" zy="0">
22+
<text>109;98;111;116;46;115;116;111;112;40;41;</text>
23+
</strelem>
24+
</struktogramm>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<struktogramm caption="-1;">
3+
<strelem typ="4" zx="0" zy="0">
4+
<text>109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48;</text>
5+
<schleifeninhalt>
6+
<strelem typ="0" zx="0" zy="0">
7+
<text>109;98;111;116;46;102;111;114;119;97;114;100;40;41;</text>
8+
</strelem>
9+
</schleifeninhalt>
10+
</strelem>
11+
<strelem typ="0" zx="0" zy="0">
12+
<text>109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41;</text>
13+
</strelem>
14+
</struktogramm>

‎web/package-lock.json‎

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎web/package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "visustruct-web",
33
"private": true,
4-
"version": "0.15.27",
4+
"version": "0.15.28",
55
"type": "module",
66
"scripts": {
77
"dev": "vite",

‎web/test/blockLessons.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ describe('Block-Lektionen (de)', () => {
2121

2222
it('erscheinen nur mit Block-Ansicht in VisuBot, ohne Aufgaben', () => {
2323
expect(showingBlockLessons()).toBe(true)
24-
expect(lessons.length).toBeGreaterThanOrEqual(6)
24+
expect(lessons.length).toBeGreaterThanOrEqual(7)
2525
expect(lessons.every((l) => l.blocks && l.robot)).toBe(true)
2626
lessons.forEach((l, i) => expect(l.number, l.id).toBe(i + 1))
2727
expect(tasks).toEqual([])
@@ -67,7 +67,7 @@ describe('Block-Lektionen (de)', () => {
6767
checked++
6868
}
6969
}
70-
expect(checked).toBeGreaterThanOrEqual(15)
70+
expect(checked).toBeGreaterThanOrEqual(17)
7171
})
7272

7373
it('jede Runde von „Wo landet der mBot2?“ endet auf dem angegebenen Feld', () => {
Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)