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.
| Capability | What it does |
|---|---|
| Rear-wheel differential drive | Two N20 motors provide forward, reverse, and turning movement. |
| Front obstacle sensing | A CQRobot VL53L1X time-of-flight sensor monitors the path ahead. |
| Local autonomous roaming | The robot can slow, stop, reverse, and turn without waiting for Wi-Fi or an AI response. |
| NoIR camera | A Raspberry Pi Camera Module 3 NoIR provides the forward-facing eye and local camera capture. |
| LumaKit control | Natural-language Agent mode, deterministic Remote mode, Telegram, the web interface, or local commands. |
| Independent safety service | The hardware service owns motor watchdogs and sensors; LumaKit handles conversation and remote interaction. |
| Motion and tilt sensing | With the MSA311 upgrade: double-tap control, tilt safety, impact response, and gentle-tap interaction. |
| Status lighting | With 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
| Qty | Item |
|---|---|
| 1 | 3D-printed VISITOR LX-1 shell and chassis(white and purple) |
| 1 | Raspberry Pi 5, 2GB |
| 1 | Raspberry Pi 5 Active Cooler |
| 1 | Raspberry Pi 27W USB-C power supply |
| 1 | 32GB A2 V30 microSD card(preloaded with the Lumalien robot software) |
| 1 | Geekworm X1200 UPS HAT |
| 2 | Samsung 35E 18650 battery(matched pair, approved for the X1200) |
| 1 | Adafruit DC & Stepper Motor Bonnet(STEMMA QT / Qwiic) |
| 2 | N20 3–6V gear motor |
| 2 | 43 mm rubber wheel |
| 2 | N20 motor bracket |
| 1 | Front ball caster(screw hardware and adhesive both included) |
| 1 | Switched 4×AA battery holder(external motor power) |
| 1 | Raspberry Pi Camera Module 3 NoIR |
| 1 | Camera cable, Standard–Mini 200mm V2 |
| 1 | CQRobot VL53L1X distance sensor |
| 1 | 30×30×10 mm 5V shell fan |
| 1 | Labeled 4-wire I2C harness |
| 1 | STEMMA QT-to-header cable |
| 1 | 100 mm STEMMA QT cable |
| 1 | Fastener 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.
| Qty | Fastener | Use |
|---|---|---|
| 6 | M2.5 × 12 pan-head | Outer shell to chassis, inserted from underneath |
| 4 | M2.5 × 8 pan-head | Board stack to X1200 feet through the chassis floor |
| 2 | M2.5 × 8 pan-head | Rear motor-battery holder tabs to chassis |
| 4 | M2.5 × 6 pan-head | N20 motor brackets to chassis |
| 2 | M2.5 × 6 pan-head | VL53L1X sensor to front mount |
| 4 | M2 × 4 pan-head | NoIR camera board to camera case |
| 2 | M3 × 16 plus washers and nuts | Front 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.Inventory every board, printed part, cable, and fastener before opening the battery packaging.
- 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.Place the chassis with the front caster platform pointing away from you and the rear motor positions closest to you.
- 4.Keep the X1200, Pi, Motor Bonnet, sensors, and camera unpowered throughout assembly.
- 5.Dry-fit all cables before tightening parts. The motor leads and the 100 mm STEMMA QT cable have limited routing margin.
- 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
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.Position the caster beneath the front spacer with the ball facing the floor.
- 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.Install the nuts on the top side of the chassis and tighten until secure without crushing the printed spacer.
- 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.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
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.Identify the left and right motors from the robot's point of view.
- 2.Place each motor in its bracket with the output shaft pointing outward through the wheel opening.
- 3.Orient the motor leads toward the center electronics pit and toward the Motor Bonnet terminal edge.
- 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
Attach the motor brackets to the chassis
Hardware
4 × M2.5 × 6 pan-head screws — two per bracket.
- 1.Place each bracket on its rear chassis pad with the wheel shaft outside the chassis.
- 2.Route each motor lead through the nearby wire slot before tightening the bracket.
- 3.Start both screws by hand, then tighten them evenly.
- 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
Press the wheels onto the motor shafts
- 1.Align each wheel's D-shaped bore with the flat on the N20 motor shaft.
- 2.Support the opposite side of the motor shaft and press the wheel on straight.
- 3.Leave a small gap between the wheel and bracket so the rubber tire does not rub.
- 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
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.Install the X1200 beneath the Raspberry Pi 5 exactly as specified by the X1200 hardware, with its pogo-pin power interface correctly aligned.
- 2.Confirm the Pi sits squarely on the X1200 standoffs and no pogo pin is trapped or offset.
- 3.Seat the Motor Bonnet on the Pi GPIO header. Press evenly over the connector; do not rock the board side to side.
- 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.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
Secure the electronics stack in the center pit
Hardware
4 × M2.5 × 8 screws inserted from beneath the chassis.
- 1.Lower the complete stack into the center pit. The X1200 feet should align with the four chassis floor holes.
- 2.Make sure the X1200 power button aligns with the left-side notch and does not press against the pit wall.
- 3.Insert one screw loosely at each corner from underneath.
- 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
Connect the drive motors to the Motor Bonnet
- 1.Loosen the M1 and M4 motor-terminal screws just enough to accept the stripped leads.
- 2.Connect the left motor to M1.
- 3.Connect the right motor to M4.
- 4.Insert each conductor fully so no bare copper remains outside the terminal, then tighten the screws.
- 5.Gently tug each wire to confirm it is clamped.
- 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
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.Place the battery holder at the rear of the chassis and align its two mounting tabs.
- 2.Start both tab screws, then tighten until the holder is stable.
- 3.Route the battery lead toward the Motor Bonnet without crossing the wheels or pinching it under the shell.
- 4.Connect the red lead to + and the black lead to − on the Motor Bonnet's dedicated motor-power terminal.
- 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
Install the NoIR camera in the front eye mount
Hardware
4 × M2 × 4 pan-head screws.
- 1.Place the Camera Module 3 NoIR into the printed camera case with the lens centered in the round eye opening.
- 2.Make sure rear components and the ribbon connector sit inside the clearance pocket.
- 3.Start all four M2 screws before tightening. Tighten lightly and evenly.
- 4.Open the ribbon latch, insert the camera ribbon squarely, and close the latch.
- 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
Install the forward distance sensor
Hardware
2 × M2.5 × 6 pan-head screws.
- 1.Slide the CQRobot VL53L1X board into the front holder with the sensing element facing outward.
- 2.Align the two board holes with the 16 mm-spaced mount holes.
- 3.Install both screws from the exposed front pocket and tighten lightly.
- 4.Connect the labeled four-wire I2C harness to the sensor.
- 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
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.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.Secure the NeoSlider in the left-side bezel with the slider knob moving freely through its full travel.
- 3.Connect the labeled GPIO/I2C-to-STEMMA harness from the Pi pass-through header to the MSA311.
- 4.Connect a 100 mm STEMMA QT cable from the MSA311 to the NeoSlider.
- 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
Install and connect the cooling fan
- 1.Seat the fan in the front-right fan housing with airflow directed through the shell gills and across the Pi stack.
- 2.Secure the fan using the hardware supplied with the fan case.
- 3.Connect the fan to its designated Raspberry Pi fan power connection.
- 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
Connect the camera ribbon and I2C harnesses to the Pi
- 1.With the shell held beside the chassis, connect the camera ribbon to the designated Pi 5 CAM/DISP connector.
- 2.Connect the labeled I2C harness to the GPIO pass-through connection. Match 3.3V, GND, SDA, and SCL labels exactly.
- 3.Connect the VL53L1X four-wire harness to the same configured I2C bus through the supplied labeled adapter.
- 4.Confirm no connector is offset by one pin and no bare header contact can touch the shell.
- 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
Complete the unpowered wiring inspection
- 1.Confirm the left motor is on M1 and the right motor is on M4.
- 2.Confirm the red motor-battery lead is on + and the black lead is on −.
- 3.Confirm the Pi USB-C port is not connected to a charger or power supply.
- 4.Confirm the X1200, Pi, and Motor Bonnet are fully seated and mechanically retained.
- 5.Confirm the camera, distance-sensor, fan, and any upgrade cables are connected and strain-relieved.
- 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
Install batteries and perform a raised-wheel test
- 1.Install the matched 18650 cells in the X1200, following the polarity markings and X1200 instructions.
- 2.Install the AA cells in the external motor battery holder, following its polarity markings.
- 3.Place the chassis on a stand so both drive wheels are clear of the floor.
- 4.Power on using the X1200 control and allow the system to initialize.
- 5.Verify status, sensors, and motor direction as described in First startup and checks.
- 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
Fit and secure the outer shell
Hardware
6 × M2.5 × 12 pan-head screws inserted from underneath.
- 1.Shut the robot down fully and remove external charging power.
- 2.Arrange cables inside the shell so none cross a screw boss, wheel opening, fan path, or the X1200 button.
- 3.Lower the shell vertically onto the chassis. Do not force it; lift and reroute any wire that resists.
- 4.Confirm the camera, distance sensor, fan gills, USB service bay, and X1200 button remain aligned and unobstructed.
- 5.Turn the robot over on a soft surface and install all six shell screws loosely.
- 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.Place the robot on a clear, level floor away from stairs and edges.
- 2.For the first powered test, keep the drive wheels raised.
- 3.Confirm both wheels and the front caster move freely.
- 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.Use the X1200 power control. Do not power the Pi USB-C port.
- 2.Watch for the green startup pulse.
- 3.Allow roughly 15 to 30 seconds for services and sensors to initialize.
- 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 nmtuiChoose 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/statusReadiness 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.Use Remote mode or a short low-speed command with the wheels raised.
- 2.Command forward briefly. From the robot's point of view, both wheel surfaces should move rearward at the floor contact point.
- 3.Command reverse, then a short left and right turn.
- 4.Press STOP and confirm both motors coast.
- 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.Power the robot down fully before plugging anything in.
- 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.Plug a USB keyboard into one of the Pi's USB ports. A wireless keyboard with a USB receiver works too.
- 4.Power on with the X1200 control. The desktop or a login prompt appears on the monitor.
- 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
hostnameRun 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.42Replace 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.In Telegram, open a chat with @BotFather and send /newbot. Choose a display name and a username ending in “bot”.
- 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.Open a chat with @userinfobot and send any message. It replies with your numeric Telegram ID.
- 4.On the Pi, open the LumaKit environment file and add both values.
cd /home/lumabot21/lumakit
nano .envEdit 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.serviceRestart LumaKit so it picks up the new settings.
- 1.Open your new bot in Telegram and send it a message. It should reply.
- 2.Send /lumabot agent for natural-language control, or /lumabot remote for the deterministic command set.
- 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.
| Provider | LLM_PROVIDER | Key variable |
|---|---|---|
| Anthropic (Claude) | anthropic | ANTHROPIC_API_KEY |
| OpenAI | openai | OPENAI_API_KEY |
| xAI | xai | XAI_API_KEY |
| Local model on the Pi | ollama | None — 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 .envEdit 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.serviceRestart LumaKit so it picks up the new settings.
- 1.Message your bot on Telegram and send /lumabot agent.
- 2.Ask it something conversational — “How much battery is left?” — and confirm you get a written reply rather than an error.
- 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 agentTelegram 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 remoteTelegram Remote mode
| Command | Meaning |
|---|---|
| /lumabot drive forward | Move forward continuously until STOP or another movement replaces it. |
| /lumabot drive backward | Move backward continuously until STOP or another movement replaces it. |
| /lumabot drive forward 2 0.3 | Drive forward for 2 seconds at 30% throttle. |
| /lumabot turn left 1 0.3 | Turn left for 1 second at 30% throttle. |
| /lumabot turn right 1 0.3 | Turn right for 1 second at 30% throttle. |
| /lumabot turn around | Perform the configured turnaround. |
| /lumabot stop | Immediately request motor stop. |
| /lumabot park | Stop and return to the parked state. |
| /lumabot status | Read robot status. |
| /lumabot off | Leave 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:
| Action | Steps |
|---|---|
| Start | Place 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. |
| Stop | Wait at least 1.2 seconds after starting, then double-tap again. The indicator acknowledges and the motors coast to idle. |
| Safety behavior | Autonomy 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 offline | Requires 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 / pattern | Meaning |
|---|---|
| Green pulse | Starting up. |
| Green | Healthy battery / idle. |
| Green flash | Double-tap acknowledged. |
| Cyan | Autonomous driving active. |
| Purple pulse | LumaKit is thinking. |
| Pink | Gentle-tap / pet response. |
| Orange | Collision or impact detected. |
| Yellow | Tilt or other safety warning. |
| Red | Low 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 poweroffUse only the X1200 USB-C port
Never connect the charger to the Raspberry Pi USB-C port while the X1200 is installed.
- 1.Park the robot, stop all motion, and place it on a hard, dry, nonflammable surface.
- 2.Connect the approved charger to the X1200 USB-C charging port.
- 3.Keep the robot supervised and ensure ventilation openings remain clear.
- 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
| Problem | What to check |
|---|---|
| Robot does not move | Confirm 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 blocked | An 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 Telegram | Confirm 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 works | This 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 out | Confirm 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 monitor | Use 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 respond | Use 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 start | Read autonomy_blocked_reason. Common causes: stale distance data, unavailable distance or motion sensor, low battery, excessive tilt, or unavailable motors. |
| One wheel runs backward | Confirm 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 unavailable | Power down, reseat both ends of the ribbon in the correct orientation, inspect for creases or damage, and confirm camera_ready after reboot. |
| No status lighting | Check the MSA311-to-NeoSlider STEMMA QT chain, the GPIO/I2C harness, and indicator_ready. |
| Shell will not seat | Do 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 floor | Confirm 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-pagerUseful 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.serviceRestart 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.serviceUpdate 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/statusUpdate 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.
