Why does the scan find only some of my servos?

A partial servo scan is one of the most informative failures on this hardware, because the pattern of what answers tells you where to look. This page turns the responding IDs into a location, then covers the two failures that produce the same count with no cable at fault.

Hardware · Last updated 2026-08-09

Symptom

The serial port is found and the arm answers, but the scan reports fewer servos than the arm has. Four of six, or five of six, and the same IDs are missing on every rescan.

Short answer

A servo bus is a daisy chain, not a hub, so a bad link between servo N and servo N+1 makes everything after it disappear while everything before it keeps answering normally. Write down the highest ID that still responds: the cable between that servo and the next one is your suspect, and reseating or swapping it is a one minute test. A gap in the middle of the sequence means something different, because a broken link cannot skip a servo and then come back.

The bus is a chain, not a hub

Each servo on these arms has two identical connectors and passes the bus straight through from one to the other. The controller connects to the first servo, the first connects to the second, and so on to the gripper. There is no star wiring and no central board with six sockets. Every servo therefore depends on every connector between it and the controller, and a single bad link cuts off everything downstream of it while leaving everything upstream perfectly healthy.

That is why the count is diagnostic rather than merely alarming. A scan is a sequence of addressed queries; each servo that receives one answers with its ID. The set of IDs that answer maps directly onto the physical order of the arm, so the boundary between answering and silent is the location of the fault.

bash
ay-robots devices

# SERIAL PORTS
#   /dev/ttyACM0   SO-100  (4 servos responding)
#     id 1  ok
#     id 2  ok
#     id 3  ok
#     id 4  ok
#     id 5  no reply
#     id 6  no reply
# CAMERAS
#   0  USB 2.0 Camera   1920x1080
Four answer, two do not, and the boundary sits between servo 4 and servo 5.

Reading the pattern

Responding IDsMissingWhat it means
NoneAll sixPower, or the first cable out of the controller. No individual servo can cause this.
1, 2, 34, 5, 6The link between servo 3 and servo 4. Check that one connector before anything else.
1, 2, 3, 4, 56The last cable in the chain, which is also the one that flexes most.
1, 2, 4, 5, 63 onlyNot a chain break. A break cannot skip one and resume, so servo 3 itself is at fault or its ID changed.
Count is one short, two joints move togetherNothing physicallyTwo servos share an ID. They both obey and only one is counted.
Count varies between scansDifferent IDs each timeA marginal connector or a supply that sags. Reseat, then read the brownout guidance below.

The fourth row is the one worth internalizing. Wiring failures are contiguous by construction: if the signal stops at a connector, everything past it is silent, without exception. A hole in the middle of an otherwise complete sequence is therefore never a cable between two working neighbors, and looking for one wastes an hour. A servo that has failed electrically usually still passes the bus through its second connector, which is exactly why its neighbors keep answering while it does not.

Diagnose it in this order

  1. 1
    Scan and write the numbers down

    Record which IDs answered, in order. If you only remember "some are missing" you will lose the one piece of information that locates the fault.

    bash
    ay-robots devices
  2. 2
    Power cycle once, then rescan

    A servo that latched a fault, or a bus that was scanned while the supply was still coming up, can report short for reasons that clear on a clean start. This costs ten seconds. Do it once, not repeatedly, because repeating it is not diagnosis.

  3. 3
    Reseat both ends of the suspect link with the power off

    Take the link identified by the highest responding ID. Unplug both connectors, look at the pins, push them home until they click, and rescan. Half-seated connectors are the single most common cause and they survive weeks of use before failing.

  4. 4
    Swap that cable with one you have proven

    Take the cable from a link that is currently working, for example between servos 1 and 2, and put it in the suspect position. If the missing servos come back, you have found it. If the fault moves to where you took the good cable from, you have found it twice.

  5. 5
    Shorten the chain to isolate the servo

    Connect the first missing servo directly to the controller with a known-good cable, alone. If it answers on its own, the servo is fine and everything you are chasing is wiring. If it stays silent alone, you have a servo or an ID problem, not a cable.

    bash
    ay-robots devices
  6. 6
    Check for a duplicated ID

    If the isolated servo answers but the count is still short when it is back in the chain, two servos are probably sharing an address. Put each one alone on the bus in turn and note the ID it reports.

  7. 7
    Check the baud rate on anything recently replaced

    A servo configured for a different rate is electrically fine and completely silent at the rate the rest of the bus uses. This is standard on a replacement unit out of the box and on any servo that has been through someone else’s configuration tool.

  8. 8
    Only now suspect the servo or the controller

    A servo that stays silent alone, on a proven cable, at the right baud rate, with a unique ID, has earned the diagnosis. Replace it, then recalibrate the arm, because a new servo has a different zero point.

    bash
    ay-robots calibrate
