Esercitazione 1 – Pulsante singolo con antirimbalzo, doppio clic, pressione lunga e timeout

Allenamento per l’esame di maturità
Percorso di laboratorio con Arduino per studenti di quinta ITIS

Obiettivo didattico

Realizzare una piccola interfaccia utente con un solo pulsante. Il sistema deve riconoscere una pressione breve, un doppio clic, una pressione lunga e un timeout di inattività. L’attività allena la gestione degli eventi, l’antirimbalzo software e l’uso di millis() senza bloccare il programma.

Nota importante

La comprensione del funzionamento di questo esercizio permetterà lo svolgimento in autonomia dell’esercizio aggiuntivo che trovate al fondo di questa scheda di lavoro.

Materiali suggeriti

  • Arduino UNO R3 o UNO R4;
  • 1 pulsante;
  • 3 LED;
  • 3 resitori (per i LED);
  • breadboard;
  • cavetti jumper.

Schema di collegamento

Richiamo teorico

Per leggere correttamente un pulsante reale bisogna evitare il rimbalzo dei contatti. Si usa quindi una variabile con l’ultima lettura, una temporizzazione di stabilizzazione e una logica a eventi. Con millis() si misura il tempo senza usare delay(), così il programma può continuare a controllare altri compiti.

Schema logico dell’attività

Il programma legge continuamente il pulsante. Se la lettura cambia, attende il tempo di debounce. Quando il livello è stabile, riconosce pressione e rilascio. Dal tempo trascorso ricava l’evento: clic breve, doppio clic oppure pressione lunga. Se non accade nulla per molti secondi, attiva un LED di timeout.

Diagramma di flusso

Diagramma di flusso Mermaid

Ricordo che per realizzare il diagramma di flusso, copiate il codice Mermaid seguendo le indicazioni della lezione: Progettare bene, programmare meglio: diagrammi di flusso – cos’è il formato Mermaid? – Lezione 2/5

flowchart TD
    A[Inizio] --> B[Configura pin e variabili]
    B --> C[Leggi pulsante]
    C --> D{Lettura cambiata?}
    D -- Sì --> E[Salva istante variazione]
    D -- No --> F{Tempo debounce trascorso?}
    E --> F
    F -- No --> C
    F -- Sì --> G{Stato stabile cambiato?}
    G -- No --> H{Timeout inattività?}
    G -- Sì --> I{Pulsante premuto?}
    I -- Sì --> J[Memorizza istante pressione]
    I -- No --> K[Calcola durata pressione]
    K --> L{Pressione lunga?}
    L -- Sì --> M[Genera evento LONG]
    L -- No --> N{Secondo clic entro finestra?}
    N -- Sì --> O[Genera evento DOUBLE]
    N -- No --> P[Attendi possibile secondo clic]
    H -- Sì --> Q[Attiva LED timeout]
    H -- No --> C
    J --> C
    M --> C
    O --> C
    P --> C
    Q --> C

Programma

/*
  Prof. Maffucci Michele
  Esercizio 1: Pulsante singolo con antirimbalzo, doppio clic, pressione lunga e timeout
*/


// ---------------------------
// Definizione dei pin usati
// ---------------------------
const int PIN_PULSANTE = 2;
const int PIN_LED_BREVE = 8;
const int PIN_LED_DOPPIO = 9;
const int PIN_LED_TIMEOUT = 10;

// ---------------------------
// Costanti temporali
// ---------------------------
const unsigned long TEMPO_DEBOUNCE = 30;
const unsigned long SOGLIA_PRESSIONE_LUNGA = 800;
const unsigned long FINESTRA_DOPPIO_CLICK = 350;
const unsigned long TEMPO_TIMEOUT = 5000;

// ---------------------------
// Variabili per antirimbalzo
// ---------------------------
int ultimaLetturaGrezza = HIGH;
int statoStabile = HIGH;
unsigned long istanteUltimaVariazione = 0;

// ---------------------------
// Variabili per eventi utente
// ---------------------------
bool attesaSecondoClick = false;
unsigned long istantePrimoClick = 0;
unsigned long istantePressione = 0;
unsigned long ultimoEventoUtente = 0;

