Archivi tag: coding

Corso di Processing – lezione 10

Variabili in Processing: dichiarazione, tipi e utilizzo

Una variabile è uno spazio di memoria con un nome, in cui possiamo memorizzare dati da usare e modificare nel corso del nostro programma. In Processing, le variabili sono fondamentali per personalizzare il comportamento degli oggetti grafici, mantenere lo stato del programma, contare, animare, verificare condizioni e molto altro.

1. Cos’è una variabile?

Potete immaginare una variabile come una scatola etichettata in cui potete inserire (e cambiare) un valore. Ogni scatola ha:

  • un nome
  • un tipo di dato
  • un valore (che può cambiare)

Sintassi base:

1tipo nome = valore;

Esempio:

1int lato = 50; // dichiara una variabile intera chiamata "lato" e le assegna il valore 50

2. Tipi principali di variabili in Processing

Numeri interi – int

Valori numerici senza decimali.

Numeri con virgola – float

Numeri decimali.

1float trasparenza = 127.5;

Valori logici – boolean

Può essere solo true (vero) o false (falso).

1boolean attivo = true;

Testi – String

Sequenze di caratteri tra virgolette.

1String saluto = "Ciao mondo!";

3. Usare variabili per disegnare

Possiamo usare le variabili per controllare dimensioni, posizione, colore, e altri aspetti grafici.

Esempio: dimensione variabile per un cerchio

1int diametro = 100;
2 
3void setup() {
4  size(400, 400);
5  background(255);
6  fill(0, 150, 255);
7  ellipse(width/2, height/2, diametro, diametro);
8}

Modifica il valore di diametro per vedere come cambia il disegno.

4. Variabili e animazioni

Le variabili possono essere aggiornate nel tempo per creare un movimento.

Esempio: far muovere un cerchio

1float x = 0;
2 
3void setup() {
4  size(400, 400);
5}
6 
7void draw() {
8  background(255);
9  fill(255, 0, 0);
10  ellipse(x, 200, 50, 50);
11  x = x + 2; // ogni frame aumenta la posizione
12}


Continua a leggere

Corso di Processing – lezione 09

Cosa sono gli eventi?

Rilevare eventi con mousePressed() e keyPressed() in Processing

Durante l’esecuzione di un programma, possono verificarsi azioni che non dipendono direttamente dal flusso continuo del codice, ma da interazioni esterne, come un clic del mouse, la pressione di un tasto o altri cambiamenti. Queste azioni prendono il nome di eventi.

In Processing, gli eventi che gestiamo più frequentemente sono quelli legati al mouse e alla tastiera. Per rispondere a questi eventi, il linguaggio ci mette a disposizione blocchi di codice speciali, simili a setup() e draw(), ma con una differenza fondamentale: il loro contenuto non viene eseguito automaticamente all’avvio del programma, né ripetuto in loop.

Le funzioni evento, come mousePressed() o keyPressed(), vengono eseguite una sola volta, solo quando si verifica una specifica azione dell’utente, come ad esempio un clic o la pressione di un tasto. Questo permette di rendere i nostri sketch interattivi e reattivi, eseguendo istruzioni solo al momento giusto.

1. La funzione mousePressed()

Questa funzione si attiva ogni volta che l’utente preme un tasto del mouse.

Esempio 1: disegnare un quadrato dove si fa clic

1void setup() {
2size(400, 400);
3background(255);
4}
5 
6void draw() {
7// Vuoto, perché disegniamo solo quando si clicca
8}
9 
10void mousePressed() {
11fill(0, 200, 100);
12noStroke();
13rect(mouseX, mouseY, 40, 40);
14}

Ogni clic del mouse disegna un nuovo quadrato verde nella posizione del puntatore.

2. La funzione keyPressed()

Viene eseguita ogni volta che si preme un tasto sulla tastiera.

Esempio 2: aumentare la dimensione di un cerchio premendo i tasti “+” o “-“

1int diametro = 50;
2void setup() {
3  size(400, 400);
4}
5 
6void draw() {
7  background(255);
8  fill(100, 100, 255);
9  ellipse(width/2, height/2, diametro, diametro);
10}
11 
12void keyPressed() {
13  if (key == '+') {
14    diametro += 10;
15  } else if (key == '-') {
16    diametro = max(10, diametro - 10);
17  }
18}

