Why is my robot arm not detected as a serial port?

An arm that does not appear as a serial port has not failed yet, it has not been seen. This page separates the case where the port is missing from the case where the port exists but nobody answers on it, and gives you the checks for each in the order that costs the least.

Connection · Last updated 2026-08-09

Symptom

The client shows an empty device list. There is no COM port on Windows, no /dev/cu.usb entry on macOS, nothing on /dev/ttyUSB0 or /dev/ttyACM0 on Linux, and ay-robots devices prints no serial port at all.

Short answer

When no port appears at all, the operating system never enumerated the USB-to-serial adapter, so this is a cable, port or permission problem and not a problem with the arm or its servos. The two causes that account for most cases are a charge-only USB cable and, on Linux, a user account that is not in the dialout group. Run ay-robots devices first, because the difference between "no port" and "port found, zero servos responding" sends you down two completely different paths.

Two different failures look identical in the client

The client tells you it cannot find the arm in both of the following situations, and they have nothing in common. In the first, the operating system has no serial device for your adapter, so there is nothing for the client to open. In the second, the port exists and the client opens it, but no servo answers on the bus. The output of ay-robots devices distinguishes them in one line, which is why it is the first thing to run rather than the thing you try after reinstalling.

bash
ay-robots devices

# Case 1: the port itself is missing
# SERIAL PORTS
#   (none)
# CAMERAS
#   0  FaceTime HD Camera   1280x720

# Case 2: the port is there, the bus is not
# SERIAL PORTS
#   /dev/ttyACM0   unknown  (0 servos responding)
Case 1 is a USB problem. Case 2 is a power, wiring or baud rate problem on the servo bus.

Everything below is about case 1. If you are in case 2, the port is proof that your cable carries data and that your permissions are fine, and the search moves to the arm: power first, then the first cable out of the controller, then the chain itself.

What the device is called on your system

The name depends on the chip in your adapter, not on which arm you own. An arm that uses a native USB microcontroller enumerates as a CDC ACM device, one that uses a separate USB-to-serial chip enumerates through that chip’s driver. Knowing which name to look for saves you from concluding that nothing appeared when something did.

Operating systemWhat to look forWhere to look
WindowsCOM3, COM7, any COM followed by a numberDevice Manager, under Ports (COM & LPT)
macOS/dev/cu.usbmodem… or /dev/cu.usbserial…ls /dev/cu.* in a terminal
Linux/dev/ttyACM0 for native USB, /dev/ttyUSB0 for an adapter chipls /dev/ttyACM* /dev/ttyUSB*
On macOS use the cu device, not the tty device

Every serial device on macOS appears twice, as /dev/tty.usbmodemXXXX and as /dev/cu.usbmodemXXXX. The tty variant waits for a carrier signal that a servo bus adapter never asserts, so an application that opens it can hang. The client picks the cu device on its own; this only matters if you are testing by hand with another tool and concluding the port is dead.

Work through it in this order

  1. 1
    Run the device scan and read it literally

    An empty serial section means the operating system has nothing. A named port with zero servos means you are in case 2 and the rest of this page does not apply to you.

    bash
    ay-robots devices
  2. 2
    Stop worrying about arm power for a moment

    The USB-to-serial adapter draws its power from the USB port, so the serial device shows up whether or not the servo supply is plugged in. That is useful: it means a missing port is never explained by the arm being switched off. Powering the arm changes the servo count, not the port list.

  3. 3
    Swap the USB cable for one you have moved files over

    This is the single most productive minute in this whole list. Cables that came with a phone charger, a battery pack or a lamp are frequently wired for power only, and they will light up an adapter that never enumerates.

  4. 4
    Plug directly into the machine

    Skip hubs, docks and USB-C dongles for the duration of the test. A dock that works for a keyboard can still fail to pass a serial adapter through cleanly, and eliminating it costs nothing.

  5. 5
    On Linux, check the group before anything else

    A device node that exists but is not readable by you looks exactly like a device that does not exist. The next section covers this in full.

    bash
    ls -l /dev/ttyUSB0 /dev/ttyACM0
  6. 6
    On macOS, replug and answer the accessory prompt

    Recent macOS versions ask whether to allow a newly connected USB accessory. If that prompt was dismissed, or appeared behind another window, the device stays blocked and silent. Unplug, plug back in, and answer it.

  7. 7
    On Windows, look in Device Manager rather than at the client

    If an unknown device appears when you plug the arm in and disappears when you unplug it, the machine sees the hardware and the serial driver did not bind. Install the driver for your adapter chip, then rescan. If nothing appears or disappears at all, go back to the cable.

  8. 8
    Restart the client last, not first

    If the CLI lists the port and the client does not, you are looking at a stale scan. Quit the client fully and reopen it so it enumerates again. Reinstalling before you have checked the cable is how people spend an evening on a two euro problem.

    bash
    ay-robots status

The Linux dialout group, in full

