🤖 KI auf dem Alvik: Dein Roboter lernt!

✨ Das Besondere an diesem Projekt

Künstliche Intelligenz ist überall – in deinem Smartphone, in Sprachassistenten, in selbstfahrenden Autos. Und jetzt auch auf deinem Alvik! In diesem Projekt bringst du deinem Roboter bei, Muster zu lernen und eigenständig auszuführen – genau wie echte KI!

🧠 Was ist Machine Learning überhaupt?

Machine Learning (auf Deutsch: "Maschinelles Lernen") ist ein Teilbereich der Künstlichen Intelligenz. Statt einem Computer jede einzelne Regel einzuprogrammieren, lernt er aus Beispielen!

❌ Normale Programmierung

"Wenn Sensor A den Wert 5 misst, dann fahre 10 cm. Wenn Sensor B den Wert 3 misst, dann drehe um 90°..."

→ Programmierer gibt alle Regeln vor

✅ Machine Learning

"Hier sind 1000 Beispiele von roten Farben. Lerne selbst, was 'Rot' bedeutet und was du dann tun sollst!"

→ Computer lernt aus Beispielen

🎯 Wie funktioniert unser Mini-KI-Roboter?

Dein Alvik-Roboter lernt in diesem Projekt wie eine KI! Er durchläuft die gleichen Phasen wie echte Machine-Learning-Systeme:

Die 4 Phasen des Lernens

1️⃣
TRAININGSPHASE (Lernen)

Du zeigst dem Alvik 5 Farbkarten. Er scannt jede Farbe und speichert sie.

  • 🔴 Rot = Vorwärts fahren
  • 🟡 Gelb = Rückwärts fahren
  • 🟢 Grün = Rechts drehen
  • 🔵 Blau = Links drehen
2️⃣
MODELL-ERSTELLUNG (Speichern)

Der Alvik speichert die Farb-Sequenz in seinem "Gedächtnis" (der Variable pattern_memory[]). Das ist wie ein trainiertes KI-Modell!

3️⃣
VALIDIERUNG (Überprüfen)

Du siehst auf dem Display, was der Alvik gelernt hat. Erst wenn du OK drückst, geht's weiter – so wie bei echten KI-Systemen, die erst getestet werden müssen!

4️⃣
INFERENCE (Anwenden)

Jetzt wird's spannend! Der Alvik führt das gelernte Muster komplett selbstständig aus – ohne dass du noch etwas eingeben musst. Das nennt man in der KI "Inference"!

🤯 Vergleich mit echter KI:
  • ChatGPT wurde mit Millionen von Texten trainiert → erkennt Sprachmuster
  • Gesichtserkennung wurde mit tausenden Fotos trainiert → erkennt Gesichter
  • Dein Alvik wurde mit 5 Farbkarten trainiert → erkennt Farben und führt Bewegungen aus
Das Prinzip ist das Gleiche – nur die Datenmenge unterscheidet sich!

🔬 Das Geheimnis: Kalibrierte Farberkennung

Das Herzstück dieses Programms ist die Funktion detect_color_calibrated(). Sie arbeitet wie ein neuronales Netz bei Bilderkennung:

Schritt Was passiert? KI-Vergleich
1. Daten sammeln 5 Farbmessungen (RGB) werden gemacht Wie Kamera-Bilder für Bilderkennung
2. Umwandeln RGB → HSV (Farbton, Sättigung, Helligkeit) Feature-Extraction (Merkmale herausfiltern)
3. Durchschnitt Mittelwert aus 5 Messungen Noise Reduction (Fehler reduzieren)
4. Klassifizieren Vergleich mit kalibrierten Bereichen Classification (In Kategorien einteilen)
💡 Warum HSV statt RGB?
RGB-Werte ändern sich stark bei unterschiedlichem Licht. HSV (Hue-Saturation-Value) ist stabiler:
  • H (Hue) = Farbton (0-360°) – "Welche Farbe?"
  • S (Saturation) = Sättigung (0-1) – "Wie kräftig?"
  • V (Value) = Helligkeit (0-1) – "Wie hell?"
Das ist wie bei Instagram-Filtern – egal wie hell/dunkel, die Farbe bleibt erkennbar!

Technische Funktionen und Code-Struktur

