Archivi categoria: corsi

STEAM BOX della Creatività

Tra le varie STEAM BOX che sto progettando, ce ne sono alcune pensate proprio per lavorare su questi aspetti: aiutano a capire che cosa intendiamo per creatività, come ci si può allenare ad esserlo e in che modo si può sviluppare il pensiero divergente in modo strutturato ma giocoso.

Appena apri la STEAM BOX della Creatività trovi una serie di piccole bustine: in ognuna, solo 6 mattoncini LEGO. Da lì parte un viaggio alla scoperta di cosa vuol dire davvero essere creativi, grazie alla Lego Duck Challenge. Con una serie di esercizi semplici e accessibili, realizzati in autonomia ed in gruppo, potrete sperimentare in prima persona come, a partire dagli stessi pezzi, nascano anatre completamente diverse: un modo concreto per parlare di innovazione, gestione del cambiamento, punti di vista e unicità.

Ho parlato della Lego Duck Challenge in modo più approfonditamente in questo articolo:
LEGO e creatività didattica: dalla Duck Challenge al Coding collaborativo

Perché è così potente in ambito educativo

Rispetto a una semplice “attività con i LEGO”, questa proposta lavora su diversi piani:

Creatività sotto vincolo
Pochi pezzi e tempo limitato costringono ad abbandonare l’idea di “progetto perfetto” e ad accettare l’esplorazione rapida, l’errore, il tentativo.

Divergenza e unicità
Il confronto tra le anatre diventa un’occasione per visualizzare la diversità di approccio: ognuno interpreta il compito in modo personale. Questo è un punto di partenza straordinario per parlare di creatività, ma anche di valutazione e aspettative.

Collaborazione e dialogo
Dopo la fase individuale, è possibile passare a una fase di gruppo: costruire un’anatra “di squadra” con gli stessi 6 pezzi obbliga a discutere, argomentare, cedere, mediare. È un piccolo laboratorio di team working in miniatura.

Metacognizione
Le domande finali del debriefing (“Cosa hai pensato quando…?”, “Cosa cambieresti la prossima volta?”, “In che cosa la tua anatra ti rappresenta?”) aiutano i partecipanti a osservare come hanno ragionato, non solo cosa hanno costruito.

Dalla Duck Challenge al Coding collaborativo
Nell’articolo che ho citato sopra, propongo un’estensione naturale dell’attività: collegare la Duck Challenge al Coding, ad esempio con una scheda BBC micro:bit che funge da cronometro per i 60 secondi di costruzione.

Tutto ciò permette di mostrare in modo molto concreto come:

  • una semplice attività con i mattoncini possa trasformarsi in percorso STEAM completo;
  • sia possibile passare dalla creatività “manuale” alla progettazione algoritmica;
  • il Coding possa avere una funzione sociale e cooperativa, non solo tecnica.

Se volete partecipare al corso: “STEAM-BOX: Il laboratorio STEAM in valigetta” seguite il LINK.

Buona creatività a tutti 🙂

STEAM-BOX: Il laboratorio STEAM in valigetta

Quattro valigette componibili, basate su making, gamification, sensori e AI, per realizzare attività personalizzabili per ogni classe e disciplina.

STEAM-BOX è un corso online dedicato ai docenti della secondaria di I e II grado che trasforma una semplice valigetta di cartone in un vero laboratorio STEAM portatile. Partendo dal making e arrivando a sensori, robotica, piccole applicazioni di intelligenza artificiale “leggera” e dinamiche di gioco/escape, il percorso mostra come progettare attività coinvolgenti e personalizzabili per qualsiasi disciplina, anche senza competenze tecniche avanzate. Sono previsti 4 incontri in webinar (per un totale di 8 ore), con materiali operativi, template e schede riutilizzabili direttamente in classe.

Durante il corso i partecipanti impareranno a progettare e costruire la propria valigetta: struttura in cartone rinforzata, pannello frontale modulare con LED, pulsanti e jack per sensori, coperchio “attivo” per puzzle e meccanismi di gioco. Da lì si passerà a esempi concreti di attività: micro-indagini con sensori e data logging, piccole sfide di robotica “dal coperchio”, escape room analogico-digitali e utilizzo consapevole dell’IA in classe, con particolare attenzione all’inclusione, alla valutazione formativa e alla documentazione del lavoro degli studenti.