void setup() {
  // Il pulsante usa la resistenza interna di pull-up.
  pinMode(PIN_PULSANTE, INPUT_PULLUP);

  // I tre LED rappresentano tre eventi diversi.
  pinMode(PIN_LED_BREVE, OUTPUT);
  pinMode(PIN_LED_DOPPIO, OUTPUT);
  pinMode(PIN_LED_TIMEOUT, OUTPUT);

  // All'avvio tutti i LED sono spenti.
  digitalWrite(PIN_LED_BREVE, LOW);
  digitalWrite(PIN_LED_DOPPIO, LOW);
  digitalWrite(PIN_LED_TIMEOUT, LOW);

  // La seriale aiuta a vedere quale evento viene riconosciuto.
  Serial.begin(9600);

  // Salvo il tempo iniziale come ultimo evento.
  ultimoEventoUtente = millis();
}

void loop() {
  // Leggo il pulsante in forma grezza.
  int letturaCorrente = digitalRead(PIN_PULSANTE);

  // Se la lettura è cambiata rispetto alla precedente,
  // aggiorno il tempo della variazione.
  if (letturaCorrente != ultimaLetturaGrezza) {
    istanteUltimaVariazione = millis();
    ultimaLetturaGrezza = letturaCorrente;
  }

  // Se il segnale è stabile da abbastanza tempo,
  // posso considerarlo affidabile.
  if ((millis() - istanteUltimaVariazione) >= TEMPO_DEBOUNCE) {

    // Se anche lo stato stabile è cambiato, ho un nuovo evento.
    if (letturaCorrente != statoStabile) {
      statoStabile = letturaCorrente;
      ultimoEventoUtente = millis();
      digitalWrite(PIN_LED_TIMEOUT, LOW);

      // Transizione verso livello basso = pulsante premuto.
      if (statoStabile == LOW) {
        istantePressione = millis();
      }
      // Transizione verso livello alto = pulsante rilasciato.
      else {
        unsigned long durataPressione = millis() - istantePressione;

        // Se la durata supera la soglia, classifico come pressione lunga.
        if (durataPressione >= SOGLIA_PRESSIONE_LUNGA) {
          Serial.println("Evento: PRESSIONE LUNGA");
          lampeggiaLed(PIN_LED_DOPPIO, 2, 120);
          attesaSecondoClick = false;
        }
        else {
          // Se sto già aspettando un secondo clic,
          // verifico la finestra temporale.
          if (attesaSecondoClick == true &&
              (millis() - istantePrimoClick) <= FINESTRA_DOPPIO_CLICK) {
            Serial.println("Evento: DOPPIO CLICK");
            lampeggiaLed(PIN_LED_DOPPIO, 1, 250);
            attesaSecondoClick = false;
          }
          else {
            // Primo clic breve: non lo confermo subito,
            // perché potrei ricevere un secondo clic.
            attesaSecondoClick = true;
            istantePrimoClick = millis();
          }
        }
      }
    }
  }

  // Se è in attesa un secondo clic e la finestra è scaduta,
  // confermo il clic breve.
  if (attesaSecondoClick == true && (millis() - istantePrimoClick) > FINESTRA_DOPPIO_CLICK) {
    Serial.println("Evento: CLICK BREVE");
    lampeggiaLed(PIN_LED_BREVE, 1, 250);
    attesaSecondoClick = false;
  }

  // Se passa troppo tempo senza eventi, attivo il LED di timeout.
  if ((millis() - ultimoEventoUtente) >= TEMPO_TIMEOUT) {
    digitalWrite(PIN_LED_TIMEOUT, HIGH);
  }
}

// ----------------------------------------------------------
// Funzione di servizio: fa lampeggiare un LED alcune volte.
// In questa attività è accettabile usare delay() perché
// la funzione serve solo come feedback visivo di conferma.
// ----------------------------------------------------------
void lampeggiaLed(int pinLed, int numeroLampi, int durata) {
  for (int i = 0; i < numeroLampi; i = i + 1) {
    digitalWrite(pinLed, HIGH);
    delay(durata);
    digitalWrite(pinLed, LOW);
    delay(durata);
  }
}