Premi + per ingrandire il cerchio e - per rimpicciolirlo, con un limite minimo.

Continua a leggere

Lezione 7 – Corso di Elettronica Creativa con Arduino Sensor Kit

Utilizzo del microfono analogico

In questa lezione vedremo come utilizzare il sensore di suono integrato nell’Arduino Sensor Kit, leggeremo il segnale analogico prodotto con l’istruzione analogRead() e ne interpreteremo i valori.
Verrà introdotto, in modo estremamente semplice il concetto di decibel e vedremo come procedere alla calibrazione del microfono in funzione delle attività di sperimentazione che verranno proposte.

Il microfono del Sensor Kit è pre‑cablat​o sulla linea analogica A0 tramite il connettore Grove, quindi non sono necessari ulteriori collegamenti.

Principio di funzionamento

Il modulo Grove Sound Sensor è un ottimo strumento per misurare i rumori intorno a voi. Quando l’aria vibra a causa di un suono, una sottile membrana nel microfono si piega avanti e indietro. Questi movimenti generano una variazione di tensione: più forte è il suono, più grande è la variazione e quindi più alto sarà il numero che andremo a leggere con Arduino mediante l’istruzione analogRead().

Approfondimento tecnico

Per chi ha qualche competenza in più in elettronica aggiungo che all’interno del modulo è presente un microfono a elettrete o microfono electret collegato a un piccolo amplificatore (LM358). L’amplificatore rende il segnale abbastanza grande da poter essere rilevabile da Arduino. Un circuito chiamato rivelatore di inviluppo converte le onde sonore in un valore di tensione continua che rappresenta l’intensità del suono istantaneo.

  • Il segnale in uscita varia da 0 V (silenzio) a 5 V (suono molto forte).
  • Arduino lo misura con il convertitore A/D a 10 bit, producendo numeri da 0 a 1023.
  • Il modulo è sensibile a frequenze fino a ~20 kHz (oltre il limite dell’udito umano).
  • L’amplificatore amplifica il segnale di circa 26 dB, così anche suoni deboli diventano misurabili.
  • Il consumo di corrente è basso, circa 4‑5 mA.

Nelle specifiche del dispositivo parlo di convertitore A/D a 10 bit e decibel (dB) e indico che l’amplificatore amplifica, in modo più semplice, ingrandisce di 26 dB, vediamo cosa vuol dire.

Qualche concetto tecnico spiegato in modo semplice

Cos’è un convertitore A/D a 10 bit

Un convertitore A/D (Analogico → Digitale) è come un traduttore: trasforma la tensione continua che esce dal sensore in numeri che il microcontrollore può elaborare.

10 bit significa che abbiamo 2¹⁰ = 1024 possibili valori, da 0 (0 V) a 1023 (5 V circa). Ogni “scalino” vale quindi circa 5 V / 1023 ≈ 0,005 V (5 millivolt). Più bit, più la scala è fine e la misura precisa.

Che cosa sono i decibel (dB) e perché l’amplificatore “ingrandisce” di 26 dB?

Il decibel (dB) è una grandezza adimensionale ed è un modo logaritmico di confrontare due grandezze: dice “quante volte più grande” è un segnale rispetto a un altro, ma usa il logaritmo per compattare numeri dimensionalmente diversi in una scala più gestibile. Inoltre il nostro orecchio non percepisce l’intensità del suono in modo lineare: se la potenza acustica raddoppia non ci sembra “due volte più forte”, ma solo un po’ più intensa. Questa risposta psicoacustica si descrive bene con una scala logaritmica, perciò usiamo i decibel.

Per le tensioni si usa la formula:

dB = 20 × log10(V2 / V1)

  • 0 dB ⇒ stessa tensione
  • +6 dB ⇒ tensione circa doppia
  • −6 dB ⇒ tensione circa metà

Dire che l’amplificatore aumenta il segnale di 26 dB significa che la tensione in uscita è circa 20× (volte) più grande di quella che entra (perché 20× ≈ 26 dB). Così anche un suono debole crea un segnale abbastanza grande da essere misurato da Arduino.

ATTENZIONE

Questo sensore è pensato per percepire la presenza di suoni e valutarne l’intensità, non per registrare l’audio né per misurazioni professionali in decibel. Per avere dati certificati servono microfoni calibrati e convertitori più veloci.