Dietro le quinte 🙂

Progetto HÉLIOS – Faro Stratosferico

Siamo nel 2076, un faro stratosferico (Faro N-7) è fuori uso e solo una console remota può riattivarlo. Ogni gruppo di studenti controlla un modulo diverso della console (Energia, Calibrazione, Stabilità, Segnale, Sicurezza, Sincronismo). A ciascun gruppo viene assegnata una Carta-Quesito collegata a una specifica tematica della disciplina scelta dal docente (es. fisica, storia, lingue, ecc.): se la risposta è corretta, il gruppo imposta il proprio interruttore su ON, altrimenti lo lascia su OFF. Inserita la chiave nel pannello SYSTEM ACTIVATION e premuto START, gli studenti hanno poco tempo per coordinarsi e, alla fine, premere CHECK: se tutti i moduli sono nella configurazione giusta, il sistema HÉLIOS si riavvia; in caso contrario, avranno un secondo e ultimo tentativo prima dell’arresto di sicurezza.
Questa è solo una delle tante attività che verranno presentate: durante il corso vedremo come costruire meccanismi simili anche con materiali poveri (carta, cartone, pulsanti, interruttori, lampadine) e, quando utile, con piccola elettronica low-cost, così che ogni docente possa adattare facilmente le idee alla propria realtà di classe.

Calendario del corso

  • Martedì 25 novembre 2025 – Dalle 17.00 alle 19.00
  • Mercoledì 3 dicembre 2025 – Dalle 17.00 alle 19.00
  • Martedì 9 dicembre 2025 – Dalle 17.00 alle 19.00
  • Mercoledì 17 dicembre 2025 – Dalle 17.00 alle 19.00

Per maggiori informazioni sul programma e l’iscrizione seguite il LINK.

Vi aspetto 🙂

Attività STEAM con carta, cartone e coding – 5ª edizione

Sono sinceramente lusingato: il corso “Attività STEAM con carta, cartone e coding” arriva alla sua 5ª edizione. Credo che questa continuità sia merito della forte componente laboratoriale e della presenza di proposte immediatamente spendibili in classe, che i docenti possono portare ai propri studenti già dal giorno successivo.

Anche in questa nuova edizione porterò attività inedite, tutte sperimentate con studenti e insegnanti, che spaziano:

  • dal gaming (meccaniche di gioco per attivare partecipazione e feedback),
  • all’Intelligenza Artificiale (IA) per la didattica,
  • passando per il coding sia plugged sia unplugged, sempre con materiali semplici e a basso costo.

Cosa troverai nel corso

  • Laboratori guidati passo-passo e idee pronte all’uso.
  • Attività modulabili per tempi, livelli e discipline.
  • Suggerimenti per valutazione, inclusione e gestione della classe.

A chi si rivolge

Docenti della scuola primaria e secondaria, educatori e formatori che desiderano introdurre o potenziare attività STEAM con un approccio concreto, creativo e sostenibile.

Iscrizioni e dettagli

Tutte le informazioni (programma, calendario e iscrizione) sono disponibili qui:

Pagina ufficiale del corso su Tecnica della Scuola

Ti aspetto per costruire insieme percorsi STEAM efficaci, coinvolgenti e subito applicabili in aula e in laboratorio.

Buon Making a tutti 🙂

Home Assistant a scuola: la guida “a puntate” per elettronica & automazione – 02


Prima di iniziare con l’installazione del software procediamo con la configurazione base dell’hardware, nel mio caso dispongo a scuola di un Raspberry Pi 4 Model B – 4 GB RAM e su questa versione opereranno gli studenti, ovviamente la scelta di un modello superiore con maggior memoria è consigliabile, ciò che ho fatto per la mia versione casalinga con un un Raspberry Pi 5 – 8 GB RAM.