Continua a leggere

Allenamento alla maturità con Arduino

Esercitazioni progressive di laboratorio per studenti di quinta ITIS e professionale

La preparazione alla seconda prova dell’Esame di Stato passa anche attraverso l’attività pratica in laboratorio in modo che l’azione possa essere utile per focalizzare lo studio teorico e lo svolgimento delle tracce degli anni precedenti.

Per affrontare bene la maturità serve allenamento operativo, metodo e continuità.
Per questo motivo ho deciso di proporre una serie di esercitazioni pratiche con Arduino, pensate per studenti del quinto anno dell’ITIS – Elettronica e Automazione, utilizzabili sia a scuola in laboratorio con il supporto dei docenti sia a casa in autonomia come attività di ripasso e consolidamento.

Sono in realtà attività pratiche che possono essere svolte in circa 90 minuti di lavoro e che prendono in considerazione argomenti del triennio dell’ITIS che ritengo possano servire per lo svolgimento di problemi che potrebbero essere presenti nel tema d’esame di TPSEE.

Quindi questa raccolta nasce con un obiettivo molto preciso:

aiutare gli studenti a prendere confidenza con quelle strutture di programmazione che, molto spesso, risultano più difficili da capire e da usare in modo corretto, ad esempio:

  • temporizzazioni non bloccanti con millis()
  • multitasking cooperativo
  • array e matrici
  • interrupt
  • puntatori
  • macchine a stati
  • gestione ordinata degli eventi

Due percorsi distinti ma complementari

All’interno del lavoro di preparazione alla maturità sto sviluppando due percorsi paralleli.

Il primo è questa serie di esercitazioni trasversali di programmazione, focalizzate sulle strutture software più importanti e spesso più ostiche.

Il secondo, invece, è già in corso con un mia classe e nel breve pubblicherò le attività di laboratorio, si tratta di una reinterpretazione per il laboratorio di Sistemi elettronici e TPSEE della prova di maturità della sessione ordinaria 2018 di TPSEE, che richiede di affrontare un processo articolato con preallarme, attuatori ON/OFF, acquisizione di sensori, scelta dell’intervallo di campionamento, progettazione delle interfacce e descrizione dell’algoritmo di gestione.

Partiamo però dalle 20 attività.

Come sono costruite le esercitazioni

La struttura delle schede di lavoro rispecchia quelle che in genere consegno ai miei studenti.

Ogni attività sarà presentata con una struttura costante, così da aiutare anche gli studenti che hanno competenze di programmazione ancora deboli.

In ogni post troverete:

  • richiamo teorico iniziale delle istruzioni usate
  • analisi semplificata del problema
  • materiali necessari
  • schema logico di funzionamento
  • diagramma di flusso
  • codice Arduino completo e commentato nel dettaglio
  • spiegazione guidata del programma
  • errori tipici
  • possibili estensioni

Attività 0: prima di programmare, capire bene il testo

Prima ancora di partire con la costruzione del circuito e la programmazione iniziamo con l’Attività 0: la comprensione del testo tecnico, è un problema che si riscontra sempre, soprattutto nella comprensione del testo dell’esame di maturità.

Molto spesso gli studenti si bloccano non perché non sanno programmare, ma perché il testo della prova appare lungo, denso e complesso.
Per questo motivo, prima di scrivere codice, è fondamentale allenarsi a:

  • riconoscere ingressi, uscite, sensori e attuatori
  • distinguere dati misurati e condizioni logiche
  • individuare la sequenza del processo
  • separare la parte hardware dalla parte software
  • … e non ultimo progettare in modo ordinato

Pubblicazione delle soluzioni

Le attività saranno pubblicate progressivamente e in ogni attività lo studente troverà un esercizio aggiuntivo di complessità leggermente superiore rispetto a quello proposto.

Ogni esercizio sarà corredato da diagramma di flusso e codice Mermaid per replicare il diagramma di flusso.

