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

5 Min da Maker: EcoFan

È di nuovo quel periodo dell’anno in cui trovo il coraggio di mettere ordine nel mio laboratorio domestico: un luogo dove si accumulano le sperimentazioni fatte a scuola, il materiale che uso per i miei corsi online e le immancabili scatole del “prima o poi”, in cui conservo componenti elettronici di recupero smontati da vecchi dispositivi, o chissà da dove arrivati. Qualche volta uso proprio quelle scatole come strumento di meditazione: le fisso e parte il mantra “butto, non butto, butto, non butto…”.

Mentre l’azione yogica procede, l’afa torinese diventa sempre più pesante. Il sudore aumenta e, come un assetato che scorge un’oasi, sul fondo di una scatola intravedo, fra grovigli di fili e lampade LED obsolete, due ventole a 12 V. Provenienza ignota: forse un PC, forse un rack server. È l’occasione perfetta per fare un po’ di educazione civica, riducendo i RAEE e trasformando rifiuti elettronici in qualcosa di utile. Cosa potrei realizzare?

Il primo pensiero, il più semplice, è un ventilatore per il caldo che all’occorrenza funzioni anche da aspiratore per i fumi di saldatura.

L’esercizio da “Maker in 5 minuti” non tradisce mai: fa bene alla mente!

Le ventole sono da 120 mm. Cerco su Thingiverse delle griglie di protezione; poi, armato di calibro, progetto i piedini di supporto, i blocchetti per unire le due ventole, un manico per trasportare il mio EcoFan e, dopo circa un’ora, le stampe sono pronte.

Dalla seconda scatola del “prima o poi” salta fuori un alimentatore AC/DC da 12 V: fantastico, è fatta! Assemblo tutto e mi chiedo: “Vuoi non metterci un interruttore?”

Rovistando ancora trovo una vecchia esercitazione di automazione, un piccolo nastro trasportatore, su di esso avevo predisposto un regolatore di velocità, perfetto! Funziona anche da interruttore e mi permette di variare la velocità delle ventole.

Altri trenta minuti per progettare e stampare due scatoline, una per il regolatore e una per il jack di alimentazione e il mio EcoFan è pronto.

All’occorrenza possiamo ruotare l’EcoFan orizzontalmente.

Cosa manca? Potrei renderlo smart, così da pilotarne la velocità da remoto… alla prossima sessione di yoga da Maker.

Buon making a tutti! 🙂