Questa prima parte è estremamente semplice e richiede pochissime competenze tecniche, installeremo le alette di raffreddamento e la ventola di raffreddamento collegandola ai pin di alimentazione che troviamo sulla GPIO.

Note per chi inizia: Cos’è la GPIO del Raspberry Pi

GPIO = General Purpose Input/Output: è il pettine a 40 pin sulla scheda che vi permette di leggere/scrivere segnali digitali e, quando necessario, usare funzioni: come I²C, SPI, UART, PWM ecc. Sulla Pi 4 solo 28 sono utilizzabili per la programmazione. La GPIO del Pi 4 è identica, per posizione e funzioni base, a quello dei modelli precedenti con header a 40 vie: quindi HAT e cablaggi restano compatibili. Al termine della guida è indicato la piedinatura della GPIO ed i pin a cui connettere la ventola di raffreddamento.

Raspberry Pi 4 offre molta più potenza dei modelli precedenti e, sotto carico sintetico (cioè durante test artificiali che stressano intenzionalmente CPU/GPU per misurare il “la situazione peggiore di utilizzo”), può scaldare rapidamente fino a innescare il throttling (taglio automatico della frequenza per protezione termica). Le misure ufficiali con il firmware iniziale mostrano picchi fino a 72,1 °C in 60 s e l’avvio del throttling dopo circa 65 s; gli aggiornamenti firmware successivi hanno ridotto consumi/temperature e posticipato il momento in cui il taglio di frequenza interviene, ma in carichi intensi il rischio resta. Per chi usa il Pi 4 in modo continuativo (es. Home Assistant), aggiungere alette di raffreddamento + ventola aiuta a mantenere la CPU sotto soglia, evitando cali di prestazioni e migliorando stabilità e longevità del sistema.

Di seguito due immagini della scheda realizzate con la termocamera in fase di test.

Per maggiori informazioni vi rimando all’articolo tecnico che trovate sul sito Rapberrypi.org

Situazione in fase di riposo

Raspberry Pi 4 VLI, SDRAM (idle)

Situazione in fase di load

Raspberry Pi 4 VLI, SDRAM (load)

Di cosa abbiamo bisogno

  • Kit dissipatore in alluminio per Raspberry Pi 4 (molti includono doppia ventola + thermal pad + viteria).
  • Cacciavite a croce di piccole dimensioni.
  • Alcol isopropilico + panno morbido (per pulire i chip prima del fissaggio delle alette).
  • Facoltativo: fascette/clip per gestire i cavi.

Sicurezza e prevenzione

Sembra banale, ma meglio specificarlo, soprattutto per i giovani studenti che iniziano attività laboratoriali:

  1. Scollegare l’alimentazione del Raspberry Pi.
  2. Lavorare su superficie pulita; toccate una parte metallica messa a terra per scaricare l’elettricità statica (se disponete di un braccialetto antistatico meglio).
  3. Pulire delicatamente CPU/RAM/controller USB con un panno leggermente inumidito di alcol isopropilico e lascia asciugare.

Applicare le alette di raffreddamento

Sono acquistabili su qualsiasi store online, andranno montate sulla CPU, sulla RAM e sul Bridge PCI e USB 3.0. Incollate, come indicato nelle foto che seguono, le alette di raffreddamento, ogni aletta è dotata di nastro biadesivo.

Serraggio e alimentazione della ventola

In funzione del kit che avete acquistato o stampato in 3D la ventola di raffreddamento, alimentata a 5V è da fissare sulla struttura mediante 4 viti autofilettanti.

L’alimentazione della ventola avviene direttamente connettendo direttamente i pin di alimentazione della GPIO secondo quanto indicato dall’immagine che segue.

Poiché potrebbe servire in altre applicazioni condivido la mappa della GPIO del Raspberry Pi 4.

Per alimentare la ventola utilizzerò il +5V, preso sul pin 2 ed il pin 6 per il GND, come indicato nell’immagine che segue (datasheet Raspberry Pi 4)

Nell’immagine che segue è ben evidente il collegamento:

