Nove esempi in Rust no_std che collegano sensori, display e attuatori Grove alla Seeed Studio XIAO ESP32-C6. E il cuore del lavoro di Mariusz Jurgielewicz, che ha scelto esp-hal 1.0.0 come base per ogni sketch. Ogni esempio pilota un singolo modulo del Grove Beginner Kit for Arduino, dal lampeggio di un LED alla lettura di accelerometro, pressione e umidita. Cosi il percorso di apprendimento resta lineare: si parte dal GPIO e si arriva al bus I2C.
La scheda espone 14 pin castellati, portati fuori dal Grove Base for XIAO. Lo shield li traduce in connettori Grove etichettati (analogico, digitale, I2C), con chiave meccanica che impedisce l’inserimento errato del cavo. Inoltre il USB-JTAG e integrato nel chip: cargo run –release flasha e apre il monitor sulla stessa porta, senza sonda esterna. Se qualcosa va storto, esp-backtrace stampa uno stack trace reale in caso di panic.
Il firmware: esp-hal, embedded-hal e driver dietro i trait
Tutti gli esempi compilano per il target riscv32imac-unknown-none-elf e si appoggiano a esp-hal 1.0.0, esp-backtrace ed esp-println per il logging seriale senza defmt. I driver dei periferici stanno dietro i trait embedded-hal, quindi lo schema di ogni esempio e sempre lo stesso: estrarre un periferico GPIO o I2C dall’HAL, passarlo al driver, ciclare. La pagina del progetto su Hackster.io di Mariusz Jurgielewicz raccoglie i nove esempi con i driver usati, da ssd1306 a bme280, da tm1637-embedded-hal a esp-hal-smartled.
- Rust, no_std, target riscv32imac-unknown-none-elf
- esp-hal 1.0.0, esp-backtrace, esp-println
- embedded-graphics e ssd1306 per l’OLED
- bme280 per pressione e umidita
- tm1637-embedded-hal per il display a 4 cifre
- esp-hal-smartled per lo stick RGB
OLED, BME280 e AHT20 condividono lo stesso bus I2C su D4/D5 senza conflitti. Il motivo e semplice: il connettore Grove fissa il cablaggio e ogni driver possiede il proprio indirizzo I2C. Quindi non serve alcun multiplexer, ne una seconda coppia di pin.
Alimentazione a 5 V per TM1637 e stick RGB WS2813
Due moduli richiedono cablaggio extra perche lo shield fornisce solo 3,3 V. Il display TM1637 e lo stick RGB WS2813 vanno alimentati dai pin 5V e GND della XIAO, con le linee di segnale (CLK/DIO su D2/D1, DIN su un pin di segnale) verso il shield. Lo stick contiene 15 LED WS2813 Mini indirizzabili, quindi il firmware deve gestire una catena di 15 elementi. Invece i moduli a 3,3 V si collegano direttamente al connettore Grove, senza saldature.
I numeri degli esempi aiutano a capire il ritmo del codice. Il LED dell’esempio grove_led lampeggia con 250 ms acceso e 1000 ms spento. Il potenziometro Grove regola il periodo di lampeggio del LED da 50 ms a 1000 ms. Quindi il ciclo di lettura analogica e il ciclo di uscita digitale convivono nello stesso loop, senza timer dedicati. Poi arrivano l’accelerometro LIS3DHTR a tre assi e il sensore di pressione BME280, entrambi letti via I2C.
Per rifare il progetto servono la XIAO ESP32-C6, il Grove Shield for Seeeduino XIAO e il Grove Beginner Kit for Arduino. Inoltre conviene tenere a portata di mano un cavo Grove per ogni modulo, cosi si sposta un esempio alla volta senza staccare tutto. La toolchain Rust si installa con rustup, poi si aggiunge il target riscv32imac-unknown-none-elf. Infine si lancia cargo run –release e si guarda il monitor seriale.
Fonte: https://www.hackster.io/melastmohican/grove-sensors-with-rust-on-esp32-c6-9f7d62
