← All manuals

VISITOR LX-1

User & Assembly Manual

Build, start, and operate the VISITOR LX-1 — a Raspberry Pi 5-powered, two-wheel differential-drive robot. Sixteen assembly steps from bare chassis to first drive.

Rev 1.0Updated August 3, 2026
Compute
Raspberry Pi 5, 2GB
Drive
Two-wheel differential
Assembly
16 steps
Power
Geekworm X1200 UPS

Section 01

Safety first

Critical power rule

Charge and power VISITOR LX-1 only through the Geekworm X1200 UPS USB-C port. Never apply power to the Raspberry Pi 5 USB-C port while the X1200 is installed.

  • Assemble, wire, charge, and service the robot with all power disconnected.
  • Raise the drive wheels off the floor for the first motor test and after any wiring change.
  • Operate only on a clear, level indoor floor. Keep away from stairs, table edges, water, loose cables, clothing, pets, feet, and fragile objects.
  • The forward distance sensor cannot see behind, beside, or below the robot. Obstacle avoidance reduces risk but does not make unsafe areas safe.
  • Do not pinch, sharply fold, or pull the camera ribbon or STEMMA QT cables.
  • Do not lift the shell until the Pi is fully shut down. Disconnect shell-mounted sensor cables before removing the shell completely.
  • Keep metal tools away from battery terminals and powered boards. Stop immediately if a cell, wire, connector, or board becomes hot, swollen, damaged, or smells unusual.
  • VISITOR LX-1 is an entertainment and learning robot — not a safety device, surveillance device, or unsupervised toy.

Emergency stop — any of the following:

  • Press the red STOP control in the web or Telegram remote.
  • Send /lumabot stop.
  • Ask Agent mode to stop.
  • From the Pi, send POST /stop to the local hardware service.

If software controls are unavailable, keep clear of the wheels and use the X1200 power control only when it is safe to do so.

Section 02

Meet VISITOR LX-1

VISITOR LX-1 is a Raspberry Pi 5-powered, two-wheel differential-drive robot designed for hands-on robotics, local autonomous movement, conversational control, and remote operation.

CapabilityWhat it does
Rear-wheel differential driveTwo N20 motors provide forward, reverse, and turning movement.
Front obstacle sensingA CQRobot VL53L1X time-of-flight sensor monitors the path ahead.
Local autonomous roamingThe robot can slow, stop, reverse, and turn without waiting for Wi-Fi or an AI response.
NoIR cameraA Raspberry Pi Camera Module 3 NoIR provides the forward-facing eye and local camera capture.
LumaKit controlNatural-language Agent mode, deterministic Remote mode, Telegram, the web interface, or local commands.
Independent safety serviceThe hardware service owns motor watchdogs and sensors; LumaKit handles conversation and remote interaction.
Motion and tilt sensingWith the MSA311 upgrade: double-tap control, tilt safety, impact response, and gentle-tap interaction.
Status lightingWith the NeoSlider upgrade: color and animation showing startup, battery, safety, autonomy, and AI activity.

How left and right are defined

All left/right references are from VISITOR LX-1's point of view while it faces forward. The camera, distance sensor, and front ball caster are at the front. The drive wheels, motors, and external motor battery holder are at the rear.

Section 03

Kit contents and tools

Inventory everything against this list before you start. It is much easier to find a missing bracket now than halfway through the stack.

What is in the box

QtyItem
13D-printed VISITOR LX-1 shell and chassis(white and purple)
1Raspberry Pi 5, 2GB
1Raspberry Pi 5 Active Cooler
1Raspberry Pi 27W USB-C power supply
132GB A2 V30 microSD card(preloaded with the Lumalien robot software)
1Geekworm X1200 UPS HAT
2Samsung 35E 18650 battery(matched pair, approved for the X1200)
1Adafruit DC & Stepper Motor Bonnet(STEMMA QT / Qwiic)
2N20 3–6V gear motor
243 mm rubber wheel
2N20 motor bracket
1Front ball caster(screw hardware and adhesive both included)
1Switched 4×AA battery holder(external motor power)
1Raspberry Pi Camera Module 3 NoIR
1Camera cable, Standard–Mini 200mm V2
1CQRobot VL53L1X distance sensor
130×30×10 mm 5V shell fan
1Labeled 4-wire I2C harness
1STEMMA QT-to-header cable
1100 mm STEMMA QT cable
1Fastener pack(see the fastener table below)