On most distributions serial device nodes are owned by root and by a group called dialout, with no permissions for anyone else. Your user is not in that group by default. The result is that the file is right there in /dev and your process cannot open it, which surfaces as a permission error in a log you may not be reading, or as an empty list.

bash
# Who owns the node
ls -l /dev/ttyUSB0
# crw-rw---- 1 root dialout 188, 0 Aug  9 14:02 /dev/ttyUSB0

# Are you in that group
groups
# users adm cdrom sudo

# Add yourself once
sudo usermod -aG dialout $USER

# Log out and log back in, then confirm
groups
# users adm cdrom sudo dialout
Group membership is applied at login. A fresh login is required, a reboot is not.

The step people skip is the login. Running the usermod command and then immediately retrying in the same terminal changes nothing, because your current session still carries the old group set. Log out and back in, or start a new session, and check with groups before you conclude the fix did not work. Some desktop environments keep a session alive after what looks like a logout, in which case a reboot is the reliable way to get a clean session even though it is not strictly required by the group change itself.

ModemManager can hold a new serial device for a few seconds

Several desktop distributions ship ModemManager, which probes newly connected serial devices to see whether they are modems. During that probe the port is busy. If your first connection attempt right after plugging in fails and a second attempt half a minute later succeeds, that is what happened, and nothing is wrong with your hardware.

The cable that carries power but no data

A USB cable needs four conductors to move data and two to move power. Plenty of cables in circulation only have the two. There is no marking that tells you which one you are holding, the connector looks identical, and the adapter on the far end may well have a power LED that comes on and convinces you the link is good.

Test the cable rather than reasoning about it. Plug a USB stick or a phone through the same cable into the same port. If the machine mounts the stick, the cable moves data and you can rule it out. On Linux you can watch enumeration directly while you plug the arm in, which also tells you the device name without guessing.

bash
# Linux: watch the kernel as you plug the arm in
sudo dmesg -w
# [ 1284.552] usb 1-3: new full-speed USB device number 8 using xhci_hcd
# [ 1284.712] cdc_acm 1-3:1.0: ttyACM0: USB ACM device

# Linux: the device tree, useful for spotting which controller a port hangs off
lsusb -t

# macOS: list what is there before and after plugging in
ls /dev/cu.*

If dmesg prints nothing at all when you plug in, the machine did not see an electrical connection: cable, port, or adapter. If it prints a line about a device that fails to initialize, you have a driver or power question instead. Either way you now know which half of the problem you are in, which is worth more than any amount of reinstalling.

Symptom to cause, at a glance

What you observeMost likely causeCheck
No port on any machine, any port, any cableThe adapter itselfTry the adapter on a second computer
No port on one machine onlyDriver on that machine, or permissionsDevice Manager on Windows, groups on Linux
No port with one cable, port with anotherCharge-only cableMove a file over the suspect cable
Port appears then vanishes seconds laterMarginal power or a failing cableDirect port, short cable, no hub
Port present, zero servos respondingArm power, first bus cable, or baud ratePower the arm, then rescan
Port present, fewer servos than the arm hasA break in the servo chainNote the highest responding ID
Before you power the arm to test the bus: 7.4 V

Feetech STS3215 servos, which is what an SO-100, an SO-101 and a LeKiwi arm are built from, run at 7.4 V. A 12 V supply destroys all of them in seconds and nothing brings them back. While chasing a connection problem it is easy to grab whichever brick is nearest on the desk. Read the printed number on the supply in your hand, not the shape of its plug.

If you want to check the rest of the stack while you wait

A missing port is local to your machine, so nothing about your account, your pairing or the platform is implicated. If you would like to confirm that for yourself, /live drives a real SO-100 in the browser with no signup and no local hardware. It uses none of your USB stack, so it working proves the far side is fine and keeps the search where it belongs. The client itself, if you need to reinstall or move to another machine, is on /download, and the full first-time setup path including calibration is on /learn/so-100-getting-started.

Frequently asked questions

Do I need to install a driver?

The desktop client ships the robot driver, so there is no Python environment and no serial library to install. What you may still need is the operating system driver for your USB-to-serial chip, which is a separate thing and is usually only an issue on Windows.

Does the arm need to be powered for the port to appear?

No. The adapter runs on USB power, so the serial device enumerates with the servo supply unplugged. Arm power changes how many servos answer, not whether the port exists.

ay-robots devices finds the port but the client does not show the arm. Why?

Almost always a stale scan in a client window that was open before you plugged in. Quit it completely and reopen. If it persists, check ay-robots status to confirm only one backend is running, because two instances competing for the same port produce exactly this.

Can I use a USB hub?

Yes, and a powered one is often better than a laptop port, especially once cameras are involved. For diagnosis, though, remove the hub so you are testing one thing at a time.

Is a permission error on Linux fixable without adding myself to dialout?

A udev rule that grants your user access to that specific device does the same job with narrower scope. The dialout group is simply the path that works on every distribution without writing a rule, which is why it is the standard advice.