Procedere al servaggio della ventola al vetro supporto.

Buon Making a tutti 🙂

Lezione 11 – Corso di Elettronica Creativa con Arduino Sensor Kit

Accelerometro

L’accelerometro del Sensor Kit è un “sensore di movimento” a tre assi (X, Y, Z) capace di misurare come cambia la velocità di un oggetto nello spazio. Anche quando è fermo, l’accelerometro non rileva “zero accelerazione” in quanto misura la gravità terrestre, circa 1 g (≈ 9,81 m/s²). Questa caratteristica è utilissima perché ci permette sia di capire se e quanto ci stiamo muovendo, sia di stimare l’inclinazione del modulo rispetto alla verticale. In pratica: se appoggio la scheda piatta sul banco, il valore lungo Z sarà vicino a 1 g; se lo incliniamo, la gravità si “ridistribuisce” tra X e Y e possiamo ricavare l’angolo di inclinazione.

Con i dati che fornisce l’accelerometro possiamo fare molte cose: visualizzare scosse e vibrazioni (come un mini sismografo), creare un avviso di caduta, progettare giochi di equilibrio o semplicemente tracciare i movimenti sulla Serial Plotter. In questa lezione impareremo a leggere le tre componenti, a filtrare il rumore e a trasformare quei numeri in azioni concrete (LED, buzzer, messaggi su OLED).

Un briciolo di teoria

L’accelerometro misura accelerazioni lungo X, Y, Z e come dicevo sopra, da fermo “vede” la gravità (~1 g ≈ 9,81 m/s²).

Il modulo del vettore accelerazione è:

Con il dispositivo quasi fermo, possiamo stimare l’inclinazione rispetto alla verticale usando solo la gravità:

che rappresenta l’angolo rispetto all’asse Z (in gradi).

Caratteristiche tecniche (per i più esperti)

  • Tipo sensore: MEMS accelerometro triassiale digitale.
  • Interfacce: I²C e SPI digitali (il modulo Grove è normalmente usato in I²C sul Sensor Kit).
  • Indirizzo I²C: di default 0x19, commutabile a 0x18 (pin SA0/SDO a GND).
  • Campo di misura (full-scale): ±2 g, ±4 g, ±8 g, ±16 g (selezionabile via registro).
  • Risoluzione dati: uscita fino a 16-bit; modalità operative low-power/normal/high-resolution (fino a 12-bit effettivi).
  • Frequenza di campionamento (ODR): da 1 Hz fino a 5.3 kHz (a seconda della modalità).
  • Funzioni integrate:
    • 2 generatori di interrupt programmabili (motion, free-fall, wake-up).
    • Rilevamento orientamento 6D/4D, self-test, FIFO 32 campioni.
  • Alimentazione (chip): 1.71–3.6 V; consumo molto basso (fino a ~2 µA in ultra-low-power). Il modulo Grove è compatibile 3 V / 5 V.
  • Intervallo di temperatura operativa: −40 °C … +85 °C.

Informazioni utili per l’uso nell’Arduino Sensor Kit

  • Con la libreria Arduino_SensorKit.h leggete le tre componenti con Accelerometer.readX() / readY() / readZ(); i valori restituiti sono interpretati in g (gravità ≈ 1 g a riposo).
  • Il modulo Grove usato nel Sensor Kit documenta esplicitamente indirizzi I²C, range e compatibilità 3V/5V, utile se sorgono conflitti su bus I²C o serve cambiare indirizzo.

Collegamenti

Per quanto riguarda i collegamenti è sufficiente connettere il sensore ad uno degli ingressi I²C della Base Shield.

Esempio 01 – Lettura accelerometro 3 assi

/*
  Prof. Maffucci Michele
  02.10.2025
  Lettura accelerometro 3 assi – Arduino Sensor Kit
*/

#include <Arduino_SensorKit.h>   // Libreria unica per i moduli del Sensor Kit

const unsigned long intervalloMs = 500;  // intervallo tra una stampa e la successiva