Genutzte Alvik-Funktionen

Sensorik:

Bewegung:

Feedback:

Display (I2C):

Code-Struktur (4 Phasen)

  1. Initialisierung: Display- und Roboter-Setup, Beleuchtung einschalten, Startbildschirm
  2. Lernphase: Schleife erfasst 5 Farben mit detect_color_calibrated(), speichert sie in pattern_memory[], zeigt Fortschritt am Display
  3. Bestätigung: Blink-Animation bis OK-Taste gedrückt wird, zeigt gelerntes Muster als Symbolsequenz
  4. Ausführung: For-Schleife iteriert durch pattern_memory[] und führt entsprechende Bewegungsbefehle aus, Display zeigt Live-Fortschritt

Kern-Algorithmus: Die Funktion detect_color_calibrated() nimmt 5 HSV-Messungen, bildet Durchschnittswerte und vergleicht diese mit kalibrierten Bereichen (H: Farbton 0-360°, S: Sättigung 0-1, V: Helligkeit 0-1) für präzise Farberkennung.

Alvik Roboter mit Farbkarten

Alvik-Roboter bei der Mustererkennung

Python Code

from machine import Pin, I2C
import ssd1306
from arduino_alvik import ArduinoAlvik
from time import sleep_ms

# ==================== DISPLAY KONFIGURATION ====================
i2c = I2C(sda=Pin(11), scl=Pin(12))
display = ssd1306.SSD1306_I2C(128, 64, i2c)

def display_text(lines, clear=True):
    if clear:
        display.fill(0)
    y = 0
    for line in lines:
        display.text(line, 0, y, 1)
        y += 10
    display.show()

def display_progress_bar(current, total, label=""):
    display.fill(0)
    display.text(label, 0, 0, 1)
    bar_width = int((current / total) * 120)
    display.rect(4, 20, 120, 15, 1)
    display.fill_rect(5, 21, bar_width, 13, 1)
    percent = f"{current}/{total}"
    x = (128 - len(percent) * 8) // 2
    display.text(percent, x, 45, 1)
    display.show()

# ==================== PERFEKT KALIBRIERTE FARBERKENNUNG ====================
def detect_color_calibrated(alvik):
    """
    Exakte Farberkennung mit ALLEN gemessenen HSV-Werten:
    
    ROT:    h=5.11,   s=0.68, v=0.59 (hohe Sättigung, mittlere Helligkeit)
    GELB:   h=40.04,  s=0.59, v=0.92 (SEHR hell!)
    GRÜN:   h=96.76,  s=0.37, v=0.56 (niedrige Sättigung, niedrige Helligkeit)
    BLAU:   h=198.13, s=0.36, v=0.80 (niedrige Sättigung, hohe Helligkeit)
    """
    
    # 5 Messungen für maximale Stabilität
    h_values = []
    s_values = []
    v_values = []
    
    for _ in range(5):
        r, g, b = alvik.get_color()
        h, s, v = alvik.rgb2hsv(r, g, b)
        h_values.append(h)
        s_values.append(s)
        v_values.append(v)
        sleep_ms(30)
    
    # Durchschnittswerte berechnen
    h = sum(h_values) / len(h_values)
    s = sum(s_values) / len(s_values)
    v = sum(v_values) / len(v_values)
    
    # Optional: Debug-Ausgabe (auskommentieren zum Testen)
    # print(f"H:{h:.1f} S:{s:.2f} V:{v:.2f}")
    
    # Zu dunkel = keine gültige Farbe
    if v < 0.10:
        return None
    
    # Zu geringe Sättigung UND zu dunkel = Schwarz/Grau
    if s < 0.15 and v < 0.40:
        return None
    
    # ===== PRÄZISE FARBERKENNUNG MIT ALLEN PARAMETERN =====
    
    # ROT: h=5.11, s=0.68, v=0.59
    # Einzige Farbe mit HOHER Sättigung + mittlerer Helligkeit
    if (h < 25 or h > 340) and 0.50 < s < 0.85 and 0.40 < v < 0.75:
        return 'RED'
    
    # GELB: h=40.04, s=0.59, v=0.92
    # SEHR HELL (v=0.92) unterscheidet es von allen anderen!
    elif 28 < h < 52 and 0.40 < s < 0.75 and 0.80 < v:
        return 'YELLOW'
    
    # GRÜN: h=96.76, s=0.37, v=0.56
    # Niedrige Sättigung + niedrigste Helligkeit
    elif 72 < h < 122 and 0.20 < s < 0.55 and 0.40 < v < 0.70:
        return 'GREEN'
    
    # BLAU: h=198.13, s=0.36, v=0.80
    # Niedrige Sättigung aber HOHE Helligkeit (unterscheidet von Grün!)
    elif 173 < h < 223 and 0.20 < s < 0.50 and 0.65 < v < 0.95:
        return 'BLUE'
    
    return None