Per favorire il ragionamento autonomo, la soluzione completa verrà resa disponibile dopo qualche giorno dalla pubblicazione dell’esercizio, così da lasciare agli studenti il tempo di provare davvero.

Nota importante

Questa serie di attività è attualmente in costruzione. Nel momento stesso in cui pubblico questo post sto ancora sviluppando e affinando le singole esercitazioni; per questo vi chiedo un po’ di pazienza e comprensione se dovessero essere presenti alcune imprecisioni o aspetti da migliorare. Ogni segnalazione, osservazione o suggerimento sarà quindi molto utile per rendere le schede di lavoro più chiare, efficaci e funzionali.

Naturalmente, quanto propongo non ha la pretesa di esaurire tutti i contenuti necessari per affrontare l’Esame di Stato. Si tratta di una mia selezione di attività, costruita a partire dagli argomenti ricorrenti nelle prove degli anni passati e pensata soprattutto per studenti con competenze di livello medio-base. Per questo motivo le esercitazioni possono essere integrate, adattate o modificate in base alle esigenze della classe, al livello di preparazione degli studenti e alle scelte didattiche del docente.

Di seguito trovate l’indice della serie, che al momento può essere considerato una versione beta, anche se con ogni probabilità resterà molto vicino alla struttura definitiva.
Questa pagina verrà aggiornata progressivamente, aggiungendo di volta in volta i link diretti alle singole esercitazioni.

Indice delle esercitazioni che verranno pubblicate

  • Esercitazione 1 – Pulsante singolo con antirimbalzo, doppio clic, pressione lunga e timeout
  • Esercitazione 2 – Tastiera 4×4 non bloccante con codice di accesso e feedback di errore
  • Esercitazione 3 – Scheduler cooperativo con tre task e supervisione dei tempi
  • Esercitazione 4 – Macchina a stati per un ciclo automatico con START, pausa, allarme e reset
  • Esercitazione 5 – Acquisizione analogica calibrata, filtrata e convertita in grandezza fisica
  • Esercitazione 6 – Controllo a finestra con isteresi, allarme latched e reset
  • Esercitazione 7 – Confronto tra filtro a media mobile e filtro esponenziale
  • Esercitazione 8 – Campionamento temporizzato con array di struct: tempo, valore e stato
  • Esercitazione 9 – Analisi statistica di una sequenza con rilevamento anomalie
  • Esercitazione 10 – Buffer circolare con trend, velocità di variazione e soglia dinamica
  • Esercitazione 11 – Matrice bidimensionale per organizzare campioni di più sensori nel tempo
  • Esercitazione 12 – Frame buffer per matrice LED: icone, animazioni e scorrimento testo
  • Esercitazione 13 – Conteggio impulsi con interrupt e validazione evento
  • Esercitazione 14 – Misura di periodo, frequenza, duty cycle e tempo alto di un segnale PWM
  • Esercitazione 15 – Encoder rotativo con menù parametrico semplificato
  • Esercitazione 16 – Funzioni con parametri passati per indirizzo e restituzione di più risultati
  • Esercitazione 17 – Ordinamento di misure e scambio di valori tramite puntatori
  • Esercitazione 18 – Macchina a stati per un menù su display LCD
  • Esercitazione 19 – Parser di comandi seriali con parametri e risposta strutturata
  • Esercitazione 20 – Mini progetto finale: stazione di monitoraggio completa

Quale sarà la periodicità delle attività? Probabilmente giornaliera, da domani o lunedì prossimo.

Siete pronti per ripassare? 🙂

Multitasking con Arduino – lezione 3/3

Nella scorsa lezione abbiamo visto come gestire un attuatore, un servomotore SG90, la cui rotazione non bloccava l’accensione di un LED controllata da un pulsante. Vediamo ora in questa breve lezione come gestire un sensore di temperatura e umidità DHT11. Nell’esempio che segue abbiamo 4 task che lavorano in multitasking nel seguente modo:

  • TASK 1: Lampeggio LED su D9
  • TASK 2: Pulsante su D2 (INPUT_PULLUP) + debounce -> commuta LED2 su D8
  • TASK 3: Lettura DHT11 su D3 ogni 2000 ms (no blocchi nel loop)
  • TASK 4: Stampa su Serial ogni 1000 ms dei valori letti (se validi)

