--- tipo: progetto stato: idea nel cassetto, non attiva data: 2026-08-26 --- # Progetto carrello robotico — idea nel cassetto **Nessun acquisto fatto, nessuna spesa.** Idea definita, da valutare — non un piano attivo. Emersa il 26/08/2026 da una conversazione claude.ai (progetto SecondBrain), durante la prima sessione di esplorazione hardware con [[arduino-kit|il kit Arduino]] sulla Nave. Mauro, lo stesso giorno: *"è una ipotesi fantasiosa ma visto che stiamo esplorando a questo punto lo archivierei da qualche parte. Chissà che un giorno non lo si faccia..."* **Nota di processo (26/08)**: questo promemoria è stato cancellato per errore da Adrian (bug di verifica del `body`, vedi `archivio/Adrian/feedback/feedback_ritorno_body_prima_di_cancellare.md`) e poi **ripristinato da Mauro** facendolo ricreare da claude.ai. Il contenuto sotto è la versione recuperata. ## Cos'è Carrello robotico a 2 ruote motrici + camera, fatto crescere un gradino alla volta insieme a Claude Code. **Il progetto è il processo, non l'oggetto**: il carrello è la scusa per lavorare su AI-hardware. Prosecuzione della tesi già in [[progetto-domotica-iot]] ("l'integrazione AI-hardware fino ai robot è una direzione che conta"). Vale lo stesso principio già scritto lì: **curva frazionabile** — ogni pezzo funziona da solo, ci si può fermare per mesi senza aver buttato niente. ## Principio architetturale > **AI nell'anello di autoria, non in quello di esecuzione.** (stesso principio di [[progetto-domotica-iot]]) - **Anello 1 (esecuzione)**: ESP32 a bordo. PWM, PID su encoder, watchdog, stop ostacolo. ~100 Hz. Continua a funzionare con la rete giù. - **Anello 2 (decisione)**: Nave / API. Missione, interpretazione scena. Ogni pochi secondi. Al modello non si dà **mai** il comando motori diretto: si espone "muovi di N cm", con sotto un supervisore deterministico che può dire di no. ## Architettura ``` Claude Code → MCP guarda()/muovi() → wrapper sulla Nave → USB seriale (fase banco) poi WiFi → ESP32 su Waveshare General Driver → motori. ESP32-CAM separato espone /frame. ``` Contratto stabile fra strati: il firmware espone **solo** `/frame` e `muovi(sx, dx, ms)`. ## Scala dei gradini (ognuno chiude con qualcosa che si accende) 1. Banco senza motori, risposta JSON via USB 2. Una ruota gira alla velocità comandata 3. Watchdog (obbligatorio prima di ogni movimento non sorvegliato) 4. Due ruote + PID: va dritto, gira di un angolo 5. Odometria 6. Occhio (ESP32-CAM, `/frame`) 7. Ponte MCP 8. Primo ciclo guarda → decide → muove 30 cm → guarda 9. Diario delle mosse (memoria testuale, surrogato della mappa) 10. Passaggio a WiFi (stesso protocollo, cambia solo il trasporto) 11. Solo se serve davvero: lidar, Nav2, ROS 2 ## Decisioni tecniche maturate (proposte discusse, non impegni di spesa) - Trazione differenziale 2 ruote + ruota pazza: sta nei 2 canali encoder della scheda ed è il cinematismo per cui Nav2 è nato - Motori 12V con encoder taglia 25D (non 37D: coppia inutile in casa, stallo oltre il driver) - Riduzione alta / velocità bassa ~110 rpm: con ciclo decisionale da 2-3s un robot veloce è ingovernabile - Scheda Waveshare General Driver for Robots (~33€), non ESP32 nudo + TB6612 + buck separati - Fase iniziale col cavo USB verso la Nave, non WiFi ## Cablaggio e competenze — correzione importante Mauro ha competenze limitate di saldatura. In una prima stesura era scritto "cablaggio saldato": **corretto**, sul progetto la saldatura è quasi sempre evitabile. - Soluzione: **capicorda a bussola (ferrule) crimpati**. Pinza + assortimento ~20-25€. Su un veicolo che vibra reggono quanto una saldatura e si disfano/rifanno. - La General Driver ha morsetti a vite; portacelle e ESP32-CAM arrivano già terminati. - **Niente jumper su breadboard**: vibrazioni = guasti intermittenti, e il bug non è nel codice (coerente con quanto sperimentato oggi stesso col fotoresistore, anche se lì la causa era diversa). - Priorità attrezzi: 1) multimetro ~20€ 2) pinza ferrule ~25€ 3) saldatore **rimandabile** ## Telaio — valutato e deciso: niente taglio laser per ora - Motivo: la geometria vera si conosce solo coi pezzi in mano, il primo layout sarà sbagliato. Sbagliare col laser = altro ordine e 4 giorni; con piastra forata a mano = 5 minuti e una punta. - Per iniziare: piastra forata in alluminio da ferramenta, o compensato/plexiglass 5mm tagliato in negozio e forato col trapano, o piastra Tamiya universale (70157). - Il laser ha senso al **gradino 5**, quando il carrello cammina e la disposizione è assestata. - Idea per allora: DXF parametrico generato da script Python (`ezdxf`), versionato nel repo. Cambi motore o interasse → cambi un numero e rigeneri. - Fornitori plexiglass: 3Dline (configuratore online, 3-4gg + express), Vectorealism, Pannelliplastica (DXF in pagina prodotto), Archilaser (Piacenza). Per alluminio serve altro fornitore (il CO2 non taglia metalli riflettenti), es. Laseridea — comunque sovradimensionato. - Trucco a costo zero: stampare il DXF su A4 in scala 1:1 e appoggiarci sopra i pezzi veri. ## Scartati con motivo (non riaprire senza ragione nuova) - Kit telaio mecanum 4WD: motori 3-6V incompatibili (scheda 7-13V), nessun encoder, mecanum slittano di progetto, male su tappeti e soglie - DFRobot Baron-4WD ROB0025: 4,5-6V, motore tipo 130, riduttore plastica, 68cm/s, portata 800g - ESP32 DevKit + TB6612 + buck separati: risparmio ~11€ ma si perdono IMU, monitoraggio V/A, header 40 pin per il Pi, interfaccia lidar, UART-USB - Braccio SO-101 / LeRobot: valido e più "AI vera" (imitation learning), ma è un altro progetto - ROS 2 subito: sovradimensionato per i primi gradini - Telaio laser come primo passo: vedi sopra ## Verifiche aperte prima di qualsiasi ordine - Mozzo da 4mm (asse dei 25D), **non** 6mm: i due formati convivono a catalogo - Altezza ballcaster coerente con le ruote: piano non orizzontale = odometria storta - Quale driver monta la General Driver (sui rover Waveshare è TB6612, ~1,2A continui/canale) e corrente di stallo della versione LP scelta - Come sono terminati i fili encoder dei motori Pololu (connettore o fili nudi) - Disponibilità scheda Waveshare su Botland, altrimenti ordine spezzato su Eckstein ## Lista della spesa (indicativa, 120-160€ senza attrezzi) - **Cervello/motricità**: Waveshare General Driver ~33€; 2x Pololu 4885 (25Dx67L LP, 12V, 47:1, 110rpm, encoder 48 CPR); staffe 25D; 2x mozzo 4mm; 2x ruote 70-80mm; ballcaster; piastra - **Energia**: portacelle 3x18650 (11,1V), 3 celle protette, caricabatterie, interruttore + fusibile 3A - **Occhio**: ESP32-CAM AI-Thinker + adattatore FTDI - **Attrezzi**: multimetro, pinza ferrule + assortimento, viti e distanziali M3, cavo silicone 22 AWG, guaina termorestringente, fascette, cavo USB-A/micro lungo - **Fornitori**: Botland (PL, distributore Pololu e tiene Waveshare) come fornitore unico; Eckstein (DE) alternativa per la scheda. Il collo di bottiglia è l'attesa, non il costo: un ordine solo. ## Gotcha noti - Device seriale: `/dev/serial/by-id/...`, mai `/dev/ttyUSB0`. Con due dispositivi USB l'enumerazione cambia al riavvio. In container, passare quel path. - USB non alimenta i motori: 5V per la logica, serve la batteria sull'ingresso di potenza. Masse in comune. - USB 3 disturba i 2,4GHz: quando il carrello passa a WiFi, non tenerlo attaccato alla Nave. - Watchdog obbligatorio: pacchetto perso a metà comando = motori che spingono fino a batteria scarica. ## Riserve oneste - La difficoltà non è scrivere il codice. I bug si manifestano come **comportamenti** (oscilla, va storto, si incastra) e la causa può stare in sei posti, incluso il mondo fisico che l'agente non vede. - Metà del lavoro è taratura, non programmazione, e il criterio è qualitativo. - Il ritmo lo detta la logistica: due settimane per un pezzo, e la sera che arriva il connettore è sbagliato. - Serve una memoria di progetto: Claude Code è amnesico fra sessioni. Repo + nota sono ciò che tiene insieme sei mesi. - **La domanda non è se, è se è il momento.** Primo gradino ~35€ e una serata, non impegna al resto. ## Nota di progetto La conversazione claude.ai ha prodotto anche un file `progetto-carrello.md`, consegnato a Mauro separatamente. **Attenzione**: quella versione conteneva ancora "cablaggio saldato" (corretto qui sopra) e non aveva la sezione telaio/laser — se emerge, questa nota archiviata è la versione aggiornata, non quella.