# ==================== FARB-KONFIGURATION ====================
COLOR_ACTIONS = {
    'RED': {'name': 'Vorwaerts', 'symbol': '^', 'led': (1, 0, 0)},
    'YELLOW': {'name': 'Rueckw.', 'symbol': 'v', 'led': (1, 1, 0)},
    'GREEN': {'name': 'Rechts', 'symbol': '>', 'led': (0, 1, 0)},
    'BLUE': {'name': 'Links', 'symbol': '<', 'led': (0, 0, 1)}
}

MAX_PATTERN_LENGTH = 5
MOVE_DISTANCE = 15
ROTATION_ANGLE = 90

# ==================== INITIALISIERUNG ====================
alvik = ArduinoAlvik()
alvik.begin()
alvik.set_illuminator(True)
sleep_ms(500)

# Startbildschirm
display_text([
    "==================",
    " ALVIK KI-DEMO",
    "==================",
    "",
    "Perfekt",
    "kalibriert!"
])
sleep_ms(2000)

# LEDs Begrüßung
for _ in range(3):
    alvik.left_led.set_color(1, 1, 1)
    alvik.right_led.set_color(1, 1, 1)
    sleep_ms(300)
    alvik.left_led.set_color(0, 0, 0)
    alvik.right_led.set_color(0, 0, 0)
    sleep_ms(300)

# ==================== PHASE 1: LERNEN ====================
display_text([
    "LERNPHASE",
    "----------",
    "Zeige Farben:",
    "ROT   = ^",
    "GELB  = v",
    "GRUEN = >",
    "BLAU  = <"
])
sleep_ms(3000)

pattern_memory = []
last_color = None
no_color_counter = 0

while len(pattern_memory) < MAX_PATTERN_LENGTH:
    display_progress_bar(len(pattern_memory), MAX_PATTERN_LENGTH, "Lerne Farben...")
    
    # Nutze perfekt kalibrierte Farberkennung
    current_color = detect_color_calibrated(alvik)
    
    if current_color and current_color != last_color:
        pattern_memory.append(current_color)
        action = COLOR_ACTIONS[current_color]
        
        # LED-Feedback
        alvik.left_led.set_color(*action['led'])
        alvik.right_led.set_color(*action['led'])
        
        # Display-Anzeige
        display.fill(0)
        display.text(f"Farbe {len(pattern_memory)}/{MAX_PATTERN_LENGTH}", 10, 0, 1)
        display.text(current_color, 20, 20, 1)
        display.text(action['symbol'] * 5, 20, 35, 1)
        display.text(action['name'], 15, 50, 1)
        display.show()
        
        last_color = current_color
        no_color_counter = 0
        sleep_ms(1500)
        
        alvik.left_led.set_color(0, 0, 0)
        alvik.right_led.set_color(0, 0, 0)
    
    elif current_color is None:
        no_color_counter += 1
        if no_color_counter > 15:  # 1.5 Sekunden ohne Farbe
            last_color = None
            no_color_counter = 0
    
    sleep_ms(100)

# Gelerntes Muster anzeigen
display.fill(0)
display.text("Gelernt:", 0, 0, 1)
pattern_str = "".join([COLOR_ACTIONS[c]['symbol'] for c in pattern_memory])
x = (128 - len(pattern_str) * 8) // 2
display.text(pattern_str, x, 28, 1)
display.show()
sleep_ms(2000)

# ==================== PHASE 2: BESTÄTIGUNG ====================
blink_state = True
while not alvik.get_touch_ok():
    display.fill(0)
    if blink_state:
        display.text("Bereit!", 35, 15, 1)
        display.text("Druecke OK", 20, 35, 1)
    display.show()
    blink_state = not blink_state
    sleep_ms(500)

