Costruire un oscilloscopio con Arduino ha senso quando vuoi osservare un segnale reale, capire come cambia nel tempo e imparare cosa succede tra campionamento, rumore e conversione analogico-digitale. In questo articolo spiego cosa si può misurare davvero, quali schede sono più adatte, come collegare il segnale senza rischi e come visualizzare la traccia con strumenti semplici come il Serial Plotter. Il punto centrale è uno: farlo funzionare in modo utile, non solo curioso.
In breve, Arduino funziona bene come oscilloscopio solo quando limiti di banda, precisione e protezione d’ingresso sono sotto controllo
- Con le schede classiche a 10 bit ottieni una lettura utile per segnali lenti, PWM e uscite di sensori.
- Su board più moderne, come l’UNO R4, la risoluzione può salire fino a 14 bit, ma il limite resta il campionamento reale.
- Il problema più comune non è il codice: è collegare male il segnale o aspettarsi troppo dal Serial Plotter.
- Un partitore di tensione e una massa comune sono spesso indispensabili per non danneggiare l’ingresso analogico.
- Per vedere una traccia credibile serve un campionamento costante; se il timing balla, anche il grafico mente.
- Quando il segnale diventa veloce o serve una misura seria, un oscilloscopio vero resta la scelta giusta.
Che cosa puoi misurare davvero
Io partirei da una distinzione semplice: Arduino può mostrare una forma d’onda, ma non sostituisce automaticamente uno strumento da banco. Con `analogRead()` stai leggendo un valore per volta, non una finestra di tempo ad alta velocità, quindi il risultato è utile soprattutto per segnali lenti, variazioni progressive, PWM non troppo rapidi e controlli didattici.
La documentazione Arduino ricorda che molte schede classiche lavorano a 10 bit, cioè 1024 livelli. Su un riferimento da 5 V parliamo di circa 4,9 mV per passo; su una scheda da 3,3 V il passo teorico scende a circa 3,2 mV. In pratica questo basta per vedere se un sensore si muove, se un segnale sale e scende come previsto o se un’uscita PWM sta facendo il suo lavoro. Non basta, invece, per fare misure affidabili su segnali veloci o molto puliti.
| Tipo di segnale | Quanto è realistico usarlo | Osservazione pratica |
|---|---|---|
| 50 Hz, 100 Hz, poche centinaia di Hz | Buono | La forma è leggibile e utile per il debug. |
| PWM lento e uscite di sensori | Molto buono | È il caso d’uso più naturale per una prova su Arduino. |
| Pochi kHz | Dipende molto dalla scheda | La traccia può già diventare semplificata o irregolare. |
| Decine di kHz e oltre | Scarso per la maggior parte dei setup | Qui la conversione e la seriale diventano il collo di bottiglia. |
La regola che uso io è questa: se il periodo del segnale è chiaramente più lento del tuo ciclo di lettura, il progetto ha senso; se ti avvicini troppo alla frequenza di campionamento, entrano in gioco aliasing e letture fuorvianti. Quando questo quadro è chiaro, diventa molto più semplice scegliere la scheda giusta.
Quale scheda conviene usare
Per fare un piccolo strumento didattico vanno ancora bene le schede classiche, ma non tutte offrono lo stesso margine. Io oggi sceglierei in modo diverso a seconda dell’obiettivo: se vuoi solo imparare, un Nano o un Uno bastano; se vuoi una traccia più fine e più pulita, conviene guardare alle famiglie più recenti.
| Scheda | Risoluzione tipica | Perché la sceglierei | Limite principale |
|---|---|---|---|
| Uno / Nano / Mega | 10 bit | Economiche, diffuse, facili da trovare e da programmare. | Campionamento e dinamica restano modesti. |
| UNO R4 Minima / WiFi | Fino a 14 bit | Più dettaglio nella lettura e margine migliore sulla scala analogica. | Resta uno strumento didattico, non un oscilloscopio professionale. |
| GIGA R1 e schede Arduino più evolute | Più adatte a streaming e acquisizioni avanzate | Più spazio per sperimentare con acquisizione continua e progetti ambiziosi. | Maggiore complessità hardware e software. |
Qui la documentazione Arduino è utile per un punto preciso: `analogReadResolution()` permette di cambiare la risoluzione su alcune schede, mentre `analogRead()` sulle piattaforme classiche continua a dare una lettura a 10 bit. In termini pratici, il salto tra 10 e 14 bit non trasforma Arduino in uno strumento da laboratorio, ma rende molto più leggibili i piccoli cambiamenti di tensione. A quel punto il problema non è più la scheda, ma come collegare bene il segnale.
Come collegare il segnale senza fare danni
Qui non c’è spazio per approssimazioni: la massa del circuito deve essere comune, il segnale non deve superare la tensione di riferimento e gli ingressi analogici non gradiscono tensioni negative. Se il tuo obiettivo è leggere qualcosa che nasce fuori dall’Arduino, io metterei sempre una protezione minima prima ancora di pensare al grafico.
- Collega prima il GND: senza massa comune la lettura è quasi sempre instabile o priva di senso.
- Usa un partitore di tensione quando il segnale supera il fondo scala dell’ingresso analogico.
- Aggiungi una resistenza serie se vuoi ridurre il rischio in caso di errore di cablaggio.
- Se il segnale può andare sotto zero, serve un offset o un accoppiamento AC con bias a metà alimentazione.
- Se la sorgente è ad alta impedenza, un buffer con operazionale aiuta a evitare letture ballerine.
Un esempio concreto: per portare un segnale da 12 V dentro una scheda a 5 V, un partitore da 100 kΩ e 33 kΩ porta il massimo a circa 3 V sul pin, quindi dentro un margine ragionevole. Non è una formula magica, ma una soluzione pratica e facile da replicare. Se invece devi misurare un circuito di potenza, o un segnale che può avere transitori più alti del previsto, io alzo il livello di protezione oppure rinuncio direttamente alla misura diretta.
| Caso | Soluzione pratica |
|---|---|
| Segnale fino al fondo scala dell’Arduino | Connessione diretta, ma solo se il circuito è già compatibile. |
| Segnale a 12 V | Partitore resistivo e massa comune. |
| Segnale con componente negativa | Offset a metà alimentazione o accoppiamento AC con bias. |
| Sorgente debole o ad alta impedenza | Buffer op-amp prima dell’ingresso analogico. |
Con il cablaggio a posto, il passo successivo è scegliere come acquisire e mostrare la traccia in modo stabile.
Come impostare la lettura e vedere la traccia
Per iniziare, io userei il Serial Plotter dell’IDE Arduino: è semplice, immediato e sufficiente per capire se il segnale esiste davvero. Il punto non è fare subito un software sofisticato, ma fissare un campionamento regolare e non lasciare che la seriale rovini tutto. Nella maggior parte dei casi, il collo di bottiglia non è l’ADC, ma il modo in cui mandi i dati al computer.
const byte canale = A0;
const unsigned long intervallo_us = 200; // circa 5 kS/s teorici
void setup() {
Serial.begin(230400);
}
void loop() {
unsigned long t0 = micros();
int valore = analogRead(canale);
Serial.println(valore);
while (micros() - t0 < intervallo_us) {
// attesa attiva per mantenere costante il passo di campionamento
}
}Questo sketch è volutamente essenziale. Se usi una scheda compatibile e vuoi più dettaglio, puoi alzare la risoluzione con `analogReadResolution(14)`, ma io lo farei solo dopo aver verificato che il segnale sia già ben protetto e che il plotter stia mostrando una traccia pulita. Se vedi buchi o salti, le leve da toccare sono due: ridurre la frequenza di campionamento oppure aumentare la velocità della seriale.
Se vuoi un’onda ferma invece di una linea che scorre senza controllo, il vero passo avanti è introdurre un trigger semplice, cioè una soglia che fa partire l’acquisizione solo quando il segnale supera un certo valore. È una piccola aggiunta, ma cambia molto la leggibilità del risultato. E appena la lettura è stabile, puoi capire meglio anche dove questo approccio funziona davvero e dove invece si ferma.
Cosa puoi osservare e cosa no
Io uso spesso l’Arduino come strumento di verifica veloce, non come strumento di misura assoluta. Questo significa che mi fido della traccia per capire se un circuito si sta comportando in modo plausibile, ma non per certificare ampiezze, tempi di salita o distorsioni con precisione da banco.
| Scenario | Esito | Perché |
|---|---|---|
| PWM di un LED o di una ventola | Sì | Il fronte e il duty cycle sono facili da leggere. |
| Uscita di un sensore analogico lento | Sì | La variazione è abbastanza lenta da restare dentro il campionamento utile. |
| Ripple di alimentazione su bassa tensione | Sì, con cautela | Serve protezione d’ingresso e una massa ben fatta. |
| Segnali audio o digitali veloci | Solo in modo approssimativo | La frequenza è spesso troppo alta per una lettura affidabile. |
| Rete elettrica 230 V diretta | No | È un rischio inutile e l’ingresso non è adatto. |
Qui c’è un punto che vale oro: più bit non significa automaticamente più precisione utile. Se il circuito è rumoroso, se il riferimento non è stabile o se il campionamento non è regolare, anche una lettura a 14 bit può raccontare una storia sbagliata. Per questo, se ti interessa una misura in volt più credibile, io farei sempre una piccola calibrazione a due punti, ad esempio confrontando 0 V e una tensione nota. Con questo quadro in mano, restano da chiarire gli errori che fanno saltare tutto.
Gli errori che rovinano subito la misura
Le prime prove falliscono quasi sempre per ragioni banali. Il problema è che, quando succede, si tende a colpevolizzare il codice invece del cablaggio o della fisica del segnale. Io guardo sempre questi punti prima di cambiare mezza libreria.
- GND non condiviso: senza massa comune il riferimento dell’ADC non ha senso.
- Ingresso collegato direttamente a tensioni troppo alte: il partitore non è opzionale quando il fondo scala viene superato.
- Segnali negativi ignorati: l’ADC non legge sotto zero, quindi serve un offset.
- Campionamento irregolare: usare `delay()` o stampe seriali troppo pesanti rende la traccia instabile.
- Seriale troppo lenta: se il baud rate è basso, perdi dati prima ancora di vedere la forma d’onda.
- Risoluzione confusa con precisione: 14 bit teorici non annullano rumore, jitter e tolleranze.
C’è anche un errore mentale molto diffuso: pensare che, siccome la traccia “si vede”, allora la misura sia automaticamente affidabile. Non è così. Io considero riuscita una prova solo quando il comportamento è coerente, ripetibile e compatibile con quello che il circuito dovrebbe fare. Da lì in poi, se vuoi andare oltre, ha senso chiedersi se Arduino sia ancora lo strumento giusto.
Quando il salto a un oscilloscopio vero ti fa risparmiare tempo
Se il tuo obiettivo è imparare, fare debug di segnali lenti o osservare l’andamento di un prototipo, Arduino resta un alleato valido. Se invece ti serve un trigger serio, una banda più ampia, una lettura calibrata o la capacità di catturare fronti rapidi e fenomeni brevi, io passerei senza esitazione a un oscilloscopio dedicato o, in certi casi, a un logic analyzer. È il classico caso in cui lo strumento giusto ti fa risparmiare più tempo di quanto ne costi.
La soluzione che uso io, quando il progetto lo permette, è ibrida: Arduino per capire se un circuito “si muove” come previsto, oscilloscopio vero per misurare bene quello che ho trovato. È un approccio meno scenografico di un tutorial perfetto, ma molto più solido nella pratica. Se lo tieni a mente, il piccolo esperimento con Arduino diventa davvero utile: non un sostituto improvvisato, ma un modo intelligente per leggere i segnali prima di fare il salto allo strumento definitivo.