Programmare con Arduino – leggere un segnale analogico

Penso sia la parte più unteressante, parlando di acquisizione di un input estrno, offerta da Arduino; il motivo della mia affermazione non risiede nella complessità di quello che facciamo ma nel fatto che acquisire un segnale analogico ti permette di utilizzare Arduino per interagire con il mondo esterno non più in bianco o nero (0 e 1) ma con 1024 sfumature di grigio.

Pensa solo un attimo al tuo robot che può misurare la distanza dall muro e girare prima di toccarlo in opposizione a quanto visto nell’articolo dedicato al segnale digitale in cui l’ipotetico robot avrebbe dovuto sbatterci contro il muro per accorgersi dell’ostacolo, io lo trovo fantastico. Passo a descriverti come si fa a leggere un segnale analogico e dove potrai leggere quei valori, partiamo con lo schema:

AnalogReadSerial_BB

Schema di collegamento di un potenziometro ad Arduino

Come si vede in figura il collegamento del potenziometro è molto semplice, almeno quanto la lista della spesa:

  1. una scheda Arduino
  2. un potenziometro da 10K hom

Il gioco è presto fatto, collega gli estremi del potenziometro (quelli su cui è sempre presente una resistenza di 10K ohm indipendentemente dalla posizione della manopola) rispettivamente al +5V e Gnd di arduino, non è importante quale va al +5v e quale al pin Gnd.
Collega, quindi, il terminale centrale del potenziometro al pin A0 (ossia il pin 0 analogico, vedi schema).

Il codice che utilizzeremo per i nostri esperimenti è il seguente:

/*
 AnalogReadSerial
 Reads an analog input on pin 0,
 prints the result to the
 serial monitor

 This example code is in the public domain.
 */

void setup() {
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(A0);
  Serial.println(sensorValue, DEC);
}

Analizzo le linee di codice:

linee 01-08: contiene un commento multilinea, con in fondo la frase che autorizza all’uso libero il codice esposto

linea 10: definisce le operazioni di impostazione della scheda arduino (in un precedente articolo ho definito meglio a cosa serve la funzione setup() ), NOTA: in questo esempio non abbiamo definito il pin 0 come input.

linea 11: indico ad Arduino che utilizzerò la comunicazione seriale a 9600 boud (vedi articolo)

linea 14: definisco la funzione loop, quella eseguita ciclicamente da Arduino, anche per questa funzione ti rimando all’articolo “le basi

linea 15: utilizzando una sintassi compressa dichiaro la variabile sensorValue e ne imposto il valore con il risultato letto sul pin 0 analogico, per leggere il valore del pin 0 analogico ho utilizzato il comando analogRead(A0), NOTA: ho definito in questo comando che mi riferisco al pin 0 analogico (A0), il comando analogRead leggerà ad ogni ciclo della funzione loop il valore analogico rilevato sul pin 0; tale valore varia tra 0 e 1023.

linea 16: il comando Serial.prinln(sensorValue, DEC) scrive sul canale seriale di arduino che mostra i risultati nel monitor seriale, per comprendere come funziona questo meccanismo ti invito a leggere il mio articolo sui segnali digitali.

Non ti resta che inviare lo sketch ad Arduino, aprire il monitor seriale dell’IDE: serial monitor e provare a spostare la manopola del potenziometro tutta da un lato leggendo il valore rilevato (ad es: 0) e ruotando la manopola osservare il valore aumentare fino a 1023 giungendo alla fine dell’escursione del potenziometro.

Buona sperimentazione

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/programmare-con-arduino-leggere-un-segnale-analogico.html

70 commenti

1 ping