# ==================== PHASE 3: AUSFÜHREN ====================
display.fill(0)
display.text("START!", 40, 28, 1)
display.show()
sleep_ms(1000)

for i, color in enumerate(pattern_memory):
    action = COLOR_ACTIONS[color]
    
    display.fill(0)
    display.text(f"Schritt {i+1}/{len(pattern_memory)}", 10, 0, 1)
    done_pattern = "".join([COLOR_ACTIONS[c]['symbol'] for c in pattern_memory[:i+1]])
    display.text(done_pattern, 5, 20, 1)
    display.text(action['symbol'] * 3, 40, 35, 1)
    display.text(action['name'], 20, 50, 1)
    display.show()
    
    alvik.left_led.set_color(*action['led'])
    alvik.right_led.set_color(*action['led'])
    
    if color == 'RED':
        alvik.move(MOVE_DISTANCE, 'cm', blocking=True)
    elif color == 'YELLOW':
        alvik.move(-MOVE_DISTANCE, 'cm', blocking=True)
    elif color == 'GREEN':
        alvik.rotate(-ROTATION_ANGLE, 'deg', blocking=True)
    elif color == 'BLUE':
        alvik.rotate(ROTATION_ANGLE, 'deg', blocking=True)
    
    sleep_ms(300)
    alvik.left_led.set_color(0, 0, 0)
    alvik.right_led.set_color(0, 0, 0)

# ==================== ABSCHLUSS ====================
display_text(["", "  FERTIG!", "", "  Muster", "  ausgefuehrt!", "", "  :-)"])

for _ in range(5):
    alvik.left_led.set_color(0, 1, 0)
    alvik.right_led.set_color(0, 1, 0)
    sleep_ms(200)
    alvik.left_led.set_color(0, 0, 0)
    alvik.right_led.set_color(0, 0, 0)
    sleep_ms(200)

alvik.brake()
alvik.set_illuminator(False)
sleep_ms(5000)
display.fill(0)
display.show()

⚙️ Kalibrierung: Jeden Alvik individuell anpassen

⚠️ Wichtig: Die Farbsensoren sind nicht bei jedem Alvik identisch kalibriert. Wenn du das Mustererkennung-Programm auf einem anderen Alvik verwendest, können die gemessenen HSV-Werte leicht abweichen – und die Farberkennung funktioniert dann nicht mehr zuverlässig.

Das liegt daran, dass jeder Farbsensor kleine Fertigungsunterschiede hat. Farben werden dadurch mit leicht anderen HSV-Werten erkannt. Die Lösung: Du misst die Referenzwerte für deinen Alvik neu aus und passt die Bereiche in der Funktion detect_color_calibrated() entsprechend an.

So gehst du vor

  1. Lade das Kalibrierungs-Programm (unten) auf deinen Alvik
  2. Halte nacheinander jede Farbkarte (Rot, Gelb, Grün, Blau) unter den Sensor
  3. Notiere dir die angezeigten H-, S- und V-Werte für jede Farbe
  4. Passe die Bereiche in detect_color_calibrated() an deine gemessenen Werte an

Kalibrierungs-Programm

Dieses Programm misst kontinuierlich die HSV-Werte und gibt sie in der Konsole aus. Halte einfach eine Farbkarte unter den Sensor und lies die Werte ab:

from arduino_alvik import ArduinoAlvik
from time import sleep_ms

alvik = ArduinoAlvik()
alvik.begin()
alvik.set_illuminator(True)
sleep_ms(500)

print("Halte jetzt eine Farbkarte unter den Sensor...")
print("=" * 50)

while True:
    h_values, s_values, v_values = [], [], []

    for _ in range(5):
        r, g, b = alvik.get_color()
        h, s, v = alvik.rgb2hsv(r, g, b)
        h_values.append(h)
        s_values.append(s)
        v_values.append(v)
        sleep_ms(30)

    h = sum(h_values) / len(h_values)
    s = sum(s_values) / len(s_values)
    v = sum(v_values) / len(v_values)

    print(f"H={h:6.1f}  S={s:.2f}  V={v:.2f}")
    sleep_ms(500)

