Ausweichroboter
Ein Roboter, der selbstständig durch den Raum fährt und Hindernissen ausweicht. Kein Bausatz, kein Lasercut, kein 3D-Druck -- das Chassis ist ein Paketkarton. Schere, Heißkleber, fertig. Die Elektronik ist ein Arduino Uno, zwei Motoren und ein Ultraschallsensor. Gesamtkosten unter 15 Euro (ohne den Karton).
Stückliste
| Teil | Beschreibung | ca. Preis |
|---|---|---|
| Arduino Uno R3 | ATMega328P, oder kompatibler Klon | 5 € |
| L298N Motortreiber | Dual-H-Brücke, 5V-Regler onboard | 2 € |
| HC-SR04 | Ultraschall-Entfernungssensor | 1 € |
| 2× TT-Motor mit Rad | Die gelben Getriebemotoren (1:48) | 3 € |
| Kugelrad (Ballcaster) | Als drittes Rad hinten, oder eine Murmel mit Heißkleber | 1 € |
| 4× AA Batteriehalter | 6V Versorgung für Motoren | 1 € |
| Jumperkabel | Dupont-Kabel, male-female | vorhanden |
| Paketkarton | Doppelwellig, ca. 3--4 mm stark | 0 € |
Alles bis auf den Karton gibt es bei den üblichen Verdächtigen. Die TT-Motoren mit Rädern werden oft im Doppelpack verkauft.
Chassis
Das Chassis ist ein einziges Stück Wellpappe, das zu einer flachen Wanne gefaltet wird. Kein Schneiden und Kleben von Einzelteilen -- ein Zuschnitt, falten, fertig. Die hochgeklappten Wände geben Stabilität und dienen gleichzeitig als Halterung für den Sensor und die Elektronik.
Zuschnitt
Ausgangsmaterial: ein Stück doppelwellige Pappe, ca. 30 × 24 cm (passt in jeden Paketkarton). Die Wellpappe-Rillen sollten quer zur Fahrtrichtung laufen -- dann lassen sich die Seitenwände sauber falten.
┌─────── 18 cm ───────┐
│ │
4 cm │ ○ ○ Frontwand │ 4 cm
────────┼──────────────────────┼────────
│ │
│ │
4 cm │ Bodenplatte │ 4 cm
│ 18 × 12 │
│ │
────────┼──────────────────────┼────────
4 cm │ Heckwand (2 cm) │ 4 cm
│ │
└──────────────────────┘
- Bodenplatte: 18 × 12 cm (Mitte)
- Seitenwände: je 4 cm hoch, links und rechts
- Frontwand: 4 cm hoch, mit zwei Löchern (Ø 16 mm, Abstand 26 mm) für die HC-SR04-Augen
- Heckwand: nur 2 cm hoch (Kabel müssen raus)
- Ecklaschen: Die 4 × 4 cm Ecken einschneiden, dann als Verstärkung nach innen falten und festkleben
Falzlinien
Die Falzlinien (gestrichelt im Zuschnitt) mit der stumpfen Seite einer Schere oder einem Lineal einritzen -- nicht durchschneiden. Dann klappen die Wände sauber hoch. Bei doppelwelliger Pappe geht das einwandfrei.
Motorhalterung
Die TT-Motoren werden von innen an die Seitenwände geklebt. Dazu in jede Seitenwand einen Schlitz schneiden (ca. 20 × 15 mm), durch den die Motorachse nach außen ragt. Der Motor liegt flach an der Innenseite der Wand an -- Heißkleber hält bombenfest.
Die Motorachsen sollten ungefähr auf halber Länge der Bodenplatte sitzen, leicht hinter der Mitte. So kippt der Bot nicht nach vorne.
Zusammenbau
- Zuschnitt ausschneiden, Falzlinien ritzen
- Motorschlitze in die Seitenwände schneiden
- HC-SR04-Löcher in die Frontwand bohren (Kugelschreiber reicht)
- Wände hochklappen, Ecklaschen nach innen falten und festkleben
- Motoren von innen einkleben, Räder aufstecken
- Kugelrad hinten mittig unter die Bodenplatte kleben (oder eine Murmel in einen Heißklebe-Klecks drücken)
- Arduino Uno und L298N oben auf die Bodenplatte -- doppelseitiges Klebeband oder Gummibänder
- Batteriehalter unter die Bodenplatte zwischen die Motoren
Zeitaufwand: ca. 30 Minuten. Wenn was nicht passt -- neuen Karton nehmen, kostet nichts.
Schaltung
Pinbelegung
| Arduino Pin | Verbindung |
|---|---|
| D2 | HC-SR04 Trigger |
| D3 | HC-SR04 Echo |
| D5 | L298N ENA (PWM linker Motor) |
| D6 | L298N ENB (PWM rechter Motor) |
| D7 | L298N IN1 |
| D8 | L298N IN2 |
| D9 | L298N IN3 |
| D10 | L298N IN4 |
| GND | gemeinsame Masse |
Verkabelung
- Stromversorgung: 4× AA (6V) an die Motorklemmen des L298N (+ und GND). Der 5V-Regler auf dem L298N versorgt über seinen 5V-Ausgang den Arduino (an den 5V-Pin, nicht VIN).
- Motoren: Linker Motor an OUT1/OUT2, rechter Motor an OUT3/OUT4.
- HC-SR04: VCC an Arduino 5V, GND an GND, Trigger an D2, Echo an D3.
Code
// Ausweichroboter -- Arduino Uno + HC-SR04 + L298N
// Fährt geradeaus, weicht bei Hindernis aus.
// --- Pins ---
const int TRIG = 2;
const int ECHO = 3;
const int ENA = 5; // PWM links
const int ENB = 6; // PWM rechts
const int IN1 = 7;
const int IN2 = 8;
const int IN3 = 9;
const int IN4 = 10;
// --- Parameter ---
const int SPEED = 150; // 0-255, Motorgeschwindigkeit
const int TURN_SPEED = 180;
const int MIN_DIST_CM = 25; // Ausweichdistanz
const int TURN_MS = 400; // Drehzeit in ms
void setup() {
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(ENA, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
Serial.begin(9600);
}
void loop() {
int dist = measureDistance();
if (dist > 0 && dist < MIN_DIST_CM) {
// Hindernis: anhalten, zurück, drehen
stop();
delay(200);
backward(SPEED);
delay(300);
stop();
delay(200);
turnRight(TURN_SPEED);
delay(TURN_MS);
stop();
delay(200);
} else {
forward(SPEED);
}
delay(50);
}
// --- Entfernung messen ---
int measureDistance() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long duration = pulseIn(ECHO, HIGH, 30000); // Timeout 30ms
if (duration == 0) return -1; // kein Echo
return duration / 58; // cm
}
// --- Motorfunktionen ---
void forward(int speed) {
analogWrite(ENA, speed);
analogWrite(ENB, speed);
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
}
void backward(int speed) {
analogWrite(ENA, speed);
analogWrite(ENB, speed);
digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
}
void turnRight(int speed) {
analogWrite(ENA, speed);
analogWrite(ENB, speed);
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); // links vorwärts
digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); // rechts rückwärts
}
void turnLeft(int speed) {
analogWrite(ENA, speed);
analogWrite(ENB, speed);
digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); // links rückwärts
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); // rechts vorwärts
}
void stop() {
analogWrite(ENA, 0);
analogWrite(ENB, 0);
}
Der Code ist bewusst simpel gehalten -- eine Zustandsmaschine mit zwei Zuständen: "Fahren" und "Ausweichen". Das reicht, um den Bot durch ein Zimmer fahren zu lassen.
Was man verbessern kann
- Zufällige Drehrichtung: Mal links, mal rechts ausweichen (
random()) - Zweiter Sensor: Seitlich montiert, für bessere Orientierung
- Geschwindigkeitsregelung: Langsamer werden je näher das Hindernis
- Serielle Ausgabe:
Serial.println(dist)für Debugging über USB
Weiterführendes
- HC-SR04 Ultraschallsensor -- Details zum Sensor
- Mikrocontroller -- ATMega328P und ESP32 im Überblick