Nota: il DHT11 è lento mi piace definirlo “capriccioso” 🙂 leggerlo troppo spesso può dare errori. Come già indicato in precedenti post, intervalli da 1–2 sec sono ideali.

Collegamenti

Ricordo che se usate il modulo DHT11 a 3 pin:

  • VCC > 5V
  • GND > GND
  • DATA > D3 (nel codice)

Se invece usate il DHT11 a 4 pin che non è su breakoutboard , serve una resistenza di pull-up (tipicamente 10 kΩ) tra Vcc e DATA.

Per gli esempi è necessario installare la libreria DHT sensor library (Adafruit).

Nello sketch che segue il trucco “da multitasking” è la cache: leggiamo il DHT11 solo ogni 2 s (task 3), ma possiamo stampare i dati ogni 1 s (task 4) senza impegnare troppo il sensore e senza bloccare il loop.

Schema di collegamento

I commenti spiegano il funzionamento del codice. Continua a leggere

Arduino VENTUNO Q: la nuova piattaforma per AI, robotica e attuazione

Arduino ha annunciato VENTUNO Q, una nuova piattaforma descritta come una single-board computer progettata per applicazioni di intelligenza artificiale, robotica e attuazione. Il lancio è avvenuto oggi 9 marzo 2026 sul blog ufficiale Arduino, che la presenta come una soluzione pensata per unire su una sola board capacità di percezione, decisione e controllo del mondo fisico.

Per chi segue l’evoluzione dell’ecosistema Arduino, si tratta di un passaggio interessante: non più solo microcontrollori per prototipazione rapida, ma una piattaforma che punta a coprire anche scenari più avanzati, vicini alla robotica intelligente, alla computer vision on-device e ai sistemi che richiedono AI locale e controllo real-time. Questa lettura è inferenziale, ma coerente con il posizionamento ufficiale dichiarato da Arduino.

Una piattaforma pensata per “percepire, decidere e agire”

Uno dei concetti chiave con cui Arduino presenta VENTUNO Q è l’idea di una piattaforma capace di gestire, nello stesso sistema, l’acquisizione dei dati, l’elaborazione AI e il pilotaggio di attuatori. Il messaggio è chiaro: non soltanto “eseguire modelli”, ma costruire dispositivi in grado di interagire fisicamente con l’ambiente.

Nelle specifiche tecniche Arduino parla infatti di un’architettura “dual-brain“: da una parte un processore Qualcomm Dragonwing IQ8, dall’altra un microcontrollore STM32H5, collegati tramite un bridge RPC. L’obiettivo è separare i compiti di elaborazione complessa da quelli che richiedono tempi di risposta deterministici.

Architettura dual-brain: AI da una parte, controllo real-time dall’altra

Secondo Arduino, il processore principale Dragonwing IQ8 è dedicato ai carichi di lavoro più pesanti, inclusa l’inferenza di reti neurali, mentre lo STM32H5 si occupa delle operazioni a bassa latenza e del controllo in tempo reale. Sul blog ufficiale viene inoltre indicata una capacità fino a 40 dense TOPS (Tera Operations Per Second) per l’accelerazione AI, insieme a 16 GB di RAM e 64 GB di memoria espandibile.

Linux embedded e Arduino Core su Zephyr

VENTUNO Q può eseguire Ubuntu o Debian sul lato applicativo, mentre il microcontrollore real-time usa Arduino Core su Zephyr OS. Questa combinazione è rilevante perché mette insieme un ambiente Linux, più adatto a strumenti evoluti, librerie e workflow AI, con una componente embedded deterministica più vicina alla filosofia del controllo industriale e della robotica.

In termini pratici, ciò potrebbe consentire di sviluppare applicazioni in cui una parte del sistema gestisce visione, audio, interfacce o modelli AI, mentre l’altra mantiene il controllo puntuale di attuatori, encoder, segnali PWM o logiche di sicurezza. La possibilità concreta dipenderà naturalmente da tool, documentazione e maturità dell’ecosistema, ma la direzione indicata da Arduino è questa.

