Kyber Echo is the sound board inside your droid. It stores your sound library and controls when each sound plays. It can play up to three sounds at once: drive-motor audio, dome-movement audio, and user-triggered effects. The lights and jaw can also move in sync with playback.
You control Kyber Echo from your radio and configure it through a web interface hosted by the droid. No app, cable, or disassembly is required. This guide explains each page of the interface and every available setting.
You need three things. No tools are required.
A new droid does not yet know your Wi-Fi network name or password, so it cannot connect to your network. Instead, it creates its own temporary Wi-Fi network for the initial setup.
ECHO_xxxx
Join it as you would any other Wi-Fi network. The password is 12345678 unless you have changed it. The four characters at the end distinguish your droid from other nearby droids.
192.168.4.1 in your browser
Type it into the address bar exactly as written. The web interface loads.
Once you are connected, the address shown on the droid's screen is always the current one. When in doubt, read it there.
The web interface has seven pages, listed on the left. You will use a few of them regularly; the others usually require only initial configuration.
| Page | What it is for |
|---|---|
| Dashboard | The droid's current state, plus updates, backups, and restart. |
| Channels | Which control on your radio does what. Set up once, early on. |
| Sounds | Which sound plays when. The page you will return to most often. |
| Jaw Servo | If your droid has a moving jaw, how it follows the voice. |
| SD Card | Your sound library — add, listen, rename, remove. |
| Network | Wi-Fi and how to join yours — the next section. |
| Logs | The droid's own messages. Worth checking when something is not behaving. |
The top bar contains a light/dark switch and, when a newer software version is available, a small update badge. The bar appears on every page.
This step is optional but recommended at home. Once the droid joins your Wi-Fi, you can reach the web interface without disconnecting from your network. When your network is unavailable, the droid falls back to its own Wi-Fi network. No manual switching is required.
Open the Network page. It is in three parts.
Shows the current network, address, and signal strength. Check here first whenever the web interface is difficult to reach.
192.168.4.1 may no longer apply. Read the current address on the droid's screen before opening the web interface again.
Changes the name and password of the droid's own network. Leave the name blank to keep the automatic ECHO_xxxx. The password must be at least 8 characters; leaving it blank creates an open network. Changes to the name or password take effect only after the droid restarts. Until then, the current name and password remain active.
12345678, so anyone nearby who knows the default could access the web interface. Set a unique password during the initial setup.
Upload your sound files before configuring the Sounds page. The web interface accepts both MP3 and WAV files.
Open SD Card. Drag files onto the upload area, or select the area to browse. You can upload multiple files at once. MP3 and WAV files are converted to the required playback format during upload.
Every sound is identified by a number from 001 to 999, which you will select later on the Sounds page. You can add a descriptive name after the number. The droid ignores the descriptive part, but it makes the file list easier to read.
Filenames must begin with exactly three digits. A filename without a number is ignored. If it begins with four digits, the droid reads only the first three and may assign the file to the wrong number. For example, 0001.wav is read as 000, which cannot be selected on the Sounds page.
Each file offers two ways to hear it, and the difference matters:
| Button | What you hear |
|---|---|
| Play on device | Plays through the droid's speaker. Use this to judge how the sound will be heard from the droid. |
| Preview | Plays through your browser and speakers. Use this to identify files quickly; playback may sound different on the droid. |
| Rename | Changes the number used to identify the sound. See the warning below. |
| Delete | Deletes one file, or several selected files at once. |
Every sound plays the same way when a button calls it. What the Role column decides is what else happens while it plays — whether the mouth moves, whether the eye blinks, and whether the sound gets a channel of its own. Each file has one role, and only one.
| Role | What the sound does |
|---|---|
| — | Plays, and nothing else moves. This is what every file starts as. |
| Voice | Moves the jaw in time with the speech in it. Picking this measures the file first — see Jaw servo. |
| PSI | Blinks the PSI eye, brightness following the sound. Meant for beeps, whistles, and chatter. |
| Music | Plays on its own channel, so it keeps going while the droid beeps and talks over it. |
Everything else on the droid shares a single channel: one sound at a time, and a new one cuts off whatever was playing. That is why a long song needs the Music role — set to anything else, the first beep would cut it short.
Rolling to a child with a birthday song playing, beeping as you go.
200_Birthday.wav009_Beep.wav001_Hello.wavA file with no three-digit number shows a dash instead of a selector. The droid tracks roles by sound number, so 042_Leia.wav can have one and leia.wav cannot.
012_Beep.wav to 031_Beep.wav, every button assigned to 012 will play another file at 012 or nothing at all. Decide on your numbering early and keep it consistent. Renaming also clears that file's Role, since the role and the measurement behind it described the old recording.
Check the filename first. The droid reads the first three characters, and all three must be digits. 001.wav is valid; 0001.wav is read as 000, which cannot be assigned to a button. The file remains visible in the list but cannot be played from the Sounds page.
Files uploaded through the web interface are converted automatically to the format required by the droid. This conversion does not normalize their perceived loudness. Files copied directly to the card with a card reader are not converted, so they are more likely to cause format-related playback problems.
Your radio sends the droid a set of numbered channels. Use this page to assign each channel to the control it carries.
Correct channel assignments are required before the remaining controls can work. The process usually takes about a minute.
| Set this | To the channel that carries… |
|---|---|
| Speed Channel | Your drive stick. The rolling sound rises and falls with it. |
| Dome Movement | Your dome control, with its own sound doing the same. |
| Effect 1 / 2 / 3 Button | A switch or button you want to trigger sounds with. Each one gives you two triggers; see Sounds. |
| Effects / Rolling / Dome Volume | A knob or slider, one per family of sounds. Assign at least one because the web interface has no volume control. You can assign the same channel to all three so that one knob controls every sound. |
| Kyberpad | Kyberpad, if you use it. Its card is at the bottom of this page, and it needs a second channel for the page switch. |
Do not work this out on paper. Every card on this page shows its channel moving in real time, so the reliable method is to pick a channel, move the control, and watch.
If no channel makes the bar move, stop testing channels and check the badge at the top right of the page. It shows whether the droid is receiving a radio signal. Channel selection cannot work while the badge is red.
Your drive stick is on channel 1, and you have a two-way switch on channel 4 you want to trigger sounds with.
Push the drive stick and the Speed bar sweeps. Flick the switch and the Effect 1 bar jumps to one side, then the other. That is all this page needs.
A volume knob works on sounds already playing. Turn it down halfway through a line and you hear that line fade, not the next one.
Kyberpad is optional, but it increases the number of available triggers from six to forty-five. If you do not use it, skip ahead; the three effect switches work independently, and the rest of the guide applies in the same way.
Kyberpad is a keypad that runs on the radio itself, with fifteen keys on each of three pages. The droid sees only the channel produced by Kyberpad, so configure the radio first and the droid second. Assign sounds to the keys afterward on the Sounds page.
On the radio. Configure two outputs, each on its own channel:
In the web interface. The Kyberpad card at the bottom of this page needs the two channels you just configured and the number of pages you use. The remaining fields are live indicators and do not require input.
Press a key on the radio and watch the badge. It should name the key you actually pressed, on the page you are actually on. If it does, the setup is correct and everything that follows is a matter of choosing sounds. If it does not, nothing further will work: resolve it before moving on.
The web interface detects duplicate channel assignments. If Kyberpad shares a channel with a switch, knob, or its own page switch, an amber message identifies both controls so you can correct the conflict.
The Advanced section contains the values the droid expects from each key. It matches the default Kyberpad configuration. Change these values only if you have deliberately modified them on the radio. If they no longer match, select Restore Kyberpad defaults to restore the default values.
The Sounds page determines which sound plays for each input. The tabs across the top represent the three Kyberpad pages, plus Effects for sounds triggered directly by the radio.
The settings on the Channels page determine how many Kyberpad tabs appear. If no Kyberpad channel is assigned, no page tabs appear. If a Kyberpad channel is assigned without a page-switch channel, only Page 1 appears and the Pages field remains disabled. Assign both channels to display the number of pages selected on the Channels page: one, two, or three.
Fifteen rows, one per key, in the same order as the keys on your radio screen. Three things to fill in:
| Column | What to put in it |
|---|---|
| Label | A name for your own use. The droid ignores it, but matching the label on the radio makes both screens easier to recognize later. |
| Sound Min / Sound Max | The range of sounds available to this key. Enter the same number in both fields to play one fixed sound every time. |
| Random | When off, the key steps through its range in order. When on, it shuffles the range and plays every sound once before repeating any of them. |
You have five whistles, uploaded as files 010 to 014, and you want key 3 to pick one at random each time.
Tap key 3 five times and you hear all five whistles, in some order, with no repeats. On the sixth it shuffles and starts over.
Next to the tabs there is a Stop Button box: the number of the key, 1 to 15, that silences playback instead of playing a sound. Each page has its own, and 0 means that page has no stop key. The row you choose is marked STOP in the table.
It stops the sound that is playing and any music running alongside it. It leaves the rolling and dome sounds alone — those follow your sticks, and would start again the instant you touched one.
All sounds triggered directly by the radio are configured here: the rolling and dome sounds, plus the three effect switches. Kyberpad adds to these controls rather than replacing them. If you do not use Kyberpad, this tab contains all of your sound assignments. Cards appear only for controls assigned on the Channels page.
| Card | What you set |
|---|---|
| Rolling Sound | The sound that runs while driving, and how it behaves. The Min values apply at a standstill, the Max values at full speed. |
| Dome Sound | The same idea, driven by the dome instead. |
| Sound Effect 1 / 2 / 3 | Two rows each: Button 1 for pushing the switch one way, Button 2 for the other. Same three columns as a Kyberpad page. |
Rolling Sound and Dome Sound are the two cards with sliders. Each selects one file and loops it while its control is active, adjusting the volume and pitch within the ranges you set. Both cards use the same four sliders.
| Slider | What it does |
|---|---|
| Volume Min | The volume when the control first leaves center. Use a low value for a quiet start or a high value for an immediate, prominent sound. |
| Volume Max | How loud at full travel. Everything between the two is spread evenly across the stick, so the gap between them is the effect: a wide gap sounds like effort building, and the same value in both gives a sound that never changes. |
| Pitch Min / Max | The pitch range. 1.0 plays the file as recorded. Lower values slow and deepen the sound; higher values speed it up and raise its pitch. The range is 0.50 to 1.50, or half to 1.5 times the original speed. |
Play sends the chosen file to the droid so you can hear it without touching the radio. The button turns into Stop while it runs, and pressing it again silences it.
Narrow ranges sound more mechanical; wider ranges create a more exaggerated, cartoon-like effect. Choose the style that fits your droid.
The dome reaches maximum volume at about half travel, while the drive stick reaches it at full travel. This makes the dome respond quickly to short movements. Both sounds ignore direction: forward and backward, or clockwise and counterclockwise, produce the same result. Both sounds fade instead of stopping abruptly.
The effect cards work differently. Each card has two rows, allowing three switches to provide six triggers. The center position does nothing, so a spring-loaded switch is a good fit.
Some radios can map a three-position channel to two push buttons installed in the radio's case, one for each row of the card. The droid still sees one channel with three states, with the center position representing no button press.
Spring-loaded push buttons can be more convenient for triggering sounds because they return to the center position automatically.
One switch, two results: flick it down for a single scream, flick it up for one of three laughs.
The last card on the Effects tab plays one sound shortly after you power the droid up. Pick a sound, say how long to wait, and that is the whole setting. Choose the dash to turn it off again.
The delay is counted from the moment the droid has finished waking up, not from the moment you flip the switch. This matters if your droid joins your home Wi-Fi, because it takes considerably longer to get ready then. Counted from power-on, the same setting would fire immediately at home and after the full wait in the field. Counted from the end of startup, five seconds means five seconds in both places.
A short greeting a couple of seconds after the droid comes to life.
The sound's Role applies here as everywhere else: give it Voice and the jaw moves as it greets you, give it PSI and the eye flashes along. The volume knob on your radio applies too — with the radio switched off, the startup sound comes out at half volume, so a droid switched on indoors does not announce itself at full blast.
Anything you do yourself cancels it. Press a Kyberpad key, flick an effect switch or play a sound from the web interface while the droid is still counting down, and the startup sound is dropped rather than cutting across you. Once it has started, the usual rule takes over: your key press interrupts it, like any other sound.
If your droid has a moving jaw, this feature opens and closes it in time with speech. You choose which sounds it speaks along with, then set how far the jaw travels and how it moves.
Go to the SD Card page and find the Role column. Set every speech file to Voice: dialogue, phrases, anything with a voice in it. Leave everything else alone — beeps, whistles, scans, and rolling sounds play the same as always, with the mouth closed.
Choosing Voice does more than flip a switch. The droid reads the whole file and measures how loud the voice in it actually gets, which takes anywhere from a fraction of a second to a few seconds on a long file. A progress bar shows the measurement running, and the other selectors gray out until it finishes.
That measurement is what lets a quietly recorded line and a loud one open the jaw the same amount. Without it, half your files would barely move the jaw and the other half would hold it wide open.
The droid keeps a measurement once it has one. Move a file to PSI and back to Voice and it returns instantly, with no second measurement — the only thing that throws it away is changing the file itself.
A file with no three-digit number shows a dash instead of a selector. The droid tracks roles by sound number, so 042_Leia.wav can be set to Voice and leia.wav cannot. Renaming, replacing, or deleting a file clears its role, because the measurement described that recording and no longer applies.
Now come back to the Jaw servo page. The two handles on the single track are the closed and open positions, shown as an angle either side of the servo's own middle: 0° is dead center, negative is one way, positive the other.
Three buttons let you check your work without playing a sound. Each drives the jaw to a position, holds it for three seconds, then lets go and leaves it there — and they work even with the servo switched off.
| Button | What it does |
|---|---|
| Closed | Drives the jaw to your closed position, so you can see where the mouth rests between words. |
| Neutral | Drives the servo to its own mechanical middle. It ignores Closed, Open, and Reverse, so it never moves as you adjust them — this is your fixed reference point. |
| Open | Drives the jaw to your open position, the furthest it will go on the loudest part of a line. |
Start with the two handles close together and open the gap a little at a time, pressing Open after each change. Stop as soon as the jaw reaches the end of its travel — going further makes the servo push against a mechanical stop, which buzzes, heats up and eventually breaks something.
Reverse flips which way the servo turns, and nothing else. The handles stay where you put them. Whether you need it depends on how your jaw linkage was built: if pressing Open closes the mouth, turn Reverse on and try again.
A jaw that hangs slightly below center when closed and swings up to open.
Three settings shape the movement itself. The droid saves each one as you drag it.
| Setting | How to set it |
|---|---|
| Threshold | How loud a moment has to be before it counts as speech. Too low and the jaw twitches during silences and breaths; too high and quiet words go missing. Raise it if the mouth flutters when nothing is being said. |
| Hold | How long the mouth stays open after a peak. This is what makes a short syllable actually visible — without it the jaw is told to close again before it has finished opening. Raise it if the movement looks nervous; lower it if words start running together. |
| Release | How the mouth fades shut afterward. At 0 ms it follows the sound exactly, which looks crisp. Higher values smooth it out, but too much and the droid looks like it is chewing rather than talking. |
The jaw is commanded twenty-one times a second, so Hold lands on whole steps of about 46 ms. The second figure next to the setting is what you actually get: set it to 50 and it reads 50 ms → 93 ms. That is why 50 and 90 behave identically — both come out at two steps.
These are the factory settings, chosen by watching a real droid speak. Adjust from here rather than from scratch.
Set these with a real line of dialogue, never a test tone. A steady tone is the one sound that never behaves like speech: it has no syllables, so it tells you nothing about Hold and nothing about Threshold.
Play one of your checked sounds, watch the jaw, change one setting, and play it again. Changing two at once and liking the result leaves you unable to say which one did it.
The screen is your main source of status information when the droid is closed and the web interface is not open.
| What you see | What it tells you |
|---|---|
| A name, and a counter | The sound playing right now, and how far into it you are. Long names scroll. |
| Level bars | The current audio output level. Flat bars while a sound should be playing are a useful diagnostic clue. |
| Network name and address | Where to point your browser. This is the address to trust. |
| Card status | Whether the sound library was found, and how full it is. |
| Radio readout | Speed and direction, plus a row of dots for the monitored controls. A blank readout means the radio is off or its signal is not reaching the droid. |
The screen updates only when a displayed value changes, so a motionless display is normal and does not mean it is frozen.
When a new software version is published, the Dashboard notifies you and lets you install it.
When an update is available, a badge appears at the top of every page. Open the Dashboard. The Online Updates card shows the new version, release date, file size, and list of changes. Your currently installed version appears on the same page under Firmware.
Select Download and install. The web interface completes four steps and identifies each one as it begins. No action is required between these steps.
Everything you set up survives it: your sounds, your buttons, your labels, your Wi-Fi. An update replaces the droid's software, not its settings.
| It says | It means |
|---|---|
| Up to date | Nothing to do. |
| Update available | A newer version is available. The install button is on the same card. |
| Offline | Your browser could not reach the internet within about six seconds. This is normal when your device is connected to the droid's network and has no other internet connection. Select Check again to retry. |
| Not published | The update service responded successfully, but no release is currently available. This differs from Offline, which means the browser could not contact the service. |
| Ahead of release | You are running a version newer than the published one. Unusual, and nothing to fix. |
Use the manual upload area when you receive a .bin firmware file directly. Drop the file into the area or select it with the file picker. Other file types are rejected. Select Upload to transfer the file to the droid; the process then continues from the Uploading… step described above.
Four buttons at the bottom of the Dashboard provide backup, restore, restart, and reset functions.
| Button | What happens |
|---|---|
| Save Config | Downloads your channels, button assignments, labels, and jaw settings as one file. The file is saved to your Downloads folder with a name beginning with echo-config-, followed by the date and time. |
| Restore Config | Restores settings from a backup file, then restarts the droid. You can also use this function to copy a completed setup to another droid. |
| Reboot Device | Restarts the droid cleanly and may clear a temporary problem. |
| Factory Reset | Clears all settings, including the network configuration. Sound files remain on the card, but all button assignments are cleared. |
Its name does not matter; its contents do. You can rename the file, archive it, or move it to another computer without affecting restoration. The web interface verifies that the file contains a valid Echo configuration and rejects invalid files without applying partial settings.
A backup taken from an older version of the droid's software is still usable. It restores what it contains and leaves everything else as it was, so nothing is lost simply because the file predates a setting.
Network settings in a backup file are deliberately skipped. You can therefore restore someone else's channel assignments, sound ranges, and Kyberpad labels without changing how you connect to your droid.
After restoring to a droid that has never joined your network, enter your Wi-Fi details manually on the Network page. Re-entering these two fields takes little time compared with recreating the rest of the configuration.
A factory reset clears all settings, including the network configuration used to reach the droid.
12345678.
Getting back in is the same as the very first time, and takes a minute:
ECHO_xxxx
The password is 12345678 again. Any name you had given that network is gone too, so look for ECHO_ followed by four characters.
192.168.4.1
The web interface loads without your settings, but every sound remains on the card.
Change the droid's network password again immediately afterward. A reset restores the default, so remember that 12345678 is active again.
This section is intended for anyone building or repairing the droid. The preceding sections assume that the board is already wired.
The Waveshare ESP32-S3-LCD-1.47B is a compact board that includes the display, microSD slot, and RGB LED. These components require no additional wiring. The table below lists the external components that connect to the board.
Pin numbers are GPIO numbers, the ones printed on the board.
| What | Connects to |
|---|---|
| Audio DAC — PCM5102 | BCK to 7, LRCK to 5, DIN to 6. This is the sound output; everything the droid plays leaves through it. |
| Radio receiver | Its SBUS output to 2. One wire: the droid only ever listens, it never answers the receiver. |
| Jaw servo | Signal to 8. Power and ground come from elsewhere — see below. |
| PSI LED | Data to 38. |
| MOSFET | Gate to 4. |
| microSD | On board already, in 4-bit mode: 14 CLK, 15 CMD, 16/18/17/21 for D0 to D3. Nothing to wire, listed so nobody reuses those pins. |
In rough order of how often each one happens.
Open the SD Card page and select Play on device for any file. If the file is also silent there, check the sound library and audio hardware. If it plays correctly, the problem is probably the button mapping. On the Sounds page, verify that the assigned numbers match the files on the card. A visible file that cannot be selected is usually named incorrectly; its filename must begin with exactly three digits.
The radio is off, and a volume knob has been assigned to a channel. Without a valid radio signal, the droid defaults to 50% volume. Switch on the transmitter and the assigned knob takes control immediately.
The web interface has no volume control; use a knob or slider on the radio. If all three volume channels are set to None on the Channels page, assign at least one. The same channel can control all three.
On the droid's own network, Wi-Fi may have turned off after one minute without a connection. Restart the droid, then reconnect within 60 seconds. On your home network, the address may have changed; read the current address on the droid's screen. The droid does not automatically reconnect after losing your network.
Open the Channels page and check the badge at the top right. A red Disconnected badge means the droid is not receiving a radio signal. Verify that the transmitter is on and bound. If the badge is green, move a stick and watch the bars. Movement on the wrong card means the channel assignments need to be corrected.
That is deliberate, and it is the one place the dome behaves differently from the driving sound. Rolling follows where the stick is, so holding it keeps the sound going; the dome follows whether the stick is moving, and fades out about a third of a second after it stops. Keep turning and the sound continues. Nothing is wrong with the file.
The Sounds page only ever shows what your droid can actually do. A missing Dome Sound or Sound Effect 2 card means that control is still on None back on Channels. Missing page tabs work the same way: no Kyberpad channel and there are none at all, a Kyberpad channel without a page switch and you get Page 1 alone.
Several sounds in sequence usually mean that slew is still enabled in the radio's mixer. Turn it off. Also check the Kyberpad card: if an amber message identifies two controls sharing one channel, the controls are conflicting and some key presses may be interpreted incorrectly. If the wrong key responds consistently, the radio values no longer match the values expected by the droid. Select Restore Kyberpad defaults unless you changed them deliberately. A key held while the radio starts or the signal returns is ignored until you release it once.
Your radio transmitter is on. Uploading files and installing updates both stop while the droid is hearing the radio, because the two cannot share the airwaves. An amber banner at the top of the page says so. Switch the transmitter off and the page becomes available again within a second or two, with no reload.
The previous firmware version remains active because the droid switches versions only after receiving the complete update. You should see Download failed or Upload failed; select the button again to retry. Repeated download failures usually indicate a problem with your device's internet connection because the browser, not the droid, downloads the file.
A factory reset clears the Wi-Fi along with everything else. The droid has forgotten your network, its own network is called ECHO_xxxx again, and its password is back to 12345678. Join that network, open 192.168.4.1, and restore your backup. Then change the default password immediately.
Saving is automatic but not instant. The web interface waits about one second after your last change, then displays a confirmation. Closing the page or turning off the droid before that confirmation may discard the change. If no confirmation appears, the web interface may have lost contact with the droid.
The Logs page keeps the droid's most recent messages. Open it, reproduce the problem, and read the new entries. Most failures are reported there in plain language.