Voice-Controlled LeKiwi Robot — Deployment Guide

View source on GitHub
Preset

Voice Control Your LeKiwi

Build a voice-controlled robot that understands natural language commands and moves in any direction — forward, backward, strafe, turn — just by speaking to it.

DevicePurpose
LeKiwi Kit3-wheeled Kiwi-drive chassis with 3× STS3215 smart servos
XIAO ESP32S3Motor controller — receives serial commands from the Pi 5
Pi 5 (8GB)Voice AI brain — runs wake word detection, STT, LLM, and TTS
reSpeaker Flex XVF38004-microphone array for far-field voice capture

What you'll get:

  • A robot you control hands-free with natural language
  • Wake word activation ("Hey Jarvis") — robot listens only when you call it
  • Groq-powered AI: Whisper (speech recognition) + Llama 3 (reasoning) + Orpheus (voice reply)
  • Kiwi-drive omnidirectional movement + emergency stop

Requirements: LeKiwi Kit · XIAO ESP32S3 · Pi 5 (8GB) · reSpeaker Flex XVF3800 · Speaker · Groq API key (free) · Internet access on Pi

1

Assemble Hardware

Before deploying any software, you need to physically build the robot.

Wiring
  1. Assemble the chassis — Follow the LeKiwi Assembly Tutorial to build the frame and mount the wheels/servos. Don't connect the servo bus to the XIAO yet — Steps 2 and 3 flash the ID setter firmware and assign servo IDs one at a time.
  2. Connect reSpeaker Flex — Plug the reSpeaker Flex into a USB port on the Raspberry Pi
  3. Connect XIAO ESP32S3 — Use a USB-C cable to connect the XIAO to the Raspberry Pi
  4. Connect speaker — Plug speakers into the Raspberry Pi's audio jack or USB port
Troubleshooting
IssueSolution
Servo not respondingComplete Steps 2 and 3 first: flash the servo ID setter firmware, then use the serial wizard to assign IDs 1, 2, and 3
Servo wiring confusionServo 1 = front wheel, Servo 2 = rear-left, Servo 3 = rear-right
USB device not detectedTry a different USB cable — some are power-only with no data lines
2

Flash Servo ID Setter

Flash the servo ID configuration firmware to your XIAO ESP32. This firmware assigns unique IDs (1, 2, 3) to your STS3215 servos through an interactive serial console in the next step.

Wiring
  1. Plug the XIAO ESP32 into your computer via USB-C
  2. Click Deploy to flash the firmware
  3. Proceed to Step 3 to set servo IDs
Troubleshooting
IssueSolution
Flash fails / device not detectedHold the BOOT button on XIAO, press RESET, then release BOOT
3

Set Servo IDs

Use the serial console to assign IDs to your servos one at a time. The firmware will guide you — connect each servo when prompted and press Enter.

Wiring
  1. Click Connect to open the serial console
  2. Connect ONE servo at a time to the XIAO servo bus when prompted:
    • FRONT wheel → ID 1
    • REAR-LEFT wheel → ID 2
    • REAR-RIGHT wheel → ID 3
  3. Use the Send Enter button or type in the input field and press Enter to proceed
  4. After all three IDs are set, power off and reconnect all servos
Troubleshooting
IssueSolution
No servo detectedCheck servo power wiring and try the Rescan button
Multiple servos detectedConnect only ONE servo at a time to the bus
ID setter shows nothingDisconnect and reconnect the XIAO USB, then click Connect again
4

Flash Motor Controller

Flash the motor controller firmware. This handles Kiwi-drive kinematics and listens for serial commands from the Raspberry Pi.

Verification

After flashing, the XIAO will boot and check for servos 1, 2, 3. The serial monitor (115200 baud) will show Servo 1 OK, Servo 2 OK, Servo 3 OK followed by System ready!.

Wiring
  1. Plug the XIAO ESP32 into your computer via USB-C
  2. Click Deploy to flash the firmware
  3. After flashing, reconnect the XIAO to the Raspberry Pi and power on the servos