You supply

Four AA batteries for the external motor battery holder

Optional add-ons

These are not in the box, but the shell is printed with mounts for them — so you can fit them now or come back to them later.

  • Adafruit NeoSlider

    Adds the illuminated status indicator described in the status-light guide. The shell is printed with a left-side bezel for it.

  • Adafruit MSA311 triple-axis accelerometer (tap sensor)

    Adds double-tap autonomy, tilt safety, and impact response. STEMMA QT / Qwiic. The shell is printed with a roof cradle for it.

Tools you will need

  • Small Phillips screwdriver sized for M2, M2.5, and M3 screws
  • Small flat-blade screwdriver for the Motor Bonnet screw terminals
  • Needle-nose pliers or a small nut driver for the caster nuts
  • Nonconductive spudger or a fingernail for the camera-ribbon latches
  • Cable ties or reusable hook-and-loop straps for strain relief
  • Recommended: a micro-HDMI to HDMI cable and a spare monitor
  • Optional: a multimeter for polarity and continuity checks

Printed parts: main chassis plate, outer shell, rear battery holder, camera mount, distance-sensor mount, fan mount, MSA311 cradle, and NeoSlider bezel.

QtyFastenerUse
6M2.5 × 12 pan-headOuter shell to chassis, inserted from underneath
4M2.5 × 8 pan-headBoard stack to X1200 feet through the chassis floor
2M2.5 × 8 pan-headRear motor-battery holder tabs to chassis
4M2.5 × 6 pan-headN20 motor brackets to chassis
2M2.5 × 6 pan-headVL53L1X sensor to front mount
4M2 × 4 pan-headNoIR camera board to camera case
2M3 × 16 plus washers and nutsFront ball caster through the adjustable slots

A monitor makes this much easier

The Pi 5 uses micro-HDMI. A micro-HDMI to HDMI cable and any spare monitor let you watch the robot boot, join Wi-Fi, and read errors directly — well worth having for setup and for development afterwards.

Section 04

Before assembly

  1. 1.Inventory every board, printed part, cable, and fastener before opening the battery packaging.
  2. 2.Inspect printed holes and channels. Remove only loose strings or support residue; do not enlarge holes unless the revision instructions specifically require it.
  3. 3.Place the chassis with the front caster platform pointing away from you and the rear motor positions closest to you.
  4. 4.Keep the X1200, Pi, Motor Bonnet, sensors, and camera unpowered throughout assembly.
  5. 5.Dry-fit all cables before tightening parts. The motor leads and the 100 mm STEMMA QT cable have limited routing margin.
  6. 6.Use only light hand pressure on screws threaded into printed plastic. Stop when the part is secure — overtightening can strip the pilot hole or crack the boss.

Recommended build strategy

Build and test the chassis first, then build the shell module, connect the shell harnesses, and install the shell last. This keeps the wheels raised and gives direct access to every connector during testing.

Section 05

Step-by-step assembly