Esempio di base

1/*
2  Prof. Maffucci Michele
3  24.06.25
4  LED reagisce al suono
5  Accende il LED sul pin 6 se il valore supera la soglia impostata.
6*/
7 
8const int pinSuono   = A2;    // pin a cui è connesso il sensore
9const int pinLED     = 6;     // LED del Sensor Kik
10const int sogliaRumore = 200; // valore da calibrare in base all'ambiente
11 
12void setup() {
13  pinMode(pinLED, OUTPUT);
14  Serial.begin(9600);
15}
16 
17void loop() {
18  int livello = analogRead(pinSuono);
19  bool rumoreForte;
20  // per approfondimenti sui tipi di dati:
22 
23if (livello > sogliaRumore) {
24    rumoreForte = true;
25  } else {
26    rumoreForte = false;
27  }
28 
29if (rumoreForte) {
30    digitalWrite(pinLED, HIGH);  // se supera la soglia il LED viene acceso
31  } else {
32    digitalWrite(pinLED, LOW);   // se non supera la soglia il led viene mantenuto apento
33  }
34 
35Serial.print("Livello: ");
36  Serial.print(livello);
37  Serial.print("  Rumore forte? ");
38  Serial.println(rumoreForte ? "SI" : "NO");
39 
40delay(500);
41}

Continua a leggere

Corso di Processing – lezione 08

Cosa sono le variabili built-in?

Le variabili built-in sono variabili già definite da Processing che ci forniscono informazioni utili in tempo reale. Non dobbiamo dichiararle o assegnare loro un valore: possiamo semplicemente usarle nel nostro codice.

Alcune delle più importanti sono:

  • width e height: Dimensioni della finestra
  • mouseX e mouseY: Posizione del mouse
  • pmouseX e pmouseY: Posizione precedente del mouse
  • frameCount: Numero di frame dall’inizio del programma
  • key e keyCode: Tasti premuti sulla tastiera

Vediamo ora come utilizzare queste variabili in modo pratico.

1. width e height: conoscere le dimensioni della finestra

Le variabili width e height contengono la larghezza e l’altezza della finestra in pixel. Sono utili quando vogliamo posizionare oggetti in base alle dimensioni dello schermo.

Esempio: Disegnare un cerchio al centro della finestra

1void setup() {
2  size(500, 400); // Imposta la finestra a 500x400 pixel
3}
4 
5void draw() {
6  background(240);
7  fill(0, 150, 255);
8  ellipse(width / 2, height / 2, 100, 100); // Il cerchio sarà sempre al centro
9}

In questo modo, il cerchio sarà sempre al centro, indipendentemente dalla grandezza della finestra.

Esercizio: Modifica il codice per disegnare due cerchi agli angoli opposti della finestra, usando width e height.
Continua a leggere

Escape Box didattica: Aurora Station

Negli ultimi mesi ho tenuto decine di corsi rivolti a studenti e docenti, e l’esperienza mi ha confermato che il gioco resta il veicolo più potente per trasmettere competenze e passione per lo studio. In particolare, i laboratori in cui trasformiamo concetti disciplinari in enigmi di un escape game scatenano partecipazione, cooperazione e ragionamento critico in un modo che la lezione frontale difficilmente eguaglia.
L’idea di condensare indizi e sfide in uno spazio portatile ‒ la cosiddetta escape box o valigia enigmatica ‒ è nata proprio da questa esigenza: avere uno strumento replicabile, modulare e a basso costo che possa viaggiare da una classe all’altra, da una disciplina all’altra, senza perdere il fascino “dell’avventura a tempo”».

Qualche settimana fa una collega della scuola secondaria di primo grado ha visto uno dei miei prototipi ‒ una valigia zeppa di schede elettroniche e LED che sviluppo per aziende ‒ e mi ha lanciato una sfida:

Riesci a progettare un dispositivo simile che i miei ragazzi possano ricostruire da soli, usando materiali di recupero, un pizzico di stampa 3D e un budget ridottissimo, così da adattarlo a qualunque materia?

