"Handling failure is much cheaper than never failing" - The Robusto paradigm
The easiest way is to:
- Clone this repository,
- Open it in PlatformIO
- See if any of your MCU:s match the platform.ini ones (can also try using platform.ini.all)
- Run the examples.
...or.. use ESP-IDF- or PlatformIO-dependency management and start with a blank project. A little harder, so please check out the examples. Bare bones projects will be added soon™.
For more general information, the Robusto web site will hold everything together. (bit of a work in progress currently)
Robusto resolves large managed components only when their owning Kconfig feature is enabled. Disabled features therefore do not download, configure, compile, or link their optional dependency:
| Kconfig feature | Managed dependency |
|---|---|
CONFIG_ROBUSTO_SUPPORTS_LORA |
RadioLib |
CONFIG_ROBUSTO_UI |
LVGL and ESP LVGL Port |
CONFIG_ROBUSTO_UI with SH1106 or SH1107 selected |
ESP LCD SH1107 |
CONFIG_ROBUSTO_UMTS_SERVER |
ESP Modem |
CONFIG_ROBUSTO_UMTS_MQTT_GATEWAY |
ESP MQTT |
Enable features through sdkconfig.defaults or idf.py menuconfig; do not add these packages merely to
make an unrelated build pass. Robusto uses compatible version ranges in idf_component.yml, allowing
the component manager to select suitable minor and patch releases. Dependency lockfiles are generated
build outputs and should not replace those manifest constraints as project configuration.
Each optional dependency is guarded twice: its manifest rule controls resolution, and the matching
condition in CMakeLists.txt controls REQUIRES. Keep both conditions identical when adding or changing
an optional feature.
This changes the transitive dependency graph. An existing application can fail after upgrading if it used LVGL, an LCD driver, MQTT, ESP Modem, or RadioLib directly while relying on Robusto to download that package for an unrelated disabled feature.
- If the application uses the corresponding Robusto feature, enable its
CONFIG_ROBUSTO_*option insdkconfig.defaultsor throughidf.py menuconfig. Robusto then resolves and links the dependency. - If application code uses the package independently of Robusto, declare that package in the
application's own
idf_component.ymland add it to the owning component'sREQUIRESorPRIV_REQUIRESlist. Do not enable an unrelated Robusto feature merely to recover a transitive package. - Delete the affected build directory once after changing the manifest or Kconfig defaults. The next configure regenerates dependency resolution from the new ownership rules.
- Do not edit
managed_componentsor commit a generated dependency lock as a workaround.
For example, an application that renders its own LVGL interface while CONFIG_ROBUSTO_UI is disabled
must declare lvgl/lvgl and, when used, espressif/esp_lvgl_port itself. A project using Robusto's UI
enables CONFIG_ROBUSTO_UI=y instead.
More conceptual information:
- About
- Architecture
- Concepts
- ESP32-P4/C6 Proxy PubSub
- Waveshare ESP32-P4-WIFI6 proxy example
- Waveshare ESP32-P4-WIFI6 proxy example (GitHub)
The more technical documentation on features are in their README:s:
If you want to help out developing Robusto:
Robusto is a framework that in some ways tries to rethink IoT development to produce cheap and robust networks, applications and services on microcontrollers.
Features include:
- Communication
- redundant communication
- central in/out queues and independent queues per media
- I2C, ESP-NOW, LoRa, BLE, CAN bus (TWAI) (and a UMTS/Cellular gateway)
- scoring media
- peer management
- presentation, information exchange
- problem solving
- retries over multple medias
- fragmentation large messages
- redundant communication
- Management
- energy
- sleeping
- synchronized sleep patterns
- KConfig/Menuconfig (not only for ESP-IDF, but also for Arduino, STM32)
- monitoring / reporting / statistics
- services
- runlevels
- energy
- Input handling
- Resistor array
- Binary ladder decoder
- ADC monitor and code generator utility
- Technical
- flash support
- logging
- Misc
- UMTS/GSM gateway
- Publisher subscriber (Pub sub)
..and other things typically only associated with "big" computer systems. But obviously without their memory footprint and power consumption.
Robusto is not designed to provide high-speed streaming communications for high definition video.
Instead, it is about reliably connecting sensors, actuators, controls, microcontrollers and similar components, and while it can transfer security footage and lower-grade live feeds, much more than that veers out its focus and is typically beyond the abilities and needs of the involved components1. It is also a matter of positioning.
Obviously that may change, but currently, if you want to do these things using cheap MCU:s please visit the ESP32-Camera project, bringing tempered expectations.
| Microcontroller | Framework | Comments |
|---|---|---|
| ESP32-DevKit V4 | ESP-IDF | Works |
| ESP32-SIM7000G | ESP-IDF | Works |
| TTGO T-BEAM SX1262 | ESP-IDF | Works |
| LoRa32 V1 SX1278 | ESP-IDF | Works |
| RaspberryPi Pico | Arduino | Works |
| STM32 F407VE | Arduino | Builds, uploads, boots, but untested |
| Arduino UNO* | Arduino | Too little RAM/Flash |
| Atmel ATtiny85* | Arduino | Way too little RAM/Flash |
| STM32 F03C8* | Arduino | Too little RAM/Flash |
* Note that these chips may still communicate with Robusto peers via I2C using the Fletch16 checksum library.
- Tell users about problems
This will help them take the proper corrective action before problems escalate.2 - Provide almost unbreakable wireless information security
This is achieved by using Out-of-band (OOB) communication to transfer OTP encryption keys, which can be done either continuously when devices are permanently wired, or for mobile devices; while charging.3
Footnotes
-
Netflix or other high definition streaming services provide a pleasant viewing experience not only by using a lot bandwidht, but power-consuming real-time processing. ↩
-
Sometimes that information, for example about radio interference may even help you troubleshoot other issues, like your WiFi network. ↩
-
Perhaps using a 4-pin charger connector (I2C + 5V). ↩