Sixteen numbered steps, in order, from the bare chassis to a closed shell. Work through them in sequence — several later steps depend on cable routing done earlier.

  1. 1

    Install the front ball caster

    The caster supports the nose while the rear wheels provide drive and steering.

    Two ways to mount it

    Use the 2 × M3 × 16 screws, washers, and nuts, or the included adhesive. Screws let you fine-tune ride height in the adjustable slots later; adhesive is faster and needs no tools.

    1. 1.Position the caster beneath the front spacer with the ball facing the floor.
    2. 2.For the screw mount: rotate the caster so two opposite mounting holes align with the adjustable chassis slots, then insert the screws through the caster and slots. Use the washers, because the slots are wider than an M3 screw shank.
    3. 3.Install the nuts on the top side of the chassis and tighten until secure without crushing the printed spacer.
    4. 4.For the adhesive mount: clean both surfaces, press the caster squarely onto the front spacer, and hold firm pressure for 30 seconds. Let it set before putting weight on the nose.
    5. 5.Spin the ball in every direction and confirm it does not rub the printed part.

    Check

    With the chassis on a flat surface, the caster and both drive wheels should be able to contact the floor without rocking.

  2. 2

    Mount the N20 motors in their brackets

    The rear-drive layout keeps most of the robot's weight over the powered wheels.

    Hardware

    Motor-to-bracket hardware supplied with the N20 brackets.

    1. 1.Identify the left and right motors from the robot's point of view.
    2. 2.Place each motor in its bracket with the output shaft pointing outward through the wheel opening.
    3. 3.Orient the motor leads toward the center electronics pit and toward the Motor Bonnet terminal edge.
    4. 4.Secure the motors in the brackets. Confirm the gearbox body is fully seated and cannot rotate.

    Check

    Both shafts should be level, parallel, and at the same height.

  3. 3

    Attach the motor brackets to the chassis

    Hardware

    4 × M2.5 × 6 pan-head screws — two per bracket.

    1. 1.Place each bracket on its rear chassis pad with the wheel shaft outside the chassis.
    2. 2.Route each motor lead through the nearby wire slot before tightening the bracket.
    3. 3.Start both screws by hand, then tighten them evenly.
    4. 4.Confirm the bracket sits flat on the printed pad and does not press against the center electronics pit.

    Check

    The motor leads must reach the Motor Bonnet without being pulled tight or crossing a wheel opening.

  4. 4

    Press the wheels onto the motor shafts

    1. 1.Align each wheel's D-shaped bore with the flat on the N20 motor shaft.
    2. 2.Support the opposite side of the motor shaft and press the wheel on straight.
    3. 3.Leave a small gap between the wheel and bracket so the rubber tire does not rub.
    4. 4.Rotate both wheels by hand and verify free movement.

    Caution

    Do not hammer the wheels onto the shafts or use the printed chassis as the reaction surface.

  5. 5

    Assemble the X1200, Raspberry Pi 5, and Motor Bonnet stack

    Stack order from bottom to top: X1200 UPS, Raspberry Pi 5, Adafruit Motor Bonnet.

    1. 1.Install the X1200 beneath the Raspberry Pi 5 exactly as specified by the X1200 hardware, with its pogo-pin power interface correctly aligned.
    2. 2.Confirm the Pi sits squarely on the X1200 standoffs and no pogo pin is trapped or offset.
    3. 3.Seat the Motor Bonnet on the Pi GPIO header. Press evenly over the connector; do not rock the board side to side.
    4. 4.Orient the stack so the Motor Bonnet screw terminals face the rear motors and the Pi USB/Ethernet ports face the chassis service opening.
    5. 5.Do not install the 18650 cells or connect any power yet.

    Check

    The three boards must be parallel, fully seated, and free of trapped wires.

  6. 6

    Secure the electronics stack in the center pit

    Hardware

    4 × M2.5 × 8 screws inserted from beneath the chassis.

    1. 1.Lower the complete stack into the center pit. The X1200 feet should align with the four chassis floor holes.
    2. 2.Make sure the X1200 power button aligns with the left-side notch and does not press against the pit wall.
    3. 3.Insert one screw loosely at each corner from underneath.
    4. 4.Tighten in a diagonal pattern only until the stack no longer shifts.

    Check

    The X1200 button should move freely and the Pi ports should remain centered in the side opening.

  7. 7

    Connect the drive motors to the Motor Bonnet

    1. 1.Loosen the M1 and M4 motor-terminal screws just enough to accept the stripped leads.
    2. 2.Connect the left motor to M1.
    3. 3.Connect the right motor to M4.
    4. 4.Insert each conductor fully so no bare copper remains outside the terminal, then tighten the screws.
    5. 5.Gently tug each wire to confirm it is clamped.
    6. 6.Route both leads away from wheel openings and sharp printed edges.

    Do not swap the terminals

    The software expects M1 as the left wheel and M4 as the right wheel. The left channel is inverted in software, so do not swap motor terminals merely because one wheel spins in the opposite electrical direction during a raw hardware test.

  8. 8

    Install and connect the external motor battery holder

    The AA battery holder supplies the Motor Bonnet's motor-power terminal independently of the Pi/X1200 supply.

    Hardware

    2 × M2.5 × 8 pan-head screws through the rear holder tabs.

    1. 1.Place the battery holder at the rear of the chassis and align its two mounting tabs.
    2. 2.Start both tab screws, then tighten until the holder is stable.
    3. 3.Route the battery lead toward the Motor Bonnet without crossing the wheels or pinching it under the shell.
    4. 4.Connect the red lead to + and the black lead to − on the Motor Bonnet's dedicated motor-power terminal.
    5. 5.Leave the AA cells out until the full wiring inspection is complete.

    Caution — polarity

    Red is positive and black is negative. Reverse polarity can damage the motor controller, so confirm both leads against the + and − markings on the Motor Bonnet before inserting batteries.

  9. 9

    Install the NoIR camera in the front eye mount

    Hardware

    4 × M2 × 4 pan-head screws.

    1. 1.Place the Camera Module 3 NoIR into the printed camera case with the lens centered in the round eye opening.
    2. 2.Make sure rear components and the ribbon connector sit inside the clearance pocket.
    3. 3.Start all four M2 screws before tightening. Tighten lightly and evenly.
    4. 4.Open the ribbon latch, insert the camera ribbon squarely, and close the latch.
    5. 5.Route the ribbon through the shell channel with a gentle bend and enough slack to connect to the Pi.

    Caution — ribbon orientation

    The exposed contacts must face the correct way at both ends. Check the contacts themselves rather than the cable color.

  10. 10

    Install the forward distance sensor

    Hardware

    2 × M2.5 × 6 pan-head screws.

    1. 1.Slide the CQRobot VL53L1X board into the front holder with the sensing element facing outward.
    2. 2.Align the two board holes with the 16 mm-spaced mount holes.
    3. 3.Install both screws from the exposed front pocket and tighten lightly.
    4. 4.Connect the labeled four-wire I2C harness to the sensor.
    5. 5.Route the harness through the open lower cable slot toward the Pi GPIO/I2C connection.

    Check

    The optical element must have a clear forward view. The plug and cable bend must not push the board out of its channel.

  11. 11

    Install the MSA311 and NeoSlider

    Upgrade step

    Skip this step if you did not order the MSA311 tap sensor and NeoSlider. The shell is printed with mounts for both, so you can add them at any time without reprinting anything.

    These two I2C devices provide motion sensing, physical interaction, and illuminated status feedback.

    1. 1.Secure the MSA311 in the roof cradle directly beneath the intended tap area. The board must have positive retention and must not be able to fall from the inverted mount.
    2. 2.Secure the NeoSlider in the left-side bezel with the slider knob moving freely through its full travel.
    3. 3.Connect the labeled GPIO/I2C-to-STEMMA harness from the Pi pass-through header to the MSA311.
    4. 4.Connect a 100 mm STEMMA QT cable from the MSA311 to the NeoSlider.
    5. 5.Dry-fit the cable route before tightening the shell hardware. Avoid tension at either connector.

    Check

    Before removing the shell later, unplug the STEMMA connectors instead of pulling on the cables.

  12. 12

    Install and connect the cooling fan

    1. 1.Seat the fan in the front-right fan housing with airflow directed through the shell gills and across the Pi stack.
    2. 2.Secure the fan using the hardware supplied with the fan case.
    3. 3.Connect the fan to its designated Raspberry Pi fan power connection.
    4. 4.Route the cable away from the camera opening, distance sensor, wheel openings, and shell screw bosses.

    Check

    The fan should spin freely by hand and its cable should not sit in the path of a shell screw boss.

  13. 13

    Connect the camera ribbon and I2C harnesses to the Pi

    1. 1.With the shell held beside the chassis, connect the camera ribbon to the designated Pi 5 CAM/DISP connector.
    2. 2.Connect the labeled I2C harness to the GPIO pass-through connection. Match 3.3V, GND, SDA, and SCL labels exactly.
    3. 3.Connect the VL53L1X four-wire harness to the same configured I2C bus through the supplied labeled adapter.
    4. 4.Confirm no connector is offset by one pin and no bare header contact can touch the shell.
    5. 5.Leave enough slack to raise the shell slightly for future service, but keep all wiring clear of the wheels.

    Caution

    Match the printed signal labels, not the wire colors. Cable colors are not a reliable guide to the pin map.

  14. 14

    Complete the unpowered wiring inspection

    1. 1.Confirm the left motor is on M1 and the right motor is on M4.
    2. 2.Confirm the red motor-battery lead is on + and the black lead is on −.
    3. 3.Confirm the Pi USB-C port is not connected to a charger or power supply.
    4. 4.Confirm the X1200, Pi, and Motor Bonnet are fully seated and mechanically retained.
    5. 5.Confirm the camera, distance-sensor, fan, and any upgrade cables are connected and strain-relieved.
    6. 6.Turn both wheels by hand and move the caster through its full range. No cable should move or rub.

    Check

    Do not install batteries or close the shell until every item above passes.

  15. 15

    Install batteries and perform a raised-wheel test

    1. 1.Install the matched 18650 cells in the X1200, following the polarity markings and X1200 instructions.
    2. 2.Install the AA cells in the external motor battery holder, following its polarity markings.
    3. 3.Place the chassis on a stand so both drive wheels are clear of the floor.
    4. 4.Power on using the X1200 control and allow the system to initialize.
    5. 5.Verify status, sensors, and motor direction as described in First startup and checks.
    6. 6.Power down fully before making any wiring correction.

    Caution

    Never insert, remove, or reverse cells while a charger or other power source is connected.

  16. 16

    Fit and secure the outer shell

    Hardware

    6 × M2.5 × 12 pan-head screws inserted from underneath.

    1. 1.Shut the robot down fully and remove external charging power.
    2. 2.Arrange cables inside the shell so none cross a screw boss, wheel opening, fan path, or the X1200 button.
    3. 3.Lower the shell vertically onto the chassis. Do not force it; lift and reroute any wire that resists.
    4. 4.Confirm the camera, distance sensor, fan gills, USB service bay, and X1200 button remain aligned and unobstructed.
    5. 5.Turn the robot over on a soft surface and install all six shell screws loosely.
    6. 6.Tighten the screws in an alternating pattern until the seam is even.

    Caution

    The shell carries wired components. Before lifting it during future service, raise it only enough to reach and disconnect the camera and sensor harnesses.