void setup() {
  // Inizializzazione porta seriale per inviare i dati al PC
  Serial.begin(9600);

  // ATTENZIONE:
  // while(!Serial); serve ad ASPETTARE che il monitor seriale sia stato aperto
  // (utile sulle schede con USB nativa, esempio: Arduino UNO R4 WiFi, Leonardo, MKR).
  // Così non "perdi" le prime stampe.
  // Su schede senza USB nativa non è necessario e puoi rimuoverlo.
  while (!Serial) { ; }

  // Avvio dell'accelerometro a 3 assi
  Accelerometer.begin();
}

void loop() {
  // Lettura delle tre componenti di accelerazione (in g)
  float accelX = Accelerometer.readX();  // Asse X
  float accelY = Accelerometer.readY();  // Asse Y
  float accelZ = Accelerometer.readZ();  // Asse Z

  // Stampa in formato semplice: x:..  y:..  z:..
  Serial.print("x: "); 
  Serial.print(accelX, 3);   // 3 decimali per leggibilità
  Serial.print("  ");

  Serial.print("y: "); 
  Serial.print(accelY, 3);
  Serial.print("  ");

  Serial.print("z: "); 
  Serial.println(accelZ, 3);

  delay(intervalloMs);
}

Esempio 02: Accelerometro – Stampa su Serial Monitor e display OLED

Visualizzazione delle componenti x, y e z dell’accelerazione su Serial Monitor e display OLED

/*
  Prof. Maffucci Michele
  02.10.2025
  Lettura accelerometro 3 assi – Arduino Sensor Kit
  Stampa su Serial Monitor e display Oled
*/

#include <Arduino_SensorKit.h>  // Libreria unica per i moduli del Sensor Kit

const unsigned long intervalloMs = 500;  // intervallo tra una stampa e la successiva

void setup() {
  // Inizializzazione porta seriale per inviare i dati al PC
  Serial.begin(9600);

  // ATTENZIONE:
  // while(!Serial); serve ad ASPETTARE che il monitor seriale sia stato aperto
  // (utile sulle schede con USB nativa, esempio: Arduino UNO R4 WiFi, Leonardo, MKR).
  // Così non "perdi" le prime stampe.
  // Su schede senza USB nativa non è necessario e puoi rimuoverlo.
  while (!Serial) { ; }

  // Avvio dell'accelerometro a 3 assi
  Accelerometer.begin();
  Oled.begin();
  // Inizializza il display OLED.
  // Fa partire la comunicazione I2C e manda al display la sequenza di avvio.
  // Senza questa riga lo schermo non mostra nulla.

  Oled.setFlipMode(true);
  // Ruota il contenuto di 180° (utile se lo vedi capovolto).
  // Se nel tuo caso appare già dritto, puoi mettere false: Oled.setFlipMode(false);

  Oled.setFont(u8x8_font_chroma48medium8_r);
  // Sceglie il font (carattere) 8x8.
  // Con un font 8x8 il display 128x64 si comporta come una griglia 16 colonne × 8 righe.
  // Significa che setCursor(colonna, riga) userà numeri tra 0..15 (colonne) e 0..7 (righe).

  Oled.clear();
  // Pulisce lo schermo (cancella tutto quello che c’era prima).
}

void loop() {
  // Lettura delle tre componenti di accelerazione (in g)
  float accelX = Accelerometer.readX();  // Asse X
  float accelY = Accelerometer.readY();  // Asse Y
  float accelZ = Accelerometer.readZ();  // Asse Z

  // Stampa in formato semplice: x:..  y:..  z:..
  Serial.print("x: ");      // stampa la stringa x: su Serial Monitor
  Serial.print(accelX, 3);  // 3 decimali per leggibilità
  Serial.print("  ");

  Serial.print("y: ");      // stampa la stringa y: su Serial Monitor
  Serial.print(accelY, 3);  // 3 decimali per leggibilità
  Serial.print("  ");

  Serial.print("z: ");        // stampa la stringa z: su Serial Monitor
  Serial.println(accelZ, 3);  // 3 decimali per leggibilità

  Oled.setCursor(0, 0);           // colonna 0, riga 0
  Oled.println("ACCELERAZIONE");  // stampa la stringa e va a capo

  Oled.setCursor(0, 2);   // colonna 0, riga 2
  Oled.print("x: ");      // stampa la stringa x:
  Oled.print(accelX, 3);  // stampa la componente x dell'accelerazione con 3 cifre decimali

  Oled.setCursor(0, 3);   // colonna 0, riga 3
  Oled.print("y: ");      // stampa la stringa y:
  Oled.print(accelY, 3);  // stampa la componente y dell'accelerazione con 3 cifre decimali
  Oled.refreshDisplay();

  Oled.setCursor(0, 4);   // colonna 0, riga 4
  Oled.print("z: ");      // stampa la stringa z:
  Oled.print(accelZ, 3);  // stampa la componente z dell'accelerazione con 3 cifre decimali
  Oled.refreshDisplay();

  delay(intervalloMs);
}

