Archivi tag: digitalRead

Domande dagli utenti – Perché Arduino legge valori strani se il pin non è collegato?

Ho deciso di mettere maggiormente in evidenza le richieste di chiarimento su diversi argomenti tecnici che mi giungono via mail o le domande lasciate nei commenti ai miei post. Spesso questi interventi nascono da dubbi autentici e molto concreti, ma rischiano di perdersi tra i tanti contenuti pubblicati. Per questo motivo ho pensato che alcune di queste domande meritino di essere riprese e trasformate in risposte più ampie, dettagliate e utili anche per altri lettori.

Molto spesso a scrivermi sono studenti giovanissimi, che stanno iniziando il loro percorso nell’elettronica, nella programmazione o nell’uso di Arduino. Ed è proprio a loro che sento di dover dedicare un’attenzione particolare, perché dietro una domanda apparentemente semplice si nasconde quasi sempre un passaggio importante da chiarire. Sono convinto, infatti, che proprio dalle domande più essenziali si costruiscano le basi migliori per capire davvero.

Molti, quando mi scrivono, aggiungono frasi come:

“Mi scusi per la domanda forse banale…”

oppure

“Preferisco scriverle in privato perché non vorrei fare una figura da inesperto nei commenti”

Su questo vorrei essere molto chiaro, perché per me è un aspetto importante, sia come docente sia come autore di contenuti didattici: non esiste la domanda sciocca, esiste solo la domanda non fatta.

Anzi, molto spesso le domande più utili sono proprio quelle che sembrano più elementari, perché costringono a chiarire i concetti fondamentali. E senza fondamenta solide, anche gli argomenti più avanzati restano fragili.

Una delle domande che mi è arrivata di recente è questa:

“Prof, perché Arduino mi legge valori strani anche se non ho collegato niente al pin?”

È una domanda ottima ed è anche una domanda che può aiutare molte persone che iniziano a usare Arduino, l’elettronica o i sensori.

Risposta

Perché un pin lasciato scollegato non è in uno stato definito.

Se un ingresso non è collegato né al positivo né alla massa, il microcontrollore non possiede un riferimento elettrico chiaro. In questa situazione il pin può captare piccoli disturbi presenti nell’ambiente circostante e restituire valori instabili, apparentemente casuali.

Quindi, nella maggior parte dei casi, non c’è nessun guasto nella scheda.
Il pin sta semplicemente lavorando in una condizione detta flottante.

Che cosa significa “pin flottante”

Quando si comincia a usare Arduino, è facile immaginare che un pin non collegato equivalga a “zero” oppure a “nessun segnale”.

In realtà non funziona così.

Un ingresso lasciato libero può comportarsi un po’ come una piccola antenna: intercetta disturbi elettrici, rumori, influenze del circuito circostante e può quindi produrre letture variabili anche se noi non stiamo toccando nulla.

Questo significa che:

  • un ingresso digitale può passare casualmente tra HIGH e LOW;
  • un ingresso analogico può mostrare valori che cambiano continuamente nel monitor seriale.

È un comportamento molto istruttivo, perché mostra subito una differenza importante tra lo schema ideale disegnato sulla carta e il comportamento reale dei circuiti.

L’idea fondamentale da ricordare

Il concetto chiave è questo:

in elettronica, “non collegato” non significa “zero”.

Questo è uno di quei principi che ritornano continuamente quando si lavora con pulsanti, sensori, interruttori, linee di ingresso e acquisizioni analogiche.

Capirlo bene fin dall’inizio evita molti errori e, soprattutto, aiuta a ragionare in modo più corretto sul funzionamento dei circuiti.

Come si risolve

Per evitare che un ingresso fluttui, bisogna assegnargli uno stato elettrico preciso.

Di solito si usa una di queste soluzioni:

  • una resistenza di pull-down, che mantiene il pin a livello basso quando non arriva alcun segnale;
  • una resistenza di pull-up, che mantiene il pin a livello alto;
  • la modalità INPUT_PULLUP di Arduino, molto comoda per gli ingressi digitali, perché sfrutta una resistenza interna del microcontrollore.

È una delle prime configurazioni corrette da imparare, soprattutto quando si cominciano a collegare pulsanti.

Un piccolo esperimento

Per osservare direttamente il fenomeno si può fare una prova semplicissima.