App Lab, Python e integrazione con Edge Impulse

Ovviamente VENTUNO Q si collega ad Arduino App Lab, l’ambiente in grado di unificare sketch Arduino, script Python e flussi di lavoro AI. Sarà possibile anche l’integrazione con Edge Impulse Studio e il supporto a modelli provenienti da Qualcomm AI Hub ed Edge Impulse.

Esempi applicativi: LLM locali, VLM, riconoscimento vocale automatico (ASR), sintesi vocale (TTS), stima di pose e gesture, oltre a funzioni di object tracking offline. Per chi lavora nella didattica o nella prototipazione, questa è forse una delle promesse più interessanti: portare l’AI “vicino” al dispositivo, senza dipendere sempre dal cloud.

Compatibilità hardware: Arduino, Qwiic e Raspberry Pi HAT

Arduino indica una compatibilità piuttosto ampia con diversi ecosistemi hardware. Nello specifico, VENTUNO Q viene presentata come compatibile con shield e carrier Arduino UNO, con i moduli Modulino, con i sensori Qwiic e addirittura con Raspberry Pi HATs.

Questo aspetto è importante perché amplia subito le possibilità di utilizzo: non una board isolata, ma una piattaforma che cerca di inserirsi in ambienti già familiari a maker, scuole, laboratori e sviluppatori. In ambito formativo questo può fare molta differenza, perché riduce la soglia di ingresso per sperimentare.

Connettività e interfacce per robotica ed Edge AI

Fra le caratteristiche che vengono evidenziate compaiono Wi-Fi 6, Bluetooth 5.3, CAN-FD nativo, PWM, GPIO ad alta velocità, connettori per più telecamere MIPI-CSI, audio avanzato, supporto display ed Ethernet 2.5 Gb. Interessantissimo, almeno per me la notizia che VENTUNO Q è ROS 2-ready, elemento che la colloca chiaramente anche nel perimetro della robotica moderna.

Nel complesso, la dotazione sembra andare oltre il classico uso educational di base e si spinge verso applicazioni più articolate: robot di servizio, sistemi di visione, automazione intelligente, interfacce vocali embedded, ispezione visiva e prototipazione preindustriale.

Alcuni scenari d’uso suggeriti da Arduino

Casi d’uso: interfacce vocali offline, sistemi interattivi basati su gesture, robot pick-and-place guidati dalla visione, robot di servizio che seguono le persone, applicazioni con Visual SLAM, monitoraggio intelligente e controllo qualità tramite modelli di visione locale.

Sono esempi significativi perché chiariscono il posizionamento del prodotto: VENTUNO Q non nasce come semplice variante di una board tradizionale, ma come piattaforma per progetti in cui servono insieme sensori, modelli AI, connettività e azione fisica sul mondo reale.

Perché potrebbe essere interessante anche per la scuola

Dal punto di vista didattico, VENTUNO Q potrebbe risultare particolarmente utile nei percorsi che incrociano elettronica, informatica, automazione, robotica e intelligenza artificiale. La presenza di un ambiente Linux, l’apertura verso Python e i workflow AI, unita al controllo real-time, la rende potenzialmente adatta a laboratori interdisciplinari più evoluti rispetto a quelli costruiti con microcontrollori tradizionali.

Naturalmente, molto dipenderà dalla disponibilità effettiva della scheda, dalla documentazione, dai costi, dagli esempi pronti e dalla facilità con cui queste caratteristiche potranno essere tradotte in attività scolastiche. Ma il segnale lanciato da Arduino è netto: l’AI embedded e la robotica intelligente stanno entrando sempre più chiaramente anche nel loro ecosistema.

Disponibilità

Arduino indica che VENTUNO Q sarà disponibile prossimamente tramite Arduino Store e presso rivenditori ufficiali come DigiKey, Farnell, Macfos, Mouser e RS. Al momento del lancio il prodotto è quindi annunciato come in arrivo, non ancora come board immediatamente acquistabile dal catalogo standard con una pagina e-commerce completa.

