ESP32 Development; New And Final Directions
Because I need a life too, I'm preparing a hard stop to finalize my ESP32 development after my last final changes. I only have time to work on it in my off-time and it's been consuming every spare moment for weeks.
V13 is what i just finished tonight... lucky 13. This is the first step toward the final ESP32 firmware I'm working on, which you can extend with robot skills.
Check out the release notes because that's the direction I'm heading. I'm removing all support for pwm/servos on the ESP32 GPIO. All ESP32s will require an additional servo controller, such as a PCA9685, SCC32, or a simple Arduino. The ESP32 does not have enough resources to handle the servo and all the other jazz.
- The core synchronization is out to lunch.
- The task management is at the mercy of hardware peripheral activities.
- The DMA or whatever happens internally doesn't share resources and blocks tasks.
- It's just not a great microcontroller for multitasking.
I think what makes the ESP32 great is its affordability. And because it's low-cost, you can buy 3 of them. And you essentially need 3 or maybe 4 to emulate an ezbv4 properly. It's like comparing a phone CPU to a desktop pc CPU. They're just different tools for different jobs. And the ESP32 is just not made for what we're trying to do. It's made for doing a single task, even though you can argue there are multiple cores, there is a reason...
- TASK #0 for WiFi/TCP/Network services
- TASK #1 for your program
- That's it. That's all you get
So, trying to split all these tasks and services into a micro that is low power and low cost for a reason requires either
- more esp32's chained together
- a different micro that costs more and has more power
- fewer features
So the plan moving forward is...
- Remove all servo/pwm from both ESP32 and ESP32Cam firmwares. For servo/pwm, use an external servo controller such as PCA9685, SCC32, or an Arduino, etc.
- dumbing-down the firmware based on what i wrote tonight. It's fully optimized, and I can't squeeze anything more out of it.
- i'm going to try adding audio to both ESP32Cam and ESP32 and see if i can make that work. It "sort of works" with the ESP32Plus, but it hasn't been fully tested yet.
- If I can make audio work on ESP32 and ESP32Cam firmware, I'll remove ESP32Plus, and we'll just focus on those two
*Remember: ESP32Cam and ESP32 are completely different microcontroller boards. The chips may be similar, but one with a camera and one without means a whole world of difference. And that is why there are multiple firmwares.

Thanks - here’s a clear, action-oriented summary of DJ_Sures’ announcement, what it means for your ARC project (SSC-32 and ArduinoComs), and exact next steps so there’s no confusion.
What DJ_Sures changed and why
How this affects your ARC project (SSC-32 & ArduinoComs)
Practical migration steps (step-by-step)
Decide which external servo controller to use
Hardware wiring
Add & configure the SSC-32 (or other) skill in ARC
Update ARC controls / scripts
Test carefully
Important ARC notes & reminders
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.
Also note that I do not recommend SCC-32 because it's SUPER slow and the protocol is text-based - which is absolutely ridiculous, and the creators should be embarrassed that they made it
I recommend PCA9685.. i'm going to make a robot skill for it and it'll work on i2c across all ezb devices.
We're fortunate you have you on our side. Thanks for all you do.
Haha - yeah it’s really frustrating working with stuff like that. I’m sure they had an "idea" of why the did it that way at the time. But I’d hope the author realized by now it was the wrong way to do it haha.
The trouble is that you guys want to use these things. And if the don’t work or perform, it reflects poorly onto us.
still an ascii text string protocol - nothing changed in the newer ssc-32u for protocol performance. i can explain further why it's so slow...
a byte is 8 bits that can represent a value between 0-255. For example, the letter A is a single byte with the value of 65. Capital B is 66. Capital C is 67. Lowercase A is 97, lowercase B is 98, etc...
a string is a list of bytes. So if you type the word HELLO, that's 5 bytes.
Computers don't know what the word HELLO means. They don't know what any string words mean. They know values of bytes.
A communication protocol should use bytes instead of strings. So a value of 0x00 could mean "stop servos". 0x01, 0x0A could mean "move servo 1 to position 10". That's 2 (two) bytes to send a command to move servo.
When you send a string, like their protocol, it's something long like FB23432Asdfjhqawtgh@#$%@3hjadgfhasdg or something who knows... so instead of sending 2 bytes, they send 10 or 15 bytes. PLUS they have to parse the string.
So 2 bytes is 2 bytes. 10 bytes is 5 times more bytes than 2 bytes. At a baudrate of 57600 or 115200, that's HUGE. 5 times slower. Next time you drive your car, drive 5 times slower the speed limit and see how long it gets you to go anywhere.
Yeah thats crazy. How in the heck do they expect you to run 32 servos with those kinda of restrictions/overhead..lol?
Thanks for that thorough explanation!
Exactly - I mean, hardware-wise, it looks promising because it supports 32 servos. But so slow to talk to. It's better for current between the PCA9685, but it's worse for communication speed. It's a tough choice between the two, because both have their downsides. If I had to decide, I'd go with the PCA9685 and provide power to the servos separately