Micromouse 🐭💡
"Wie schwer kann’s sein?" – 300 Stunden später...
🧠 Was muss so eine Maus können?
- Wände erkennen (IR-Sensoren in alle Richtungen – Batman wäre neidisch)
- Wissen, wo sie ist (ohne GPS oder Google Maps)
- Eine Karte vom Labyrinth bauen
- Den kürzesten Pfad zum Ziel finden
- Alles möglichst schnell, effizient – und ohne sich selbst umzubringen
🧰 Mein Part: Full Stack Roboter-Dompteur
🔌 Sensoren & ADC
C
void adc_init() {
ADMUX = (1 << REFS0);
ADCSRA = (1 << ADEN) | (1 << ADPS1) | (1 << ADPS0);
}
uint16_t read_adc(uint8_t channel) {
ADMUX = (ADMUX & 0xF0) | (channel & 0x0F);
ADCSRA |= (1 << ADSC);
while (ADCSRA & (1 << ADSC));
return ADC;
}
ADC: “Ich sehe was, was du nicht siehst – und es ist... eine Wand.”
⚙️ Motorsteuerung mit PWM
C
void pwm_init() {
DDRD |= (1 << PD6) | (1 << PD5);
TCCR0A = (1 << COM0A1) | (1 << COM0B1) | (1 << WGM01) | (1 << WGM00);
TCCR0B = (1 << CS01);
}
void set_motor_speed(uint8_t left, uint8_t right) {
OCR0A = left;
OCR0B = right;
}
PWM: Die Kunst, Motoren dazu zu bringen, genau so schnell zu drehen wie du willst – und nicht schneller als dein Akku verkraftet.
🎯 PD-Regelung – Geradeaus ist auch eine Richtung
C
int16_t pd_controller(int16_t error) {
static int16_t prev_error = 0;
const int16_t Kp = 8;
const int16_t Kd = 4;
int16_t derivative = error - prev_error;
prev_error = error;
return (Kp * error) + (Kd * derivative);
}
Technisch korrekt, gefühlt wie Power-Steering für Roboter.
🧭 Maze-Solving: Right-Wall-Follower
C
void follow_right_wall() {
uint16_t front = read_adc(0);
uint16_t right = read_adc(1);
uint16_t left = read_adc(2);
if (right > 200) {
if (front > 200) {
turn_left();
} else {
drive_forward();
}
} else {
turn_right();
}
}
Logik-Level: „Ich halt mich rechts, Bruder.“ 🐒
🚗 Bewegungsfunktionen
C
void drive_forward() {
set_motor_speed(200, 200);
}
void turn_left() {
set_motor_speed(100, 200);
_delay_ms(300);
}
void turn_right() {
set_motor_speed(200, 100);
_delay_ms(300);
}
Delay ist kein echtes Timing – aber hey, es funktioniert (meistens).
🔁 Main Loop
C
int main(void) {
adc_init();
pwm_init();
while (1) {
follow_right_wall();
}
}
"While(1)": Wo Embedded-Leute leben. Und sterben. Und debuggen.
🏁 Ergebnis: Sieger der Herzen (und des Hochschulwettbewerbs)
🧪 Nächstes Level (a.k.a. Das Upgrade, wenn du’s ernst meinst)
- Flood-Fill für smarteres Mapping
- Gyro für Drehkontrolle
- Encoder für echte Distanzmessung
- OLED-Display: „Wall ahead! Panic now.“
- Bluetooth/UART Logging
📸 Projektgalerie
Hier könnte dein Roboter stylish durchs Maze fahren.
💬 Fazit
„Du bist meine kleine, nervige, piepende Schöpfung – und ich bin stolz auf dich.“