Let's face it, Arduino is one of the most used (by number of users) embedded development environments. Why is this?
I am currently developing a little robot to try do SLAM with, and started developing in Arduino before I realized that I needed to communicate with a host PC, and writing communication stuff in plain C kindof sucks. So I switched to rust. Since my microcontroller is an ESP32-C3, this was very painless. However, this switch made me appreciate several things about Arduino. It has it's faults (and lots of them), but it is undefinably "easy" to work with compared to pretty much anything else (except maybe micropython). So why is it good?
The first thing I notice is that compared to plain C, it has the concept of libraries. I don't need to scour the web, I can just go to the library manager, and say "Oh, I need something that does CBOR decoding". And a few seconds later I have a library that does CBOR decoding. It's not a great library manager (cargo for rust and uv for python are way better), but it's better than the
The same code works across multiple boards. One of my firends recently was working on a project he started with an arduino nano. He started driving an e-ink display and the nano was to slow. So he switched to an nano-esp32. Exact same form factor board, completely different processor, architecture etc. But the exact same code worked!
It allows you to think in modules rather than hardware. I have a robot, it has two motors with encoders. I think of these as separate units - a motor-driver-encoder pair. In software, for each motor it's two PWM channels for the driver and two interrupts for the encoder. In arduino I can very easily ignore all the harware setup and use analogWrite() for the PWM generation and attachInterrupt() for the encoder setup. When setting it up in rust, I have to configure all the GPIO interrupts at the same time, and all the PWM channels at the same time. I have to work based on the ESP's peripheral layout rather than the conceptual units I've built my system out of.
So there you go. I'm still using embedded rust for this project because working with any sort of networking (even if it us P2P over USB-CDC) in C is a pretty big nuisance. But I do appreciate just how easy it is to get started on a project in Arduino. It is (in my mind) a HAL that is high enough level that if you can spare the inefficiencies it creates, it'll get you going way quicker than any other solution.