Proxi AI — Spielzeug-Roboter mit natürlicher Sprache steuern

Firmware, Bluetooth-Brücke und Agent-Skill für den KOSMOS-Proxi: einmal
flashen, danach hört der Roboter über Bluetooth LE auf Textbefehle. Was die
Befehle schickt, ist ihm egal — ein Skript, ein curl, oder ein KI-Agent, der
aus "mach mal was Lustiges" eine Choreografie baut.

  firmware/   MakeCode-Projekt (TypeScript) und fertige .hex für V1 und V2
  bridge/     BLE-Brücke und HTTP-API, einzige Abhängigkeit ist bleak
  agent/      Skill-Definition: Alltagssprache -> Befehle
  tools/      Quelltext aus .hex extrahieren, Musik-Tabellen prüfen
  docs/       Protokoll, Einrichtung, Hardware, Lizenzen

Zwei Dinge, die sonst nirgends stehen und in docs/HARDWARE.md dokumentiert
sind: die Pin-Belegung des Roboters ist nicht öffentlich, sie wurde aus den
mitgelieferten .hex-Dateien rekonstruiert (tools/hex_source.py holt sie
heraus). Und der Ton braucht zwingend eine ganzzahlige Frequenz sowie Pin P0
— sonst kracht der Lautsprecher, der Aufruf hängt und die Bluetooth-
Verbindung stirbt.

Am echten Roboter durchgetestet: Verbindung, Sensoren, Display, 41 Sekunden
Musik am Stück, alle Bewegungsrichtungen, Musik und Fahren gleichzeitig,
Tanzfiguren, Not-Stopp mitten in der Bewegung, Autostart nach Neustart.

MIT-Lizenz. Die Hardware-Extension stammt von kaku111 (TobbieII) und die
Notendaten aus pxt-microbit, beide ebenfalls MIT — siehe THIRD-PARTY-NOTICES.
This commit is contained in:
2026-08-22 11:41:00 +00:00
commit 3905647b7f
26 changed files with 22414 additions and 0 deletions
+170
View File
@@ -0,0 +1,170 @@
# bigdance.txt — große Choreografie in vier Teilen, rund 30 Sekunden
#
# python3 proxi_bridge.py --script bigdance.txt
#
# ===========================================================================
# WIE SO EINE CHOREOGRAFIE GEBAUT WIRD
# ===========================================================================
#
# 1. MELODY blockiert die Tanzfiguren, MOVE und TURN nicht.
# DANCE, STAMP und SHAKE teilen sich mit MELODY einen Arbeiter und würden
# erst NACH der Musik loslaufen. Zur Musik getanzt wird deshalb mit MOVE und
# TURN — die starten sofort.
#
# 2. Melodien reihen sich von selbst aneinander.
# Schickt man MELODY:B während A läuft, wartet B und startet nahtlos,
# sobald A fertig ist. So entstehen mehrteilige Stücke.
#
# 3. Die Länge jeder Melodie ist bekannt — danach wird die Zeit eingeteilt:
# ENTERTAINER 3.4s | FUNK 4.0s | CHASE 8.0s | NYAN 16.0s
# Zusammen 31.4 Sekunden, die mit Bewegung gefüllt werden wollen.
#
# 4. WAIT ist immer rund 150 ms kürzer als die Bewegung davor.
# So lange braucht die Brücke selbst zwischen zwei Befehlen. Ohne diesen
# Abzug läuft der Tanz der Musik langsam davon.
#
# 5. Tanzschritte entstehen aus drei Bausteinen:
# Wackeln TURN:LEFT:220 / TURN:RIGHT:220 im Wechsel
# Stampfen MOVE:FWD:200 / MOVE:BWD:200 im Wechsel
# Kurve MOVE:FWD:0 plus TURN währenddessen, danach MOVE:STOP
# Kurze Zeiten wirken hektisch, lange gemütlich — das ist der Rhythmus.
#
# 6. Jeder Teil bekommt ein eigenes Gesicht. Das macht aus einer Bewegungsfolge
# eine Aufführung.
#
# 7. Am Ende immer STOP.
#
# Gleich viel vorwärts wie rückwärts halten — dann bleibt Proxi ungefähr
# da stehen, wo er losgetanzt ist, und fällt nicht vom Tisch.
#
FACE:ASLEEP
# --- TEIL 1: Aufwachen (Entertainer, 3.4s) ---
MELODY:ENTERTAINER
WAIT:250
FACE:SURPRISED
TURN:LEFT:300
WAIT:230
TURN:RIGHT:600
WAIT:550
TURN:LEFT:300
WAIT:230
WAIT:1240
# --- TEIL 2: Groove (Funk, 4.0s) ---
MELODY:FUNK
FACE:HAPPY
TURN:LEFT:420
WAIT:320
TURN:RIGHT:420
WAIT:320
TURN:LEFT:420
WAIT:320
TURN:RIGHT:420
WAIT:320
MOVE:FWD:500
WAIT:410
MOVE:BWD:500
WAIT:410
WAIT:700
# --- TEIL 3: Jagd (Chase, 8.0s) ---
MELODY:CHASE
FACE:SILLY
TURN:LEFT:200
WAIT:100
TURN:RIGHT:200
WAIT:100
TURN:LEFT:200
WAIT:100
TURN:RIGHT:200
WAIT:100
TURN:LEFT:200
WAIT:100
TURN:RIGHT:200
WAIT:100
TURN:LEFT:200
WAIT:100
TURN:RIGHT:200
WAIT:100
FACE:NORTH
MOVE:FWD:0
TURN:LEFT:700
WAIT:650
TURN:RIGHT:700
WAIT:650
MOVE:STOP
MOVE:BWD:900
WAIT:850
WAIT:2650
# --- TEIL 4: Finale (Nyan, 16.0s) ---
MELODY:NYAN
FACE:FABULOUS
MOVE:FWD:220
WAIT:130
MOVE:BWD:220
WAIT:130
MOVE:FWD:220
WAIT:130
MOVE:BWD:220
WAIT:130
FACE:HEART
TURN:LEFT:230
WAIT:140
TURN:RIGHT:230
WAIT:140
TURN:LEFT:230
WAIT:140
TURN:RIGHT:230
WAIT:140
TURN:LEFT:230
WAIT:140
TURN:RIGHT:230
WAIT:140
FACE:DIAMOND
MOVE:FWD:0
TURN:LEFT:1200
WAIT:1150
TURN:RIGHT:1200
WAIT:1150
MOVE:STOP
FACE:SILLY
TURN:RIGHT:180
WAIT:80
TURN:LEFT:180
WAIT:80
TURN:RIGHT:180
WAIT:80
TURN:LEFT:180
WAIT:80
TURN:RIGHT:180
WAIT:80
TURN:LEFT:180
WAIT:80
FACE:TARGET
MOVE:BWD:200
WAIT:110
MOVE:FWD:200
WAIT:110
MOVE:BWD:200
WAIT:110
MOVE:FWD:200
WAIT:110
FACE:FABULOUS
TURN:LEFT:260
WAIT:170
TURN:RIGHT:260
WAIT:170
TURN:LEFT:260
WAIT:170
TURN:RIGHT:260
WAIT:170
FACE:HEART
TURN:LEFT:1500
WAIT:1450
TURN:RIGHT:1500
WAIT:1450
STOP
FACE:HEART