How can I manage ports that exceed 23 using ARC @Athena? My ESP module currently supports ports higher than 23 with the integration of two PCA9685 PWM controllers, each controlling a set of servos. All connected ports have servos attached. My aim is to creatively utilize existing ARC skills and script commands to facilitate communication with the ESP.
I'm looking for a way to send commands to the ESP without setting up a TCP server, as that would impose too much overhead on the system. Ideally, I would like to find a method to send instructions that the ESP's firmware can receive. For example, is there a way to use one of the servos as a dedicated channel to receive commands for controlling the other eight servos? Please suggest a practical solution that would work efficiently.
I'm open to making minor modifications to the Arduino firmware, provided they don't add significant overhead, as the system's performance is already a concern.
Related Hardware (view all EZB hardware)
Related Robot Skills (view all robot skills)

Good description - thanks. You’ve got the right idea: avoid a heavy TCP server on the ESP and instead use an existing low-overhead transport that ARC already supports (serial, EZ-B UART, or lightweight UDP). Below I outline 3 practical, efficient approaches (ranked by simplicity / integration with ARC), how to implement each, and sample ARC JavaScript + minimal firmware ideas you can use. Tell me which connection method you have (ESP connected to PC via USBTTL, wired to an EZB UART, or only on WiFi) and I’ll give a tailored code example for your exact setup.
Summary of recommended options
Detailed plans and examples
What to do:
Minimal ESP firmware idea (pseudocode):
Why I recommend this: Zero extra load on WiFi, full compatibility with ARC’s servo UI, and no custom robot skill coding in ARC.
Useful links:
What to do:
Example ARC JavaScript to send one command (send servo id and pos):
Notes:
Example packet format suggestion:
Example ARC JavaScript that sends a UDP packet:
ESP side: create a UDP listener (WiFiUDP) to parse the 4byte packet and call PCA9685.setPWM(channel, pwmValue).
Which approach is right for you?
Other options and notes
Followups I need from you
If you tell me the connection type I’ll:
I am a customer support GPT-powered AI and still learning. If you have doubts about my response, please use the support documentation to verify my answer.
Thanks. I like your UDP listener idea as I don’t really want to physically tether a walking robot to a serial cable. UDP concerns me a little bit as I may or may not get the command so I may or may not execute it. I don’t want to continually send the same command as I would just spam the connection and we already have a ton of data from the camera flooding the wifi. So I guess important servos like robots arms legs go on assigned ports and non essential servos and PWM devices go on ports >23 I could also use this to control my neopixels instead of chewing up my assigned D Ports as if a colour doesn’t change I don’t really care.
Great - UDP is a sensible choice for an untethered walking robot. You’re right to worry about packet loss and WiFi saturation; the solution is to make the UDP layer light, idempotent, and "retry only when needed" instead of spamming. Below I give a practical, low-overhead design and concrete code you can paste into ARC (JavaScript) and a minimal ESP32 Arduino UDP receiver that’s robust to dropped or duplicate packets.
High-level strategy (what I recommend)
Packet format (recommended, minimal)
This is tiny and cheap to decode on the ESP.
ARC side: best-practice JavaScript example
Paste this into a Script robot skill (Project -> Add robot skill -> Scripting) or run from a button script. Update host/port to your ESP IP and UDP port.
ESP32 Arduino UDP receiver (minimal)
Example (simplified) - sketch skeleton. Adapt to your PCA addresses and mapping:
Notes about reliability without acks
NeoPixel specific guidance
Firewall and IP considerations
Optional: ACK-based reliability (if you want full reliability)
Next steps for me to tailor code
If you want, I’ll produce:
Would you like me to prepare those tailored files?
I am a customer support GPT-powered AI and still learning. If you have doubts about my response, please use the support documentation to verify my answer.
I guess the other option is ARC is modified to support more than 23 servo ID based on the Firmware ID of the board selected like it does today.
Short answer: ARC already supports more-than-24 servos without changing ARC core - use virtual servo ports (Vx) or a small robot-skill that detects your ESP firmware and sends custom EZB protocol commands. Changing ARC itself to expose D-ports > d23 based on a firmware ID would require modifying ARC source/controls (not something you can safely do from a project), and is overkill when robot skills + EZB-protocol extension solve this cleanly.
Below I outline practical options (why, pros/cons) and give concrete implementation paths you can choose from. I’ll also include minimal example code you can reuse.
Links you should bookmark
Why not modify ARC core
Recommended approaches (ranked)
Example C# robot-skill usage (send custom command to EZB)
(See: https://synthiam.com/Support/Create-Robot-Skill/Examples/extend-ezb-protocol-with-custom-command)
Which to pick?
Concrete path for the "Firmware-ID based extended servos" idea (recommended implementation without changing ARC core)
Minimal ESP firmware snippet (Arduino/ESP32) parsing Cmd 0 subcommands
Minimal ESP UDP alternative (your current plan)
How I can help next Tell me which of these you want me to produce:
Also please confirm:
Pick one of the three deliverables above and give the mapping + critical servo list, and I’ll provide the code & step-by-step for the kebab menu settings and how to add/configure the skill in ARC.
I am a customer support GPT-powered AI and still learning. If you have doubts about my response, please use the support documentation to verify my answer.
Yeah she nailed it. ARC will never be modified for what you refer to as "more than 24 servos (not 23)" because natively it’s the most ideal number for smoothest operation over a tcp channel. However, if a customer wishes to override our recommendation, it can be done with Vx servos as Athena mentioned.
This would require a super duper simple robot skill. That listens to the ezb’s servo manager by subscribing to the servo movement event. Sending a custom Move command to the ezb protocol for servos that are between Vx and Vy (ie V0 and V8).
Your esp32 firmware simple needs to add an IF condition to the firmware in the Custom section.
thats it
If you’re worried about having some ports labeled Dx and some labeled Vx, just use all Vx instead.
As for neo pixels. Youd need to add a custom extension as well. Just simple commands for adjusting the lights.
next thing you know, you have a little robot skill for your robot.
My suggestion you could make a few robot skills for universal (two in this case). Call them each an ezb protocol extension. One can be for neo pixel. The other can be for servos. That way yoir robot skill can be used more dynamically rather than for a single robot. This is the direction I’d go for expandability.
just remember, if prompting an LLM to assist, don’t mix instructions for both robot skills at once. Pick one and work with her until it’s completed. Then start on the other.
also, prompting has helped us realize how we manage expectations. It’s important to work backward from an outcome when describing what we want. We have to time travel to what it’s like when completed and describe what it is in great detail - and then work backward from that into a prompt. LLM’s produce best when you do not include your own irritative creative process. So it’s best to describe the outcome (including Dos and Don’ts), not the process.
Also, separate those in different conversations with an LLM. Have the LLM work with you to generate a prompt. Then, move to a new convo and use that prompt.
LLM’s are fancy auto completes. They get confused when the conversation includes many thoughts outside of the outcome. So always use new sessions when defining or tweaking an outcome.
Nice direction - DJ_Sures is right: keep ARC core alone and implement this as small, focused robot skills that forward Vx activity to your ESP32 firmware via the EZB protocol extension (Cmd 0) or a lightweight UDP/serial transport. That gives you clean behavior, no ARC changes, and reusable skills (one for extended servos, one for NeoPixels).
Below is a practical plan, sample code templates (robot-skill side and ESP side), configuration guidance (kebab menu), and follow-up questions so I can produce full drop-in files for you.
What I recommend
Links to resources
How the solution works (high-level)
Minimal C# robot-skill pseudo (forwarder)
Notes:
ESP32 (Arduino) firmware: Cmd 0 handler (minimal)
Simple packet layout for SendCommandData
Kebab menu & skill settings guidance
Why this is a good path
Follow-ups I need from you (so I can generate concrete files)
If you say "yes, give me both," I will:
Which deliverable do you want first?
I am a customer support GPT-powered AI and still learning. If you have doubts about my response, please use the support documentation to verify my answer.