Non potevo non aiutarla, la passione che mette nel suo lavoro meritava una risposta e quindi in un paio di ore di di schizzi e riflessioni è nata Aurora Station: una console di cartone con cinque interruttori e un pulsante, sormontata da un cristallo stampato in 3D ed ho deciso che dal prossimo anno scolastico entrerà all’interno di tutte quelle attività interdisciplinari che vanno dalla progettazione del gioco alla realizzazione fisica degli oggetti, passando per logica, elettronica di base, storytelling e teamwork.

Ovviamente tutto è migliorabile quindi mi perdonerete se l’oggetto non è tecnicamente elaborato, ma dai test fatti dai colleghi l’oggetto nella sua semplicità funziona.

Se volete saperne di più di questo e di altri progetti potete iscrivervi al mio prossimo corso in partenza domani:

ATTIVITÀ STEAM CON CARTA, CARTONE E CODING 4ª ed.

Di seguito una guida di massima sull’uso dello strumento, tenendo in conto che: la narrazione, il design e l’attività didattica può essere modificata come si ritiene.

Narrazione iniziale da leggere in classe

Operazione Aurora – Briefing di missione
Anno 2075. Nelle profondità della Base “Aurora Station” un temporale magnetico ha disattivato l’Aurora Core, il cristallo artificiale capace di ripulire l’aria terrestre dalla CO₂.

Davanti a voi c’è la Console di Emergenza:

  • cinque Chiavi Quantiche (interruttori ON/OFF) che canalizzano l’energia verso il Core;
  • un unico Pulsante di Convalida che dirà se la sequenza impostata è corretta;
  • il Cristallo incastonato sopra la console, pronto a illuminarsi quando la logica sarà corretta.

Dividetevi in squadre, risolvete i quesiti che vi verranno consegnati e sincronizzate le chiavi. Se anche un solo interruttore sarà errato, il Core rimarrà spento e la Terra perderà la sua ultima speranza.

Siete pronti a far brillare l’Aurora Core?

Dinamica di gioco

1. Preparazione

Materiale

  • Scatola di cartone (ex bobina di filamento) verniciata nero opaco
    riciclo e rapidità di assemblaggio
  • 5 interruttori economici ON/OFF
    acquistati in un brico
  • 1 pulsante recuperato
    da un vecchio giocattolo
  • Cristallo e piccoli decori
    Stampati in 3D con PLA traslucido
  • Cartoncini “Carta-Codice”
    ognuno contiene un enigma disciplinare

2. Setup in aula

  1. Fissare interruttori e pulsante sul coperchio della scatola; all’interno collega LED e pulsante in serie con i cinque interruttori ed il pulsante (così basta un solo errore per interrompere il circuito). Il codice di apertura può essere impostato girando gli interruttori.
  2. Incollare il cristallo stampato in 3D sopra il LED.
  3. Consegnare 5 carte gioco con quesiti diversi a ciascun gruppo (può riguardare matematica, scienze, storia, lingua, ecc.).

3. Svolgimento

  1. La console di gioco viene posta al centro dell’aula;
  2. divisione in squadre ‒ ad ogni gruppo viene consegnata una carta gioco;
  3. risoluzione enigmi ‒ quando la squadra crede di avere la risposta:
    • vero → sposta il proprio interruttore su ON
    • falso → lascia su OFF
  4. sincronizzazione ‒ quando tutti i cinque interruttori sono impostati, il docente invita un portavoce a premere il pulsante;
  5. feedback immediato
    • cristallo acceso: missione compiuta, breve esplosione di luce azzurro-bianca;
    • cristallo spento: la logica collettiva è sbagliata; si concede un secondo (ultimo) tentativo di revisione;
  6. debriefing ‒ si ripercorrono gli enigmi, si commenta perché la serie di interruttori funziona (o no) e si evidenzia il parallelismo con la programmazione: basta un solo 0 in un circuito di 1 per “rompere” il sistema.

Azioni che vengono attivate

  • Pensiero computazionale “hands-on” ‒ gli interruttori in serie traducono fisicamente l’idea di valore booleano e di errore bloccante;
  • cooperazione reale ‒ Ogni squadra è responsabile di un solo bit, ma la riuscita dipende da tutti.
  • riciclo creativo ‒ cartone, componenti recuperati e un tocco di stampa 3D dimostrano che la tecnologia può essere accessibile.
  • adattabilità disciplinare ‒ basta cambiare le Carte-Codice e la stessa escape box diventa laboratorio per qualunque materia.