Section 06

First startup and checks

Prepare the test area:

  1. 1.Place the robot on a clear, level floor away from stairs and edges.
  2. 2.For the first powered test, keep the drive wheels raised.
  3. 3.Confirm both wheels and the front caster move freely.
  4. 4.Keep one hand near the STOP control, not near the wheels.

Connect a monitor for setup

Plug a micro-HDMI to HDMI cable from the Pi into a spare monitor before the first boot. You can watch the system come up, join Wi-Fi, and read any message directly — much easier than working blind, and it stays useful for development later.

Power on:

  1. 1.Use the X1200 power control. Do not power the Pi USB-C port.
  2. 2.Watch for the green startup pulse.
  3. 3.Allow roughly 15 to 30 seconds for services and sensors to initialize.
  4. 4.Confirm the robot settles to a healthy idle state before commanding movement.

Join your Wi-Fi network. On the Pi, the interactive network tool is:

sudo nmtui

Choose Activate a connection, select your network, and enter the password. The robot reconnects automatically on every future boot.

systemctl is-active lumabot.service lumakit.service
curl -fsS http://127.0.0.1:8971/status

Readiness check — both services should report active.

Expected readiness fields include motors, fresh distance data, battery monitoring, and the camera. The initial movement state should be idle with both motor values at zero.