… cosa dire di più
sono curiosissimo ed impaziente di poterlo utilizzare 🙂

Con VENTUNO Q, Arduino sembra voler spingere il proprio ecosistema verso una nuova fascia progettuale: quella in cui non basta più leggere sensori e accendere attuatori, ma serve una piattaforma capace di analizzare, decidere e agire in locale. È un passaggio che guarda con decisione alla convergenza tra AI on-device, robotica e controllo embedded.

Resta ora da vedere come questa piattaforma si comporterà nella pratica, quali strumenti saranno davvero disponibili fin da subito e quanto sarà accessibile a scuole, maker e laboratori. Ma come annuncio, VENTUNO Q è sicuramente uno dei segnali più interessanti arrivati da Arduino negli ultimi tempi.

Fonte ufficiale Arduino: annuncio del 9 marzo 2026 sul blog Arduino e pagina prodotto ufficiale.

Scheda didattica – Ponte autoportante di Leonardo: dal Codice Atlantico alla stampa 3D

In queste settimane alcune classi seconde del nostro istituto svolgeranno un progetto presso l’LTO che unisce storia dell’ingegneria, fisica e laboratorio. Per accompagnare l’attività ho progettato insieme alla mia collega di Fisica una serie di lezioni che permetteranno agli studenti di realizzare un modellino stampabile in 3D del celebre ponte autoportante di Leonardo: una struttura che si monta senza colla, senza chiodi e senza corde, sfruttando esclusivamente geometria, attrito e distribuzione dei carichi.

L’idea è semplice: fornire agli studenti un percorso guidato di modellazione e stampa 3D, in cui ciascuno possa costruirsi il proprio ponte e personalizzarlo (lunghezza e sezione dei moduli), e probabilmente, tempo permettendo, si tenterà di realizzare una prova pratica: posizionare il ponte tra due banchi e farvi transitare un piccolo robot (probabilmente un mBot2) per verificare stabilità e capacità di carico.
Poiché gli studenti non hanno mai modellato in 3D e non sanno usare la stampante 3D ho provveduto a realizzare un modellino del ponte in modo che durante la fase di progettazione abbiano idea di cosa dovranno realizzare.

Verranno realizzate due versioni, una in legno di dimensioni grandi ed una versione da far realizzare agli studenti stampata in 3D.

Leonardo da Vinci (1452–1519) studiò e disegnò numerose soluzioni di ponti “rapidi” e trasportabili, utili in contesti civili e militari. Tra questi, il più affascinante per essenzialità è proprio il ponte militare in legno autoportante, documentato nel Codice Atlantico (Codex Atlanticus), la grande raccolta di fogli con appunti e disegni conservata presso la Biblioteca Ambrosiana.

Nel foglio comunemente citato per questo progetto (ad esempio f. 71 recto) si riconosce una struttura costruita con travi incrociate, dove ogni elemento “regge e viene retto” dagli altri: un principio che oggi, in ambito strutturale, è vicino ai sistemi reciproci (reciprocal frames).

Nel mio caso ho ricostruito il modello basandomi sul disegno e su ricostruzioni simili sviluppate da altri maker e divulgatori online, ma ho scelto una semplificazione didattica molto utile: il ponte è realizzato soltanto con due moduli ripetitivi che sono stampati in sezione in modo da accelerare la stampa, le due falde dei rispettivi moduli saranno incollate insieme.

Per chi fosse interessato e desidera realizzare il ponte potete prelevare i sorgenti per la stampa 3D seguendo il link.

Di seguito la sintesi della progettazione didattica. Agli studenti verranno consegnate schede di lavoro specifiche.


Obbiettivi didattici

Fisica

  • equilibrio statico e condizioni di stabilità
  • attrito statico vs dinamico (quando “tiene”, quando “parte”)
  • forze interne: compressione, taglio, (cenni di) flessione
  • distribuzione dei carichi e percorsi di forza nella struttura
  • differenza tra struttura “che funziona per forma” e struttura “che funziona per fissaggi”