Esempio 03: Accelerometro – Uscita per Serial Plotter (3 curve: X, Y, Z)

Stampa i tre assi con etichette e tab in un’unica riga per campione, in questo modo l’IDE mostra tre curve (X, Y, Z).

/*
  Prof. Maffucci Michele
  02.10.2025
  Accelerometro – Uscita per Serial Plotter (3 curve: X, Y, Z)

  Nota: una riga = un campione; valori etichettati e separati da TAB -> 3 curve nel Plotter.
*/

#include <Arduino_SensorKit.h&gt

const unsigned long periodoCampionamentoMs = 10;  // circa 100 Hz (riduci/aumenta a piacere)

void setup() {
  Serial.begin(115200);
  // Attende l'apertura del Monitor/Plotter Seriali sulle schede con USB nativa
  while (!Serial) { ; }

  Accelerometer.begin();

  // Messaggio di avvio (facoltativo)
  Serial.println("Traccio X,Y,Z (g) - dati GREZZI (nessun filtro)");
}

void loop() {
  // Letture grezze in g
  float x = Accelerometer.readX();
  float y = Accelerometer.readY();
  float z = Accelerometer.readZ();

  // Stampa “label:valore” separati da TAB → il Plotter disegna tre curve
  Serial.print("X:");
  Serial.print(x, 3);
  Serial.print('\t');
  Serial.print("Y:");
  Serial.print(y, 3);
  Serial.print('\t');
  Serial.print("Z:");
  Serial.println(z, 3);

  delay(periodoCampionamentoMs);
}

Versione per esperti

Esempio 04: Accelerometro – Uscita per Serial Plotter (3 curve: X, Y, Z) con filtro passa-basso

Come avete potuto notare nella versione precedente le curve delle tre componenti dell’accelerazione erano seghettate e venivano rappresentate anche piccoli tremolii.

Per evitare questo problema useremo nello sketch che segue un filtro IIR (passa-basso) che smusserà il rumore.

Quali sono i vantaggi nell’utilizzo di un filtro passa basso:

  • Rumore: piccole variazioni veloci e indesiderate nei dati (tremolio della mano, vibrazioni del banco, disturbi elettrici).
  • Passa-basso: un filtro che lascia passare i cambiamenti lenti (il “trend” reale del movimento) e attenua i cambiamenti veloci (dovuti al rumore).
  • IIR (Infinite Impulse Response): significa che l’uscita del filtro dipende sia dal valore attuale sia dall’uscita precedente. In pratica: il filtro “ricorda” un po’ del passato -> è una media mobile esponenziale.

Formule per ogni asse:

uscita_filtrata(t) = α * ingresso(t) + (1−α) * uscita_filtrata(t−1)

α è un numero tra 0 e 1:

  • α piccolo (es. 0.1) > molto liscio (tanto filtraggio) ma più lento a seguire i cambiamenti.
  • α grande (es. 0.6) > meno liscio (meno filtraggio) ma più reattivo.

In sintesi:
scegliere α in base al compromesso “più liscio vs più rapido”.