First motor test:

  1. 1.Use Remote mode or a short low-speed command with the wheels raised.
  2. 2.Command forward briefly. From the robot's point of view, both wheel surfaces should move rearward at the floor contact point.
  3. 3.Command reverse, then a short left and right turn.
  4. 4.Press STOP and confirm both motors coast.
  5. 5.If one wheel is wrong, shut down fully and recheck the M1/M4 assignments before changing software configuration.

Section 07

Getting a terminal on the robot

The next few sections ask you to run commands on the Raspberry Pi. There are two ways in — plug a monitor into the robot, or connect over your network from another computer. Set up the monitor first; you will need it to find the robot on the network.

Option 1 — monitor and keyboard. The most reliable route, and the one to use for first boot:

  1. 1.Power the robot down fully before plugging anything in.
  2. 2.Connect a micro-HDMI to HDMI cable from the Pi's HDMI port to any monitor or TV. The Pi 5 has two micro-HDMI ports — use the one nearest the USB-C connector for the primary display.
  3. 3.Plug a USB keyboard into one of the Pi's USB ports. A wireless keyboard with a USB receiver works too.
  4. 4.Power on with the X1200 control. The desktop or a login prompt appears on the monitor.
  5. 5.Open a terminal window, or use the text console directly if the Pi boots to one.

The service bay stays reachable

The shell is printed with an opening for the Pi's ports, so you can plug in a display and keyboard without removing it.

Option 2 — SSH over your network. Once the robot is on Wi-Fi, you can work from your laptop with the shell closed and the robot on the floor. First, find its address from the monitor:

hostname -I
hostname

Run this on the robot. It prints the robot's IP address.