Tecnologia e making

  • progettare pensando alla stampa 3D
  • gestione errori: ritiro, tolleranze, orientamento, adesione al piatto
  • iterazione: prototipo > test > modifica > nuova stampa

Matematica e geometria applicata

  • proporzioni, scale, vincoli dimensionali
  • relazione tra sezione e rigidezza
  • ragionamento parametrico: una variabile cambia il comportamento del sistema

Competenze trasversali

  • lavoro in team (ruoli: modellatore, slicer, collaudatore, documentatore)
  • documentazione tecnica (foto, note, problemi riscontrati, versione del modello)
  • pensiero critico: “perché questa variante regge meglio?” con dati e osservazioni

Percorso laboratoriale dalla modellazione alla stampa: struttura della lezione

Ecco una traccia che gli studenti possono seguire (in modo guidato, ma con margine di personalizzazione):

  1. Lettura del problema (reverse engineering)
    • Che cosa deve fare il ponte?
    • Da quali elementi è composto?
    • Quale parte è ripetuta e quale “regola” l’incastro?
  2. Modellazione dei due moduli (CAD)
    • Disegno 2D di base > estrusione
    • Inserimento di incastri/sedi
    • Controllo quote critiche (tolleranze minime per montaggio)
  3. Parametri di personalizzazione
    • Lunghezza del modulo (ponte più o meno lungo)
    • Sezione (spessore/larghezza: rigidità vs consumo materiale)
    • Eventuali micro-varianti: smussi, arrotondamenti, texture
  4. Esportazione STL e slicing
    • orientamento consigliato
    • niente supporti (se progettato correttamente)
    • scelta infill/perimetri in funzione della rigidità richiesta
  5. Stampa e controllo qualità
    • verifica dimensionale rapida (soprattutto incastri)
    • prove: i pezzi scorrono? si incastrano troppo? sono laschi?
  6. Montaggio e collaudo
    1. montaggio su banco
    2. “ponte tra due banchi” (campata reale)
    3. test con carico progressivo

Perché il ponte riesce a stare in piedi

Questo ponte funziona perché combina tre idee chiave:

  1. Incastro geometrico (vincolo di forma)
    I pezzi sono progettati per “appoggiarsi” in modo coerente: la forma guida l’assemblaggio e impedisce che gli elementi scivolino via subito.
  2. Attrito tra le superfici
    Una volta in posizione, il peso dei pezzi aumenta la forza normale tra le parti e quindi l’attrito, che ostacola lo scorrimento.
  3. Percorso dei carichi (load path)
    Il carico applicato sul ponte non grava su un singolo elemento: viene “ridistribuito” lungo l’intreccio delle travi, generando una specie di arco/volta discreta. Questo rende la struttura sorprendentemente rigida rispetto al materiale impiegato.

Dal disegno storico al modello 3D: due moduli, infinite varianti

La scelta di lavorare con due soli moduli ripetitivi è perfetta per una lezione di modellazione:

  • riduce la complessità (due pezzi “master” invece di molti diversi);
  • rende immediata la logica della modularità (un concetto chiave dell’ingegneria);
  • abilita la progettazione parametrica: cambi una quota e ottieni un ponte diverso.

Perché sezionare i pezzi

Uno dei moduli ha una dimensione “lunga” che, su molte stampanti, può portare a:

  • distacco dal piatto (warping o scarsa adesione),
  • vibrazioni/infill poco uniforme su elementi sottili,
  • fallimenti verso fine stampa (quando ormai si è perso tempo).

Per questo ho adottato una soluzione semplice e molto didattica: sezionare trasversalmente il pezzo nella direzione più lunga. In pratica:

  • ottengo due parti più “compatte” e stabili in stampa;
  • riduco il rischio di sollevamento degli spigoli;
  • accelero la produzione di set completi per la classe.

È anche un ottimo pretesto per parlare di orientamento di stampa, adesione al piano, ritiro termico e scelte di progettazione “per la manifattura” (design for manufacturing).

Buon Making a tutti 🙂