/*
  Prof. Maffucci Michele
  02.10.2025
  Accelerometro - Uscita per Serial Plotter (3 curve: X, Y, Z) con filtro IIS (passa-basso)

  Note:
  - Il Serial Plotter IDE riconosce coppie "etichetta:valore" sulla stessa riga,
    separate da TAB. Ogni riga = un campione nel tempo.
*/

#include <Arduino_SensorKit.h&gt

const unsigned long periodoCampionamentoMs = 10;  // circa 100 Hz
const bool usaFiltro = true;                      // metti false se vuoi i dati grezzi
const float alfa = 0.2;                           // 0..1 (più piccolo = più filtrato)

float xF = 0, yF = 0, zF = 0;  // stati del filtro

void setup() {
  Serial.begin(115200);

  // Serve ad attendere l'apertura del Monitor/Plotter Seriali sulle schede con USB nativa,
  // così non perdete le prime stampe (su UNO "classico" puoi toglierlo senza problemi).
  while (!Serial) { ; }

  Accelerometer.begin();

  // (Facoltativo) riga di "header" informale: non necessaria, ma utile a chi guarda il log
  Serial.println("Pronto: traccio X,Y,Z (g) su Serial Plotter");
}

void loop() {
  // Letture in g
  float x = Accelerometer.readX();
  float y = Accelerometer.readY();
  float z = Accelerometer.readZ();

  if (usaFiltro) {
    // Filtro IIR (passa-basso) molto semplice per smussare il rumore
    xF = alfa * x + (1.0f - alfa) * xF;
    yF = alfa * y + (1.0f - alfa) * yF;
    zF = alfa * z + (1.0f - alfa) * zF;

    // Stampa "label:valore" separati da TAB > tre curve nel Plotter
    Serial.print("X:");
    Serial.print(xF, 3);
    Serial.print('\t');
    Serial.print("Y:");
    Serial.print(yF, 3);
    Serial.print('\t');
    Serial.print("Z:");
    Serial.println(zF, 3);
  } else {
    Serial.print("X:");
    Serial.print(x, 3);
    Serial.print('\t');
    Serial.print("Y:");
    Serial.print(y, 3);
    Serial.print('\t');
    Serial.print("Z:");
    Serial.println(z, 3);
  }

  delay(periodoCampionamentoMs);
}

Analizziamo nel dettaglio la parte del filtro.

xF = alfa * x + (1.0f - alfa) * xF;
yF = alfa * y + (1.0f - alfa) * yF;
zF = alfa * z + (1.0f - alfa) * zF;

xF = alfa * x + (1.0f - alfa) * xF;

  • x è il dato grezzo appena letto dall’accelerometro sull’asse X.
  • xF è il dato filtrato (uscita del filtro) per l’asse X.
  • alfa * x prende una frazione del dato nuovo (quanto “peso” dai alla misura attuale).
  • (1.0f - alfa) * xF prende una frazione del valore filtrato precedente (la “memoria”).
  • La somma dei due termini fornisce un valore ammorbidito: meno sensibile ai picchi improvvisi.

Nota sul suffisso f: indica un float letterale (utile per evitare promozioni a double in alcune piattaforme).

yF = alfa * y + (1.0f - alfa) * yF;

  • Identico ragionamento, ma applicato all’asse Y: nuova misura y + memoria del filtrato yF.
  • Mantieni alfa uguale sugli assi per coerenza visiva nel Plotter.

zF = alfa * z + (1.0f - alfa) * zF;

  • Stessa cosa per l’asse Z: la componente verticale (spesso contiene circa 1 g).
  • Filtrare Z aiuta a vedere meglio oscillazioni lente e a ridurre tremolii.

Qualche nota pratica

  1. Inizializzazione: se impostate xF = yF = zF = 0 all’inizio, i primi campioni possono “salire” gradualmente verso il valore reale (breve transitorio). Se volete partire subito “allineati”, potete inizializzare xF=yF=zF al primo dato letto.
  2. Scelta di alfa:
    0.1-0.3 > grafico molto liscio (meno rumore), risposta più lenta.
    0.4-0.7 > più reattivo, ma un po’ più “seghettato”.

Buon Coding a tutti 🙂