Then from any computer on the same network, open a terminal — Terminal on macOS and Linux, PowerShell or Windows Terminal on Windows — and connect as the lumabot21 user:

ssh lumabot21@192.168.1.42

Replace the address with the one hostname -I printed.

Accept the fingerprint prompt the first time and enter the password. If your network supports it, the name from the hostname command also works in place of the IP address — for example ssh lumabot21@lumabot.local — which saves you looking the address up again after a reboot.

If the connection is refused

SSH may not be switched on yet. On the robot, run sudo raspi-config, choose Interface Options, then SSH, and enable it. Or enable it directly with sudo systemctl enable --now ssh.

Change the password

If the robot still uses its factory password, change it now with the passwd command — especially before enabling SSH on a shared or public network.

Section 08

Connecting Telegram

Telegram is the easiest way to talk to VISITOR LX-1 from your phone. You create a private bot, authorize your own account, and LumaKit does the rest.

You will need the robot on your Wi-Fi network and a terminal on the Pi — see Getting a terminal on the robot if you have not set that up yet.

  1. 1.In Telegram, open a chat with @BotFather and send /newbot. Choose a display name and a username ending in “bot”.
  2. 2.BotFather replies with an API token that looks like 1234567890:ABC-DEF1234ghIkl-zyx57W2v1u123ew11. Keep it private — anyone with the token can control your bot.
  3. 3.Open a chat with @userinfobot and send any message. It replies with your numeric Telegram ID.
  4. 4.On the Pi, open the LumaKit environment file and add both values.
cd /home/lumabot21/lumakit
nano .env

Edit the LumaKit .env file

TELEGRAM_BOT_TOKEN="1234567890:your-token-here"
TELEGRAM_ALLOWED_IDS="your_numeric_id"

Add these two lines, then save with Ctrl+O and exit with Ctrl+X.

The first ID is the owner

TELEGRAM_ALLOWED_IDS is a comma-separated list. The first ID in the list is the owner and is the only account that can start autonomous mode, reboot, power off, and manage other users.

sudo systemctl restart lumakit.service
systemctl is-active lumakit.service

Restart LumaKit so it picks up the new settings.

  1. 1.Open your new bot in Telegram and send it a message. It should reply.
  2. 2.Send /lumabot agent for natural-language control, or /lumabot remote for the deterministic command set.
  3. 3.Send /lumabot status to confirm the bot can reach the robot hardware.

Adding other people:

  • Add their numeric IDs to TELEGRAM_ALLOWED_IDS, separated by commas, and restart LumaKit.
  • Or have them message the bot and approve them at runtime with /adduser.
  • Use /role to set what each person is allowed to do. Authorized users are stored in .lumakit/telegram_users.json.
  • Everyone gets their own conversation history and preferences.

Voice messages

Voice notes are transcribed locally and spoken replies use Edge-TTS. Both need the speech extra installed — see the LumaKit repository for the ffmpeg and whisper.cpp setup.

Keep control of your bot

Only add IDs you recognize. Anyone authorized in TELEGRAM_ALLOWED_IDS can drive the robot and see its camera.

Section 09

Setting your AI API key

Agent mode — the natural-language side of VISITOR LX-1 — is powered by a language model. You choose the provider and supply your own API key, so the robot talks to the model you pay for and nobody else's.

You can skip this and come back

Remote mode, driving, obstacle avoidance, and every safety behavior work without an API key. Only Agent mode — free-form conversation — needs one.

LumaKit supports both hosted providers and a local model running on the robot. The Raspberry Pi 5 has limited memory, so a hosted provider gives much better results; keep the local option for offline experiments.

ProviderLLM_PROVIDERKey variable
Anthropic (Claude)anthropicANTHROPIC_API_KEY
OpenAIopenaiOPENAI_API_KEY
xAIxaiXAI_API_KEY
Local model on the PiollamaNone — set OLLAMA_MODEL instead

Create an API key in your provider's console, then add it to the same LumaKit environment file you used for Telegram:

cd /home/lumabot21/lumakit
nano .env

Edit the LumaKit .env file

LLM_PROVIDER="anthropic"
LLM_MODEL="claude-opus-5"
ANTHROPIC_API_KEY="your-key-here"

Example — Anthropic. Save with Ctrl+O, exit with Ctrl+X.

LLM_API_KEY works in place of the provider-specific variable if you prefer a single name. You can also set LLM_FALLBACK_MODEL to name a second model to try if the first is unavailable.