Si collega Arduino al computer, si carica uno sketch che legge un ingresso analogico lasciato libero, e si osservano i valori nel monitor seriale.

Esempio di sketch: lettura di un pin analogico flottante

/*
  Lettura di un ingresso analogico lasciato scollegato
  per mostrare il comportamento di un pin flottante.

  Collegamenti:
  - Non collegare nulla al pin A0
  - Aprire il Monitor Seriale a 9600 baud

  Osservazione attesa:
  I valori letti non saranno stabili, ma varieranno nel tempo.
*/

const int pinAnalogico = A0;   // Pin analogico lasciato volutamente scollegato

void setup() {
  Serial.begin(9600);
  delay(1000); // Piccola attesa per dare tempo al monitor seriale di aprirsi

  Serial.println("Lettura di un pin analogico flottante");
  Serial.println("Il pin A0 non e' collegato a nulla.");
  Serial.println("Osserva i valori letti:");
}

void loop() {
  int valoreLetto = analogRead(pinAnalogico);  // Legge il valore presente su A0

  Serial.print("Valore letto: ");
  Serial.println(valoreLetto);

  delay(200); // Solo per rallentare la visualizzazione
}

Che cosa si osserva

Aprendo il monitor seriale, i valori non resteranno fermi.
Potranno cambiare anche senza alcun intervento esterno.

A seconda della scheda, dell’ambiente, dei cavi vicini, della posizione delle mani e del rumore elettrico circostante, potresti vedere numeri che oscillano in modo più o meno evidente.

Ed è proprio questo il punto interessante: il pin non è “a zero”, ma è in una condizione indefinita.

Una seconda prova ancora più istruttiva

Dopo aver osservato il comportamento flottante, potete ripetere l’esperimento collegando:

  • una resistenza di pull-down verso GND;
  • oppure un partitore o un riferimento fisso;
  • oppure, nel caso di un ingresso digitale, attivando INPUT_PULLUP.

Il confronto tra “prima” e “dopo” è didatticamente molto efficace, perché fa vedere in modo concreto cosa significa stabilizzare un ingresso.

Variante digitale

Lo stesso fenomeno si può osservare anche con un ingresso digitale lasciato libero.

/*
  Lettura di un ingresso digitale flottante.

  Collegamenti:
  - Non collegare nulla al pin 2
  - Aprire il Monitor Seriale a 9600 baud

  Osservazione attesa:
  Il pin potra' cambiare in modo imprevedibile tra HIGH e LOW.
*/

const int pinDigitale = 2;   // Pin digitale lasciato scollegato

void setup() {
  Serial.begin(9600);
  pinMode(pinDigitale, INPUT);  // INPUT semplice: nessuna pull-up interna attiva

  delay(1000);

  Serial.println("Lettura di un pin digitale flottante");
  Serial.println("Il pin 2 non e' collegato a nulla.");
}

void loop() {
  int statoPin = digitalRead(pinDigitale);

  Serial.print("Stato letto: ");
  if (statoPin == HIGH) {
    Serial.println("HIGH");
  } else {
    Serial.println("LOW");
  }

  delay(200);
}

In questo caso il risultato potrà essere meno “spettacolare” oppure più irregolare, ma il principio resta identico: senza riferimento, l’ingresso non è affidabile.

Una domanda come questa può sembrare piccola, ma in realtà apre la porta a uno dei concetti più importanti dell’elettronica di base:

ogni ingresso deve avere un riferimento chiaro.

Capire bene questo passaggio significa costruire basi più solide per affrontare tutto il resto: pulsanti, sensori, automazione, misure, controllo e programmazione embedded.

E quindi, come dico sempre a chi mi scrive in privato:
fate domande, SEMPRE.

Perché una domanda sincera, anche molto semplice, vale molto più di un silenzio pieno di dubbi.

Piccola proposta pratica per il laboratorio

Chi vuole può provare questa sequenza:

  1. caricare lo sketch con A0 scollegato;
  2. osservare i valori nel monitor seriale;
  3. toccare con un dito il filo collegato ad A0 o avvicinare la mano;
  4. osservare come cambiano i valori;
  5. collegare poi il pin a GND oppure a 5 V tramite una configurazione corretta;
  6. confrontare il comportamento.

È una prova molto semplice, ma estremamente utile per capire, come dicevo ad inizio post, che in elettronica anche ciò che sembra “non collegato” può avere effetti reali.

Buona esplorazione 🙂