Vai al modulo dei commenti

    • Daniel il 24 Maggio 2012 alle 21:20
    • Rispondi

    ciao, ascolta ho un problemino devo far accendere 3 led con un potenziometro.
    il potenziometro ha la funzione di cambiare la variabile ( in questo caso la chiamerò X). con X, a seconda del valore accende un determinato led.

    esempio,
    X 381682 // accende il led 3

    PROBLEMA. io per far ciò, ho utilizzato la funzione if, else. l’unica cosa è che ho un intoppo sul led 2 ovvero non so come mettere le condizioni del if.
    io ho fatto in questo modo:

    if (X >381<681) {
    digitalWrite (1, HIGH) ;
    }
    else {
    digitalWrite (1, LOW);
    }

    in questo caso, se lo carico su arduino, funziona tutto, l'unica cosa è che il led 2 ( ossia l'uscita 1 su ardu) rimane sempre acceso… come posso fare per risolvere?

    1. Ciao Daniel,
      il modo in cui hai scritto quella condizione è la prima volta che lo incrocio, probabilmente è una mia mancanza, ma non saprei cosa tu voglia ottenere da quella condizione.
      Per il tuo problema premetto che un potenziometro varia da 0 a 1023, supponendo di dividere i valori in 3 avrai: 1024/3 = 341,… prendi solo gli interi e diciamo led 1 0-341, led 2 342-682, led 3 683-1023 la condizione è:

      if ( (0 < X) && (X < 341) ) ... else if ( (342 < X) && (X < 682) ) ... else ... Spero ti sia utile. Mauro

    • Cesare il 11 Maggio 2013 alle 10:46
    • Rispondi

    Salve, ho una difficoltà, monto un lm35 sul pin 0 e leggo la tmp, monto assieme a questo un potenziomentro sul pin 1 (provato sia uno da 47k che uno da 1k, putroppo questi avevo a disposizione) ed oltre un certo valore inizia a sballare la lettura della tmp, da cosa può dipendere e come posso risolvere il problema? Grazie e saluti Cesare

    1. Ciao Cesare,
      hai provato a leggere solo il valore del pin 0 con lo sketch ruotando il potenziometro ma senza leggere il pin?

      Potrebbe essere un errore di sketch o di collegamento del potenziometro.

      Mauro

    • Cesare il 13 Maggio 2013 alle 15:17
    • Rispondi

    Grazie della risposta ho fatto la prova che dicevi ed anche escludendo il comando di lettura, sballa lo stesso, ho (diciamo) risolto il problema mettendo un condensatore tra l’uscita dell’lm 35 e la terra nel tentativo di eliminare del rumore pescato da chissà dove e devo dire cha ha funzionato, la cosa strana, se collego solo il potenziometro su un ingresso analogico il valore letto su questo funziona correttamente, ma se mi metto in ascolto sugli altri ingressi su cui nn è collegato nulla leggo delle variazioni anche lì, l’idea che mi sono fatto è che la breadboard pesca rumore, fa come da antenna, potrebbe essere secondo te?

    1. Ciao Cesare,
      le uscite analogiche possono fluttuare se non collegate a nulla è un fenomeno che ho riscontrato anche io.
      Talvolta è sufficiente in fase di inizializzazione, setup(), inviare un segnale digitalWrite( pin, LOW ) dove pin è il pin analogico di cui vuoi misurare il valore.

      Questa operazione attiva una resistenza di pull-down interna ad arduino.
      Io consiglio di collegare sempre un carico da almeno 330ohm verso Gnd, la resistenza di pull-down in questo caso è fisica.

      Mauro

    • Andrea il 20 Giugno 2013 alle 10:08
    • Rispondi

    Salve,
    nella configurazione e nella lettura consecutiva di 2 ingressi analogici, a cui sono collegati 2 convertitori di segnale 4-20mA/0-5V, su una scheda Arduino Mega 2560 mi sono accorto che le letture sballano, tra l’altro non riesco a leggere un valore maggiore di 250 count su questi ingressi..la cosa mi succede anche se collego 2 potenziometri 10K alimentati con la 5V della scheda…cosa devo fare a livello HW e SW per risolvere il problema?
    Grazie e saluti
    Andrea

    1. Ciao Andrea,
      hai provato a segnalare la cosa nel fornum arduino od al tuo rivenditore?
      Sembra un problema hardware se si presenta anche con un semplice potenziometro, i valori che dovresti leggere sono 0-1023 o poco meno

      Mauro

    • Manuel Del Signore il 27 Ottobre 2013 alle 15:23
    • Rispondi

    Salve,
    Io ho un problema a far trasformare il valore della letture del potenziometro in percentuale.
    ES: se il valore è 1023 in percentuale è 100%
    se il valore è 0 in percentuale è 0%

    Come posso fare per risolvere ?

    1. Ciao Manuel,
      innanzitutto ti chiedo di leggere atentamente l’avviso presente in ogni articolo e pagina del blog in cui è scritto di non incollare codice nei comemnti perchè arriva illegibile e non posso comunque aiutarti.

      La prossima volta eliminerò direttamente il tuo commento se non rispetti l’avviso.
      Il tuo problema non è legato ad arduino ma alla matematica, ti consiglio di leggere come funzionano le proporzioni e comprenderai come convertire il valore, ad esempio se leggendo il potenziometro ottieni 512 la proporzione è: 1023 : 100 = 512 : x da cui x = ((512*100)/1023) = 50% circa

      Mauro

    • Manuel Del Signore il 28 Ottobre 2013 alle 17:24
    • Rispondi

    Scusa,
    Non ho visto l’avviso;
    Comunque io ho già fatto come dici tu ma non ho il valore corretto!!
    Io ho provato cosi:
    1023:100=(Lettura potenziometro):X ——-> [100*(Lettura potenziometro)]/1023
    come risultato escono sia numeri positivi che negativi (cosa impossibile)

    Ho provato anche con:
    [(Lettura potenziometro)/1023]*100 ——> in queto caso escono solo 2 valori 0 e 100 non da valori intermedi.

    P.S. non trovo un indirizzo e-mail per inviarti il codice

    1. Ciao Manuel,
      hai scritto le formule con le parentesi quadre? Dimmi di no …

      L’errore potrebbe essere sintattico, in informatica le parentesi che puoi usare per i calcoli sono solo le tonde () le quadre [] e le graffe {} servono a tutt’altro scopo.

      Mauro

        • Manuel Del Signore il 30 Ottobre 2013 alle 14:44
        • Rispondi

        no no ho usato quella forma solo per far capire come si svolgono i calcoli

        • Albeto Dalponte il 21 Gennaio 2014 alle 21:10
        • Rispondi

        Ciao a tutti,
        mi riferisco al problema segnalato da Manuel Del Signore;
        l’anno scorso sono incappato anch’io in questo problema, poi ho capito che la lettura di un input analogico è un valore intero se non si decide diversamente. Non è sempre possibile ottenere risultati esatti utilizzando gli operatori * e / con gli interi, il sistema impazzisce.
        Occorre inizialmente dichiarare una variabile float es :
        float vel;
        e poi leggere l’ingresso analogico assegnandogli il valore:
        vel=analogRead(A0);
        adesso si possono fare operazioni come:
        tp=((((vel-542)*195)/(-481))+200);
        ed utilizzare questo risultato per es per la pausa tra un passo e l’altro di un motore passo passo
        Spero di avervi risolto il problema.

        Alberto Dalponte

        1. Grazie Alberto,
          ottima descirzione.
          Se il problema si riferisce al delay tra uno step ed il successivo puoi usare anche delayMicrosecond oltre al delay, che lavora per millisecondi; certo il problema dell’intero non cambia e, come giustamente dici, il valore letto dal pin analogico resta un valore intero non modificabile come tipo.

          Mauro

    • Giuseppe Morello il 11 Novembre 2013 alle 11:54
    • Rispondi

    Salve, come posso fare per fare leggere ad arduinouno due potenziometri e un interruttore on/off.
    posso fargli fare una scansione degli ingressi analogici ed una lettura?
    grazie
    Giuseppe

    1. Ciao Giuseppe,
      puoi leggere i potenziometri con gli ingressi analogici e l’interruttore con un ingresso digitale o analogico secondo come ti è più comodo.

      Mauro

    • michele il 14 Novembre 2013 alle 16:35
    • Rispondi

    Ciao Mauro, in questo esempio non viene mostrato lo schema pratico di collegamento. Grazie

    1. Ciao Michele,
      hai ragione, puoi seguire lo schema rilasciato sul sito ufficiale arduino o in uno dei altri tutorial sui potenziomatri.
      I collegamenti sono sempre i medesimi, i due poli esterni del potenziometro rispettivamente a +5v e Gnd ed il pin centrale all’ingresso analogico da cui vuoi leggere il segnale.

      Mauro

    • Angelo il 25 Febbraio 2014 alle 10:50
    • Rispondi

    Buon giorno Mauro. Innanzitutto complimenti per il tuo lavoro.
    Io mi avvicino da poco ad Arduino e vorrei costruire un sistema di allarme.
    Sai dove posso trovare dei sensori da mettere alle finestre che siano completi di ricevitore?
    Grazie anticipatamente
    Angelo

    1. Ciao Angelo,
      che tipo di sensori hai in mente? Magnetici, IR, PIR o altro ?
      Quando scrivi “dotati di ricevitore” a cosa ti riferisci?

    • Angelo il 25 Febbraio 2014 alle 11:37
    • Rispondi

    Pensavo alla tecnologia reed per potere allarmare l’apertura delle tapparelle.
    Per “Dotati di ricevitore” intendevo dire che si possano collegare ad Arduino senza fili.
    Quindi una coppia di trasmettitore e ricevitore in wireless

    1. Ciao Angelo,
      già pronti non ne conosco.
      Dovresti progettarteli e costruiti scegliendo i componenti e il metodo di trasmissione più adatto al tuo scopo.

    • Marco il 18 Agosto 2014 alle 17:59
    • Rispondi

    Ciao Mauro ho fatto un attimo una prova come dicevi tu collegando il potenziometro ad Arduino dove alle estremità do l’alimentazione e al centro lo collego al pin A0
    ma niente da fare, o non so bono io, oppure i potenziometri che ho è tutti fasulli ne ho provato una da 4K7 una da 2M2 e uno da 220K ma quando giro il potenziometro da 5V a 0V mi dovrebbe variare il valore da 1023 a 0 ed invece mi rimane sempre a 1023 variando minimamente fino a 1010 e se non tocco per niente il potenziometro il valore varia per conto suo alzandosi e ribassandosi fino a 950
    se non so fare ste semplici cose lascio andare veramente

    1. Ciao Marco, che tutti i tuoi potenziometri siano inefficienti è vera sfortuna. Prima di abbandonare prova a collegarli ad A1 cambiandolo nel codice e vedi cosa accade. Se continui a leggere 1023 inverti il pin del +5 con quello su A1 e se leggi ancora 1023 o 0 fisso inverti il pin a gnd con quello su A1. In pratica provi tutte le combinazioni tra pin e potenziometro.

    • gionathan il 21 Settembre 2014 alle 10:18
    • Rispondi

    ciao Mauro , mi son avvicinato da poco al mondo di arduino e come primo progetto vorrei accendere e spegnere un led tramite un sensore di suono ma non so come programmarlo se potresti darmi qualche consiglio te ne sarei grato ciao a presto

    1. Ciao Gionathan, hai già individuato un sensore di suono che ti piacerebbe usare o vuoi utilizzare un microfono?

    • Gabriele il 20 Dicembre 2014 alle 19:28
    • Rispondi

    Gentilissimo Mauro,
    Ho collegato un joystick da 10k ed un display cosi’ da stampare sull LCD i valori X e Y piuttosto che in console seriale. Grazie ai sui consigli presi qua e la’ funziona tutto a meraviglia.
    Unico neo e’ che il joystick arriva a 1023 (o a zero) gia’ a meta’ corsa. Essendo un micro joystick (il classico simile a quello fornito in kit) non mi permette una regolazione di fino.
    Che faccio lo butto ?
    Grazie se mi vorra’ rispondere 🙂
    Gabriele

    1. Ciao Gabriele,
      mi sembra strano il comportamento del joystick, tuttavia con alcuni prodotti economici è possibile che il potenziometro su cui sono costruiti non sia di buona qualità. Io chiederei al rivenditore spiegazioni in merito, i rivenditori autorizzati di solito verificano il prodotto ed in caso di anomalia lo sostituiscono.

        • Gabriele il 23 Dicembre 2014 alle 15:27
        • Rispondi

        Grazie per la risposta.
        Si tratta di un mini joystick sparkfun. Praticamente si lamentano tutti di quella che viene definita “dead zone” di questo aggeggio e che dipende dalla qualita’ dei potenziometri evidentemente scarsa.
        https://www.sparkfun.com/products/9032 (avessi letto prima !).

        Personalmente l ho trovato su eBay senza marchio, ma con gli stessi pot a bordo.
        I pot incriminati (10k tolleranza +o- 30% … alla faccia della precisione !) recitano b103-3810.
        L originale sparkfun non ha il suffisso”b”.

        Spero di essere stato utile a qualcuno 🙂

        PS
        Ho recuperato un joystick da 5K da un vecchio radiocomando RC guasto.
        Va che e’ una meraviglia.

        1. Grande Gabriele,
          mi spiace che ti sia accorto solo dopo dell’informazione a volte impiego più tempo a scegliere i componenti da acquistare che a scrivere il codice.
          Non mi ero accorto neppure io dell’esistenza di joystick tanto imprecisi e farò tesoro del tuo suggerimento… che dire: W il riciclo di componenti 🙂

    • Antonio Russo il 22 Gennaio 2015 alle 11:20
    • Rispondi

    Ciao Mauro,
    innanzitutto vorrei farti i complimenti per i tuoi tutorial e spiegazioni, davvero utilissime per gente alle prime armi come me.
    Io sono un neofita del mondo arduino e spero di non fare una figuraccia; all’interno di un progetto che mi piacerebbe realizzare, avrei bisogno di utilizzare un joystick, così ho seguito tutti i passi per poterlo collegare e leggerne i valori, che però mi sono risultati molto strani, perchè, a prescindere della posizione dello stesso, continuavano a salire e scendere tra 0 e 1023.
    Così ho provato una lettura a vuoto di tutti gli ingressi analogici della mia arduino UNO, ottenendo sempre lo stesso risultato, valori che variano tra 0 e 1023 a mò di onda sinusoidale. Tutto questo è normale? vi prego aiutatemi a risolvere

    1. Ciao Antonio,
      i pin analogici arduino non connessi a nulla si dice che “flottano” cioè restituiscono valori arbitrari tra 0 e 1023.
      Se quando colleghi il joystick continui a rilevare valori di questo tipo prova a verificare le connessioni elettriche del joystick e dei potenziometri ad esso connessi.

    • Massimo Andreani il 31 Marzo 2015 alle 11:55
    • Rispondi

    Ciao Mauro,
    complimenti per i bellissimi e utili tutorial, molto interessanti e utili visto che sono all’inizio.
    Sto costruendo un apparecchio per fare fotografie alle gocce d’acqua che cadono e si scontrano, ma mi trovo davanti ad un problema, per regolare il tempo di apertura dell’elettrovalvola che genera le gocce utilizzo due potenziometri, uno per la prima goccia ed uno per la seconda, in realtà ne andrà inserito un terzo per il tempo tra una goccia e l’altra, ma qui l’imprevisto….con un potenziometro, 10K, collegato al pin analogico 0 per la goccia 1 funziona tutto bene, ho anche convertito il valore 0-1023 in un range 40-200 che utilizzo come tempo per l’apertura della valvola, ma nel momento che collego anche il secondo potenziometro, 10K, per la goccia 2, i valori si sballano, nel senso che è come se uno limitasse l’altro nei valori, non ho più l’escursione che ho quando sono collegati singolarmente, cosa puo causare questa “dipendenza”?.
    Ti ringrazio in anticipo dell’aiuto

    Massimo

    1. Ciao Massimo,
      stai utilizzando un arduino originale?
      Francamente è la prima volta che mi capita di leggere un problema come il tuo, ho collegato più potenziometri da 10K molte volte per molti esperimenti ma mai ho notato una influenza degli uni sugli altri.
      Prova a verificare con un tester cosa accade all’alimentazione arduino e cosa elettricamente su ciascun potenziometro.

        • Massimo Andreani il 31 Marzo 2015 alle 12:27
        • Rispondi

        No al momento nel progetto è inserita una scheda non originale, Funduino, potrebbe dipendere da quella?, per altre cosette non ha mai dato problemi, magari provo a mettere una Uno ufficiale, e verifico come dici l’alimentazione.
        Ti farò sapere, grazie per la celere risposta intanto

        1. Mi spiace Massimo,
          ma non conoscendo tutte le schede quando mi indicate anomalie di questo tipo penso subito ad un clone, come nel tuo caso.
          Prova con un arduino uno r3 originale.

    • Nico il 16 Ottobre 2015 alle 23:53
    • Rispondi

    Salve, sto usando arduino uno in un progetto e tra le cose che deve fare, dovrebbe leggere (con la maggior precisione possibile) delle tensioni. Per aumentare la scala di valori che può leggere prelevo le tensioni tramite un partitore. Ora, per evitare di avere effetti di carico data l’alta impedenza sia del pin sia del partitore preleva questa tensione da un buffer e la mando nel pin analogico. Il problema è che queste tensioni non sembrano molto veritiere, anzi direi proprio che non lo sono. C’è qualcosa in particolare da sapere sulle letture dai pin analogici, o qualche limite? Premetto che il codice è corretto e pertanto non mi riferisco a quello con la domanda. Grazie

    1. Ciao Nico,
      l’unica cosa che mi viene in mente è la presenza del convertitore analogico digitale su arduino a 10bit che comporta i 1024 passi di lettura su 5v da cui deduci 0,0048v di risoluzione.
      Questo tipo di risoluzione potrebbe essere amplificato dal circuito che hai anteposto.

    • Gino il 22 Novembre 2015 alle 23:11
    • Rispondi

    Ciao,
    sto realizzando un progetto con arduino uno che prevede l’alimentazione con una batteria.
    Mi interessa controllare la tensione della batteria attraverso lo stesso arduino e pensavo di utilizzare il pin analogico: ho prelevato la tensione della batteria attraverso un partitore (in modo da ridurre la tensione sotto i 5 volt) e la ho applicata al pin A0. Con analogRead visualizzo il valore analogico sulla porta seriale…
    Ora sorgono i seguenti problemi:
    1) i valori letti sul pin A0 sono molto variabili: da cosa dipende? se tento di visualizzare la tensione con un multimetro questa risulta stabile…
    2) come previsto il valore analogico è compreso in un intervallo da 0 e 1023 ma come posso ricavarmi la tensione in volt applicata al pin A0? Penso che ci vorrebbe una tensione di riferimento a cui rapportarsi ma quale potrebbe essere?
    Grazie in anticipo per la cortese e paziente risposta.

    1. Ciao Gino,
      per la prima domanda potrebbe dipendere sia dal fatto che misuri l’alimentazione dal medesimo apparecchio che la utilizza, sia da un problema nello schema di connessione elettrica per cui potresti necessitare di un circuito differente.
      Per la seconda richiesta la tensione di riferimento la hai è 5v a 1023 per cui puoi fare una proporzione, troverai molti esempi, anche nello stesso IDE arduino, su come fare.

    • Davide il 2 Dicembre 2015 alle 02:13
    • Rispondi

    Cia mauro! A me succede una cosa strana, mi legge un range da 0 a 33333. Il potenziometro è di 10k. Come mai?

    1. Ciao Davide,
      strano forte !!! io penso che dipenda dall’ADC presente sulla scheda .. è un arduino.cc originale?
      Prova a verificare con un tester che il potenziometro sia un 10K ed eventualmente segnala al rivenditore la cosa.

    • Sergio il 22 Dicembre 2015 alle 15:35
    • Rispondi

    Ciao ho un problema che non riesco a capire se è risolvibile. Io ho un sensore di spostamento lvdt che ha una tensione di uscita che va dal negativo al positivo (per esempio da 1,25 V a -1.14V. Collegando il sensore ad Arduino mi sono accorto che fino a quando il sensore non restituisce una tensione positiva per arduino il valore del Pin è 0. Perciò io mi perdo dei dati e le letture sono falsate. E’ possibile impostare il pin di ingresso analogico in modo che legga anche tensioni negative?
    Grazie.

    1. Ciao Sergio,
      non son certo si possa fare, prova a verificare le possibilità dell’IOREF e AREF se possano fare al caso tuo.
      In alternativa puoi immaginare un circuito di shift del segnale da -1.14v / 1.25v ad un range tutto positivo.

    • Sergio il 23 Dicembre 2015 alle 10:27
    • Rispondi

    Grazie proverò .

    • Mauro il 23 Agosto 2016 alle 12:48
    • Rispondi

    Buongiorno,
    utilissimo esempio per chi è alle prime armi con arduino.
    Io però vorrei fare una cosa leggermente diversa, vorrei leggere delle tensioni che sono al difuori da Arduino.
    Su un connettore a pettine ho una massa comune e 18 segnali elettrici da 0 a 5V. Per poter leggere questi segnali con arduino, basta collegare la massa tra arduino e il dispositivo, e leggere i valori come ingressi analogici?

    Grazie.

    1. Ciao Mauro,
      così come descrivi il problema dovrebbe esserti sufficiente, a parte il numero di segnali ( 18 ) per i quali non hai sufficenti pin arduino neppure sulla versione genuino mega.
      Tuttavia verifica bene la parte elettronica prima di collegarla direttamente, potrebbe danneggiarti arduino se i segnali non fossero esattamente 5v.

    • Lorenzo il 9 Gennaio 2017 alle 00:31
    • Rispondi

    Buongiorno Mauro,
    intanto complimenti per il prezioso materiale che ci fornisci.
    Volevo solo segnalarti che in alcuni dei tuoi tutorial (incluso questo) non sono presenti le immagini dei circuiti che descrivi.

    1. Ciao Lorenzo, grazie per la segnalazione.
      Non è un errore, è voluto, in schemi molto semplici, come questo, che si trovano su google lascio che siate autonomi nel trovare uno schema o realizzarne uno vostro.

        • Lorenzo il 9 Gennaio 2017 alle 18:50
        • Rispondi

        Ciao Mauro e grazie per la risposta.
        Avevo scritto pensando fosse saltata la figura dato che nel tutorial c’è scritto “partiamo con lo schema:” e più sotto “Come si vede in figura…”

        1. Grazie Lorenzo per la segnalazione, in questo caso hai ragione, avevo proprio dimenticato la figura.
          L’ho aggiunta.
          Se noti altri articoli con tale dimenticanza avvisami pure.

    • Giordano il 11 Agosto 2017 alle 16:06
    • Rispondi

    Ciao Mauro. Ho trovato questa discussione per caso. Leggo che ci sono dei tutorial. Puoi indicarmi come poterli leggere? Conosco un po di elettronica ma quasi nulla di programmazione. Ho una scheda che pilota una saldatrice a punti. Ruotando un potenziometro da 10K si accendono 8 led in sequenza che corrispondono ad altrettanti tempi di saldatura da 10 a 80 mS in passi di 10 mS. Vorrei poter leggere su un display LCD dei valori in modo continuo da 1 mS a 100 mS ad esempio e poi passare questo valore alla variabile già esistente. Grazie in anticipo.

    1. Ciao Giordano,
      puoi leggere tutti i miei tutorial su questo blog.
      Non saprei aiutarti in quello che desideri non avendo info in merito al tipo di saldatrice ed alle tensioni coinvolte.

    • Marius il 25 Novembre 2017 alle 13:38
    • Rispondi

    Ciao Mauro, sto cercando di realizzare un mio progetto e sono inciampato in questa problematica. Devo leggere un ingresso analogico con arduino mega ogni 20 microsecondi. Io ho provato ha fare questo piccolo programma e quando ho visto il risultato mi sono bloccato.
    Il programma di prova che ho fatto è questo:

    [[ codice rimosso in automatico ]]

    Come dicevo prima il valore dell’analogica varia da 0 a 100 e ritorna a 0 in circa 25 microsecondi. Il fatto che il tempo rilevato nel prog di prova è di 116 microsecondi, riesco a leggere la variazione dell’analogica???

    Grazie e complimenti per i tuoi post.

    Marius

    1. Ciao Marius,
      ti chiedo, in primo luogo il rispetto delle regole presenti in fondo ad ogni articolo.
      Il codice non può essere incollato nei commenti.
      In merito alla tua richiesta penso che i tempi in cui hai necessità di rilevare la variazione siano davvero ristretti, potresti provare con altre tipologie di processore come i Cortex o i SAMD sempre nella famiglia arduino.

    • Peppe il 24 Dicembre 2017 alle 07:47
    • Rispondi

    Salve Mauro, volevo chiedere, se ad esempio io comando con un potenziometro un servomotore questo cambia l’angolo di rotazione in base a come muovo io il potenziometro, ma è possibile se io vorrei dargli un primo movimento e dopo finito quel movimento Arduino ricordi quello che ho fatto e lo faccia da solo fino a quando non decido di cambiarlo nuovamente?

    Grazie mille

    1. Ciao Peppe,
      si è possibile farlo, devi progettare lo sketch in modo adeguato a far questo, non lo fa da solo.

    • Gianfranco il 3 Febbraio 2018 alle 19:43
    • Rispondi

    Complimenti per tutti i tuoi insegnamenti che seguo da anni . Riprendendo ad usare arduino, non ricordo come numerare le righe degli sketch, puoi dirmi come fare ?
    Grazie.
    Gianfranco Toniutti

    1. Ciao Gianfranco,
      in primo luogo evita di inserire l’indirizzo email nei commenti in chiaro.
      in secondo luogo ti chiedo la cortesia di inserire i commenti negli articoli che trattano l’argomento.
      L’aggiunta delle linee nell’IDE arduino si imposta nelle preferenze dell’IDE stesso, dovrei aver scritto un articolo in merito.

    • Domenico il 7 Aprile 2018 alle 18:00
    • Rispondi

    Salve, avrei bisogno di una soluzione in quanto sto alle prime armi, ho visionato diversi skech per capire il funzionamento della programmazione e riesco a fare qualche modifica. Sono arrivato tra lo scopiazzare e modificare a crearmi un menu per arduino Uno. Vorrei che due lm35 mi devono comandare un servomotore per aprire e chiudere una botola in modo da ottenere una temperatura confort di 20C. Il problema più grosso è che ho diversi void, void temperatura1 void temperatura2 ecc. i comandi if else non funzionano all’esterno del ciclo void, in pratica come si comanda il servomotore in base ai due sensori? C’è un’altra via? Non trovo esempi simili ma solo di un singolo sensore cioè termostato.
    Grazie per l’attenzione.

    1. Ciao Domenico,
      non ho compreso la tua richiesta.
      Ricorda che il loop() è uno solo ed al suo interno devi leggere tutti i sensori che vuoi ed applicare le logiche.
      Se crei funzioni void estrene al loop e le richiamo devi portare i valori ricavati nel loop().

    • Andrea il 18 Settembre 2018 alle 19:36
    • Rispondi

    Salve Mauro,
    sto realizzando una scheda per la mia asciugatrice, tutto funzioa ma sono bloccato sulla lettura analogica . Ti spiego: l’asciugatrice, come forse già sai, controlla l’umidità tramite la lettura della resistenza delle due mezze vasche, i panni umidi creano la continuità tra le due metà.
    Ho provato ad usare un partitore per la lettura analogica, mantenendo i valori fissi delle resistenze per avere una misura costante quando i panni sono asciutti o non ci sono, quindi una lettura di default, mettendo poi in parallelo alla resistenza collegata alla vcc la vasca.
    Le letture a questo punto cominciano ad oscillare in modo anomalo quando non c’è continuità(sena panni umidi) e questo lo comprendo perchè sarebbe come lasciare ‘flottante’ il partitore’, ma anche con i panni umidi o ‘cortocircuitando’ la vasca, le letture oscillano enormemente.
    Hai qualche consiglio?
    grazie

    1. Ciao Andrea,
      non mi è chiaro lo schema che stai usando ma potrebbe essere dovuto alla mia ignoranza sul funzionamento di rilevazione dell’umidità dell’asciugatrice.
      Posso di certo dirti che in presenza di valori incostanti è meglio eseguire una media delle letture, magari fissando degli offset sotto sui scartare il valore rilavato per pulirlo da eventuali disturbi dovuti alla parte elettrica e non al sensore stesso.
      In pratica hai la necessità di definire se con i panni umidi ci sia una significativa variazione dei valori rispetto ai panni asciutti o all’assenza di questi ultimi.
      Stabilite le soglie puoi eseguire nel codice un ciclo da 1000, o superiori, letture e definire la media di queste ultime per arrivare a determinare la presenza o meno di panni umidi.
      Nel tuo caso sei abbastanza fortunato in quanto necessiti della consapevolezza solo del dato “ci sono panni umidi” o “non ci sono panni umidi” e non dell’umidità presente, per cui puoi scartare quei valori sotto o sopra una certa soglia.

        • Andrea il 22 Settembre 2018 alle 16:42
        • Rispondi

        Ciao, grazie per la risposta!
        Ho risolto abbastanza con le medie!
        Le vasche delle asciugatrici sono divise a metà da una striscia in plastica in modo da tenerle separate elettricamente, la metà anteriore ha un carboncino che sfrega la vasca (collegato ad un cavetto con faston), la metà posteriore è collegata tramite l’albero alla carcassa. Quando i panni umidi creano conduzione tra le due vasche posso leggere un valore di resistenza o di conduttività usando un partitore di tensione . Non so bene che algoritmo venga usato , però funziona!
        Ora però ho un altro problema che non riguarda la lettura analogica ma l’alimentazione: ti chiedo lo stesso, se vuoi reindirizzarmi posso capire.
        La scheda che sto realizzando usa naturalmente dei relè per pilotare i vari carichi(motore, compressore frigo,ecc) e sto visualizzando dati su un lcd. I rele sono su una scheda da 8 rele optoisolati. Non sempre, ma spesso, il display smette di visualizzare correttamente e mostra caratteri random , nonostante non ci siano interruzioni nello sketch o reboot vari, solo il display. Non è necessariamente collegato all’attivazione di un relè, ma se la faccio andare senza il carico funziona sempre. La mia domanda è: anche se uso due alimentazioni (5V), una per i relè ed una per Arduino e display, anche se ci sono gli optoisolatori, può il carico 220V pilotato dai relè creare un assorbimento o disturbo tale da scombussolare il display?
        Misurando con pinza amperometrica non vedo mai correnti maggiori di 2 Ampere e i relè sono da 10A.
        Sono piu orientato verso i disturbi , ma non capisco come possano ‘passare’.
        Cosa posso usare? VDR? Filtri antidisturbo tipo appunto quelli sulle lavatrici?
        Grazie della pazienza! 🙂

        1. Ciao Andrea,
          i relé hanno di solito un isolamento dichiarato, puoi verificare sul tuo modello e dal datasheet quale sia. Dubito che si possa trattare di un problema di isolamento anche in funzione del fatto che sono, ulteriormente, optoisolati.
          In questo momento stai usando due alimentazioni separate?
          Le masse di entrambe sono connesse tra loro?

            • Andrea il 24 Settembre 2018 alle 19:03

            Ciao Mauro,
            ho parzialmente risolto (è ancora sotto test) con dei condensatori da 0,22 uF 275V tra i contatti dei relè, cercando in rete e sul forum Arduino ho visto che è un problema comune quando si comandano dei carichi induttivi. La cosa strana è che mi scombussola solo il display (LCD 16×2), mentre l’atmega continua a girare tranquillamente.
            I vari consigli riguardavano il filtraggio tramite snubber o comunque un filtro RC per evitare gli ‘sfiammamenti’ dei contatti del relè.
            Al momento c’è una alimentazione tramite trasformatore 220V/5V USB per atmega, un’altra linea 5V per la scheda relè e la linea 220V per le utenze, piu i condesatori tra i contatti del relè ma senza resistenze.
            Le masse delle due linee 5V sono separate ,sono un po perplesso per il collegamento del pin analogico sulla carcassa della macchina per il controllo umidità , in quanto una possibile dispersione a terra della linea 220V mi possa ritornare in scheda. Stavo pensando di optoisolare anche questa, ma avrei solo la possibilità di un ‘on-off’ inteso come ‘panni umidi o asciutti’ , mentre come è adesso posso fare una stima approssimativa del grado di umidità.
            Devo anche considerare come separare le alimentazioni sulla scheda finita, pensavo ad un trasformatore a doppio secondario, ma devo comunque creare 2 VCC e 2 GND.
            Il progettino è interessante, uso millis per un discorso di ‘multi tasking’ , in un secondo momento ci sarà anche l’uso di un esp8266 per il monitoraggio web della macchina, e questo prevede quindi una terza alimentazione a 3,3V con un level shifter per la comunicazione tra le due mcu. La soddisfazione, come ben sai, è di aver recuperato un macchinario che avrebbe dovuto finire in piazzola ecologica a causa del prezzo della scheda originale e del consumismo sfrenato!
            Grazie ancora!

          1. Ciao Andrea,
            sono contento di leggere che il tuo impegno ti stia dando soddisfazione.
            Qualche considerazione in merito a quanto scrivi:
            – se fai la doppia alimentazione è giusto che tu abbia due Vcc ma dovrai avere una sola massa ( Gnd ) come leggi in molti miei articoli;
            – se usi lESP8266 puoi usarlo anche come microcontrollore ed è anche più semplice fare tutta la parte server piuttosto della soluzione ArduinoUno + ESP8266 separata;
            – se è solo l’LCD a subire le interferenze dei carichi induttivi potrebbe essere di non buona fattura ed in questo caso puoi rivolgerti a prodotti di qualità superiore che siano testati in situazioni come la tua.

    • Giovanni il 5 Gennaio 2023 alle 12:46
    • Rispondi

    Il mio non è un commento all’articolo piuttosto una richiesta per approfondire, Premetto che ho un background in fatto di programmazione arduino da diversi anni e non ho mai avuto problemi strani. Ho una esperioenza decennale in fatto di programmazione ma adesso ho un problema: ho prodotto una libreria per gestire tutti i pin digitali e analogici di arduino con varie funzioni, Testata la libreria con apposito sketch e tutto funzionante. Per finire ho aggiunto la gestione dei pin analogici (a0/a5), Nonostante le prove la lettura di un pin analogico tramite un trimmer (o potenziometro) da dalori corretti solo se minini (0V) o massimi (5V) Per tutte le latre misure valori assolutamente errati. Qualunque altro sketch i pin analogici non hanno problemi e letture sono corrette. Ho provato anche a fare una piccola libreria per gestire l’analogico e FUNZIONA CORRETTAMENTE. Ma le stesse identiche operazioni nella libreria principale NION FUNZIONANO. Non sono abituato a desistere da qualunque problema ma questo propiio non lo capisco.
    Grazie per l’attenzione

    1. Ciao Giovanni,
      quello che esponi è molto interessante e di difficile comprensione senza poter vedere la libreria, esiste un repository da cui possiamo scaricarla e provarla ?
      Puoi leggere da due pin analogici contemporaneamente uno con la libreria ed uno con il semplice analogRead() a cui colleghi il medesimo potenziometro ?

  1. […] Non mi dilungo sulla trattazione dell’ADC di Arduino e sula conversione da Analogico a Digitale, ti consiglio di approfondirla leggendo questo articolo. […]

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.