Troubleshooting
IssueSolution
Flash fails / device not detectedHold the BOOT button on XIAO, press RESET, then release BOOT
Wrong USB port detectedUnplug other USB-serial devices and try again
Servos not found at bootCheck servo power. Run Steps 2-3 again if IDs aren't set
5

Deploy Voice Brain

Deploy the voice AI container to the Raspberry Pi on the robot (wake word + ASR + LLM + TTS all bundled in one image).

Troubleshooting
IssueSolution
Docker not installedRun curl -fsSL https://get.docker.com |​ sh on the Pi
Container exits immediatelydocker logs lekiwi-voice — usually a missing GROQ_API_KEY
Wake word never triggersMake sure reSpeaker is connected before deployment. The container auto-selects the microphone; check docker logs lekiwi-voice for the selected input device
Robot not movingMake sure the XIAO is connected to the Pi over USB-C and the motor controller firmware from Step 4 is running. The container auto-selects the ESP32 serial port
TTS / STT errorsGROQ_API_KEY is invalid, the Groq terms are not accepted, or the Pi cannot reach Groq
Deployment method
What you will be asked for(filled in the SenseCraft Solution app)
  • Groq API Key*

    Get a free API key at console.groq.com

5 more with defaults you can keep
  • Wake Worddefault hey jarvis
    6 options
    • · Hey Jarvis
    • · Alexa
    • · Hey Mycroft
    • · Hey Rhasspy
    • · Timer
    • · Weather

    Phrase used to wake the assistant. Changing this swaps the loaded openWakeWord model.

  • Wake Word Thresholddefault 0.03

    Detection sensitivity (0.01-0.5). Lower = more sensitive, higher = stricter.

  • Wake Word Cooldown (s)default 2

    Seconds to ignore further wake events after a successful trigger.

  • TTS Voicedefault autumn
    6 options
    • · Autumn
    • · Tara
    • · Leah
    • · Dan
    • · Mia
    • · Zac
  • LLM Modeldefault llama-3.1-8b-instant
    3 options
    • · Llama 3.1 8B Instant (fast)
    • · Llama 3.3 70B Versatile (smart)
    • · Mixtral 8x7B

    Groq-hosted model used to interpret commands. Larger models are smarter but slower.

6

Talk to Your Robot

Now that everything is running, test your voice-controlled robot.

Verification

  1. Stand within ~1 metre of the robot
  2. Say "Hey Jarvis" clearly — you should not hear a response yet (the robot is waiting for your command)
  3. After the wake word, say a command like:
    • "move forward"
    • "turn left"
    • "strafe right"
    • "what can you do?"
  4. The robot should respond verbally and then move
Troubleshooting
IssueSolution
Wake word never detectedSpeak clearly within 1m of the mic. Check docker logs lekiwi-voice and confirm the detected microphone is the reSpeaker device
Robot moves wrong directionVerify servo IDs 1, 2, 3 are assigned correctly and wheel angles are correct
Response is slowGroq API latency. First request may take 2-3 seconds; subsequent ones are faster
Container keeps restartingCheck logs: docker logs lekiwi-voice. Verify GROQ_API_KEY is valid
After Deployment

Your LeKiwi robot is now voice-controlled.

Command Reference

PhraseRobot Action
"move forward" / "go ahead"Forward nudge
"go back" / "reverse"Backward nudge
"turn left" / "rotate left"Turn left nudge
"turn right" / "rotate right"Turn right nudge
"strafe left" / "slide left"Strafe left nudge
"strafe right" / "slide right"Strafe right nudge
"keep going forward" / "continuously"Continuous movement (until stop)
"stop" / "halt" / "emergency"Emergency stop

Advanced Commands

The robot also responds to:

  • "what can you do?" — lists capabilities
  • "increase speed" / "decrease speed" — adjusts nudge parameters
  • Conversational queries — the LLM will chat naturally and reply via TTS

Next Steps

  • Adjust nudge duration/speed by editing device settings and re-deploying
  • Change TTS voice (Autumn, Tara, Leah, Dan, Mia, Zac) in device settings
  • Check docker logs lekiwi-voice if the wake word is hard to trigger; the log shows which microphone was auto-selected
  • LeKiwi Voice GitHub