sudo systemctl restart lumakit.service
systemctl is-active lumakit.service

Restart LumaKit so it picks up the new settings.

  1. 1.Message your bot on Telegram and send /lumabot agent.
  2. 2.Ask it something conversational — “How much battery is left?” — and confirm you get a written reply rather than an error.
  3. 3.If the reply never arrives, check the troubleshooting table at the end of this manual.

Treat the key like a password

Anyone with your API key can spend against your account. Keep the .env file on the robot, never commit it to a repository, and rotate the key in your provider's console if you think it has been exposed.

Switching to a local model

Set OLLAMA_LOCAL_MODEL to a model installed on the Pi, and the Telegram owner can toggle to it at any time with /model local on. Responses stay entirely on the robot, at the cost of speed and quality.

Section 10

Controlling VISITOR LX-1

/lumabot agent

Telegram Agent mode

Use natural language, such as “Move forward slowly for two seconds,” “Turn left, then drive forward,” or “How much battery is left?” Starting autonomous mode, rebooting, and fully powering off require owner confirmation, and only the configured owner can operate physical controls.

/lumabot remote

Telegram Remote mode

CommandMeaning
/lumabot drive forwardMove forward continuously until STOP or another movement replaces it.
/lumabot drive backwardMove backward continuously until STOP or another movement replaces it.
/lumabot drive forward 2 0.3Drive forward for 2 seconds at 30% throttle.
/lumabot turn left 1 0.3Turn left for 1 second at 30% throttle.
/lumabot turn right 1 0.3Turn right for 1 second at 30% throttle.
/lumabot turn aroundPerform the configured turnaround.
/lumabot stopImmediately request motor stop.
/lumabot parkStop and return to the parked state.
/lumabot statusRead robot status.
/lumabot offLeave robot-control mode.

Remote mode is deterministic and does not send free-form text, voice, or photos to an AI. Continuous movement is protected by renewable three-second motor-safety leases.

Web controls:

  • Open the configured LumaKit web address. The reference installation uses port 7865.
  • Select VISITOR LX-1 Agent for natural-language control, or VISITOR LX-1 Remote for direct controls.
  • In Remote mode, use the D-pad, speed control, and turn-duration setting.
  • Forward and reverse remain active until replaced or stopped.
  • The red STOP button bypasses the AI and can interrupt an active Agent turn.

Physical double-tap autonomy — with the MSA311 upgrade fitted:

ActionSteps
StartPlace VISITOR LX-1 in a safe open area. Tap the chassis twice distinctly within 700 ms. A green acknowledgement flash appears, followed by cyan while autonomous mode is active.
StopWait at least 1.2 seconds after starting, then double-tap again. The indicator acknowledges and the motors coast to idle.
Safety behaviorAutonomy will not start if required motor, distance, motion, or battery data is unavailable, the battery is critically low, or the robot is excessively tilted.
Still works offlineRequires network or internet
Obstacle avoidance, battery monitoring, motor watchdogs, the local hardware API, and — with the upgrades fitted — double-tap autonomy, tilt and impact safety, and status lighting.Hosted AI responses, Telegram, Edge TTS, remote web access from another device, and software downloads and updates.

Section 11

Status-light guide

The illuminated indicator comes with the NeoSlider upgrade.

Color / patternMeaning
Green pulseStarting up.
GreenHealthy battery / idle.
Green flashDouble-tap acknowledged.
CyanAutonomous driving active.
Purple pulseLumaKit is thinking.
PinkGentle-tap / pet response.
OrangeCollision or impact detected.
YellowTilt or other safety warning.
RedLow or critical battery.

Priority rule

Safety colors override personality and activity colors. Stop movement and check status whenever the indicator is yellow, orange, or red.

Section 12

Charging, shutdown, and storage

Safe shutdown:

  • In Agent mode, ask VISITOR LX-1 to power off and approve the owner confirmation.
  • From the Pi terminal, run sudo poweroff.
  • Wait until the Pi LEDs turn off, the fan stops, and the X1200 cuts power.
  • Do not remove the shell, disconnect wiring, or handle cells until shutdown is complete.
sudo poweroff

Use only the X1200 USB-C port