Beispiel: Werte anpassen

Angenommen, dein Alvik misst für Rot den Wert H=12.3, S=0.71, V=0.55 statt des kalibrierten H=5.1. Dann passt du den Bereich im Hauptprogramm so an:

# Vorher (Original-Kalibrierung):
if (h < 25 or h > 340) and 0.50 < s < 0.85 and 0.40 < v < 0.75:
    return 'RED'

# Nachher (an deinen Alvik angepasst):
# Dein gemessener Wert: H=12.3 → Bereich großzügig um diesen Wert legen
if (h < 30 or h > 340) and 0.50 < s < 0.85 and 0.35 < v < 0.75:
    return 'RED'
💡 Tipp: Miss jede Farbe mehrmals und notiere den Durchschnitt. Setze die Bereiche dann ±10-15 Einheiten um den gemessenen H-Wert. So bleibt die Erkennung auch bei leicht schwankendem Licht stabil.

🚀 Deine eigenen KI-Projekte mit dem Alvik

Jetzt wo du verstehst, wie Machine Learning funktioniert, kannst du eigene coole KI-Projekte umsetzen! Hier sind inspirierende Ideen:

🎮 Gesten-Steuerung

Trainiere den Alvik, verschiedene Hand-Gesten zu erkennen! Nutze den Abstandssensor und lass ihn lernen: Schnelle Bewegung = Vorwärts, Langsame = Stop, Auf-Ab = Drehen

🎵 Ton-Erkennung

Lass den Alvik auf Klatschen oder Pfeifen reagieren! Messe mit dem Mikrofon verschiedene Töne und lerne: 1x Klatschen = Start, 2x = Stop, Pfeifen = Drehen

🗺️ Labyrinth-Löser

Der Alvik lernt, wie man Labyrinthe löst! Speichere erfolgreiche Wege und lass ihn beim nächsten Mal den gelernten Weg fahren – wie ein GPS!

🌡️ Umwelt-Assistent

Mit BME680-Sensor: Lerne verschiedene Raum-"Zustände" (zu warm, zu kalt, gute Luft, schlechte Luft) und lass den Alvik entsprechend reagieren!

🎨 Künstler-Roboter

Lass den Alvik Muster auf Papier zeichnen! Lerne ihm verschiedene Bewegungssequenzen bei und er "malt" geometrische Formen automatisch

🏁 Rennstrecken-Lernen

Der Alvik fährt eine Strecke ab und lernt sie! Beim zweiten Durchgang fährt er schneller, weil er weiß wo die Kurven sind – wie Rennfahrer!

💭 Denk weiter: Was ist mit echter KI möglich?

Du hast jetzt die Grundlagen verstanden! In der echten KI-Welt werden ähnliche Prinzipien verwendet – nur viel komplexer:

  • 🚗 Selbstfahrende Autos lernen aus Millionen Kilometer Straßenfahrten
  • 🏥 Medizinische KI erkennt Krankheiten auf Röntgenbildern – trainiert mit tausenden Beispielen
  • ♟️ Schach-Computer lernen Strategien durch Millionen gespielte Partien
  • 🎬 Netflix & YouTube lernen deine Vorlieben und empfehlen passende Inhalte
  • 🌍 Klimamodelle lernen aus historischen Wetterdaten, um die Zukunft vorherzusagen

Mit dem Alvik hast du den ersten Schritt gemacht – wer weiß, vielleicht entwickelst du eines Tages die nächste bahnbrechende KI! 🚀

🎯

Challenge: Machine Learning verstehen

Teste dein Wissen über KI und Machine Learning!

📝 Quiz

Was ist der Hauptunterschied zwischen normaler Programmierung und Machine Learning?

💡 Experimentier-Challenge

Aufgabe: Überlege dir ein eigenes Muster mit den 4 Farben und lass den Alvik es lernen!

💡 Ideen zum Experimentieren:
  • Erstelle ein Muster, das den Alvik im Kreis fahren lässt
  • Lass ihn ein "L" oder "T" fahren
  • Kombiniere viele Vorwärts-Bewegungen mit nur einer Drehung
  • Was passiert mit 5x Rot? Probiere es aus!

✅ Selbsttest

Hake ab, was du gelernt hast:

Fortschritt: 0/3