Power off before you unplug anything on the bus

Reseating connectors on a live bus risks shorting adjacent pins as the plug tilts. Switch the servo supply off first. While you are handling supplies: STS3215 servos are 7.4 V parts and a 12 V brick ends all six in seconds, so if a LeKiwi base or a Koch arm shares your bench, keep those supplies physically separated and labeled.

Duplicate IDs, and the joint that moves in sympathy

Every command on the bus is addressed to an ID. If two servos carry the same one, both of them execute every command sent to that address, and both try to answer it. The scan counts one where two exist, and the arm develops an obvious tell: two joints move together whenever you drive either of them. Nothing raises an error, because from the protocol’s point of view nothing unusual happened.

This shows up after a servo is replaced with one that was never renumbered, and after a build where the numbering pass was interrupted. The fix is to assign IDs one servo at a time, with only that servo on the bus, using the configuration tool from the servo vendor. There is no command in this platform’s CLI that writes servo IDs, so do not go looking for one. Once the numbering is unique, rescan, then recalibrate, because the software’s idea of which joint is which has just changed.

A servo on the wrong baud rate

Servos and controller must agree on the bus speed. A unit set to a different rate hears a garbled version of every query and answers nothing, which is indistinguishable from a dead servo or a cut cable when all you have is a count. The reason to keep it on the list is that it is free to rule out and expensive to overlook: people replace a perfectly good servo because of it.

TestResultConclusion
Servo alone on a proven cableAnswersServo and its own connectors are fine, look upstream
Servo alone on a proven cableSilentServo, its ID, or its baud rate
Swap suspect cable with a working oneFault follows the cableThe cable, replace it
Swap suspect cable with a working oneFault stays in placeThe connector on one of the two servos, or the servo
Renumber the suspect alone, then rescanCount is now completeIt was a duplicate ID all along
Scan again with the vendor tool at another rateServo appears thereBaud rate mismatch, set it to match the bus
Do not calibrate an incomplete arm

Calibration captures all joints in one pass. Running it while a servo is missing stores a reference for an arm that does not exist, and you will be undoing it later. Get to a full count first, then calibrate, then record. The calibration walkthrough is on /learn/so-100-getting-started.

What a missing servo does to a dataset

If you record before you have a full count, the joint that never answered contributes a column that never changes. That dataset looks entirely normal in a file listing and trains without complaint, and the resulting policy simply never uses that joint. It is a slow, expensive way to learn this lesson, and it is the reason the scan is worth reading carefully every time you set up rather than only when something is obviously broken. Recording practice is covered on /so-100/data-collection, and the training side of the same mistake shows up on /train/act-on-so-100.

Frequently asked questions

The last responding ID is 5 and the gripper is 6. Is the gripper dead?

Probably not. The cable to the gripper is the last one in the chain and it moves every time the wrist turns, so it fails far more often than the servo it feeds. Reseat and swap that cable before you order a replacement servo.

Why does the count change between scans?

A connector that makes contact intermittently, or a supply that sags while several servos are energized. Reseat everything, then confirm the supply is holding under load, because a marginal supply can drop servos out of a scan without any wiring being at fault.

Can I renumber a servo with the CLI?

No. The CLI can list devices, calibrate, home, record, run policies and manage datasets, but it does not write servo IDs. Use the servo vendor’s configuration tool with a single servo on the bus.

Does a dead servo in the middle break the ones after it?

Usually not. The bus passes through the servo’s second connector, so its neighbors keep answering. That is why a gap in the middle of the ID sequence points at the servo rather than at the wiring.

I replaced a servo and now the arm is one short again.

Check its ID and its baud rate. Replacement units arrive with factory defaults, which are frequently neither the ID nor the rate your bus expects. Put it alone on the bus, set both, then rescan and recalibrate.