Never connect the charger to the Raspberry Pi USB-C port while the X1200 is installed.

  1. 1.Park the robot, stop all motion, and place it on a hard, dry, nonflammable surface.
  2. 2.Connect the approved charger to the X1200 USB-C charging port.
  3. 3.Keep the robot supervised and ensure ventilation openings remain clear.
  4. 4.Disconnect the charger before opening the shell or servicing wiring.

Storage:

  • Store powered off in a cool, dry indoor location.
  • Keep weight off the camera, sensor pocket, and shell.
  • Do not store where the robot can roll or fall.
  • Inspect batteries and wiring before use after extended storage.

Section 13

Troubleshooting

ProblemWhat to check
Robot does not moveConfirm STOP is released; motors_ready is true; distance data is ready and fresh; battery is available; the robot is not tilted; M1/M4 wires are secure; external motor batteries are installed correctly.
Forward movement is blockedAn obstacle may be 230 mm or closer, or distance data may be missing or stale. Clear the path and read status.
Bot does not reply on TelegramConfirm the robot is on Wi-Fi, TELEGRAM_BOT_TOKEN is correct and quoted, your ID is in TELEGRAM_ALLOWED_IDS, and lumakit.service is active after a restart.
Agent mode errors but Remote mode worksThis is the AI provider, not the robot. Check LLM_PROVIDER matches the key you set, the key is quoted and unexpired, the model name in LLM_MODEL is spelled correctly, and your provider account has credit. Restart lumakit.service after any change.
SSH connection refused or times outConfirm the robot and your computer are on the same network, the address from hostname -I is current (it can change after a reboot), and SSH is enabled — sudo raspi-config, Interface Options, SSH. Connect a monitor to check if you cannot reach it at all.
Nothing on the monitorUse the micro-HDMI port nearest the USB-C connector, connect the cable before powering on, and confirm the monitor is on the right input. A micro-HDMI to HDMI cable is required — a full-size HDMI cable with an adapter is a common failure point.
Double-tap does not respondUse two distinct taps within 700 ms. Wait at least 1.2 seconds before attempting the stop gesture. Check motion_ready and last_gesture.
Autonomous mode will not startRead autonomy_blocked_reason. Common causes: stale distance data, unavailable distance or motion sensor, low battery, excessive tilt, or unavailable motors.
One wheel runs backwardConfirm the left motor is on M1 and the right motor is on M4. Remember M1 is inverted in software. Do not change wiring while powered.
Camera unavailablePower down, reseat both ends of the ribbon in the correct orientation, inspect for creases or damage, and confirm camera_ready after reboot.
No status lightingCheck the MSA311-to-NeoSlider STEMMA QT chain, the GPIO/I2C harness, and indicator_ready.
Shell will not seatDo not force it. Check cable routing, the X1200 button notch, battery holder position, board-stack seating, and all shell-mounted connectors.
Robot rocks on a flat floorConfirm wheel seating and caster position, and adjust the caster in its slots until all three contact points meet the floor.
curl -fsS http://127.0.0.1:8971/status
curl -fsS -X POST http://127.0.0.1:8971/stop
sudo systemctl status lumabot.service
sudo systemctl status lumakit.service
sudo journalctl -u lumabot.service -n 100 --no-pager
sudo journalctl -u lumakit.service -n 100 --no-pager

Useful service commands

Section 14

Advanced service commands

For builders and maintainers. This section is not required for normal use. Raise the wheels or otherwise prevent movement before restarting services or updating software.

sudo systemctl restart lumabot.service
sudo systemctl restart lumakit.service

Restart services — restarting the hardware service coasts the motors.

sudo systemctl stop lumakit.service
cd /home/lumabot21/lumakit
git status
git switch main
git pull --ff-only
.venv/bin/python -m pip install -e '.[speech]'
.venv/bin/python -m pytest -q
sudo systemctl restart lumakit.service
systemctl is-active lumakit.service

Update LumaKit

sudo systemctl stop lumabot.service
cd /home/lumabot21/lumabot
git status
git pull --ff-only
.venv/bin/python -m unittest discover -s tests -v
sudo systemctl restart lumabot.service
curl -fsS http://127.0.0.1:8971/status

Update the hardware service

Do not deploy blindly

Do not install or deploy an unreviewed update while VISITOR LX-1 is free to move.

Why the commands still say lumabot

Identifiers such as lumabot.service and /lumabot are software commands, not product names. They are preserved as-is so they keep working across releases.

Something not matching up?

If a part is missing, damaged, or your kit does not match a step, stop and get in touch before continuing.