«

»

Lug 06

Stampa Articolo

Programmare con Arduino – Pin Digitali e Analogici

Mi sono accorto che nel precedente articolo sono partito spedito a scrivere di pin, modalità di utilizzo e comandi di INPUT ed OUTPUT, in realtà ho sottovalutato l’aspetto relativo alla conoscenza dei pin presenti su un Arduino e il relativo significato.
Innanzitutto va detto che ciascuna scheda Arduino possiede alcuni pin utilizzabili con segnali digitali, ed altri con segnali analogici, va anche detto che la distinzione non è così netta quando poi programmiamo e ti mostrerò il perchè nel corso di questo articolo, prima facciamo una panoramica:

ArduinoUno_R3_pinPin Digitali: da 0 a 13 ( quadrato rosso )Pin Analogici: da 0 a 5 ( quadrato giallo/arancio )

Pin PWM: 3,5,6,9,10,11 ( quadrato verde )

Arduino LilyPadPin Digitali: da 0 a 13 ( indicato dalla serigrafia )Pin Analogici: da 0 a 5 ( indicato dalla serigrafia a0-a5 )

Pin PWM: 3,5,6,9,10,11

Arduino NanoPin Digitali: da 0 a 13 ( indicato dalla serigrafia d0-d13)Pin Analogici: da 0 a 5 ( indicato dalla serigrafia a0-a5 )

Pin PWM: 3,5,6,9,10,11

Non sono certo tutti i modelli disponbili, che puoi trovare sul sito ufficiale, sono solo quelli che ho potuto vedere e sono sufficenti per chiarirci quali sono i Pin Digitali, i Pin Analogici e i Pin utilizzabili con segnali di tipo PWM ( Pulse Width Modulation ).

Quasi tutte le schede Arduino hanno 14 pin digitali: sono pin che puoi utilizzare sia in modo INPUT (ingresso), per acquisire il valore di un pulsante ad esempio o di un interruttore a leva, sia in modo OUTPUT (uscita) per inviare segnali logici ad una scheda aggiuntiva, ad un led, ecc…
Siccome si tratta di impulsi di tipo digitale il valore che puoi ricevere/inviare è il classico 0/1 o in linguaggio Arduino LOW/HIGH.
Concentrati prima sulla acquisizione rilevare un valore LOW ( 0 ) equivale a dire che sul pin che stai controllando è arrivato un segnale logico basso 0v, viceversa ricevere HIGH ( 1 ) equivale a dire che il pin ha ricevuto un segnale logico alto  5v.
Il ragionamento appena fatto è valido anche in caso di utilizzo dl pin come OUTPUT, ossia per inviare segnali: se invii LOW ( 0 ) invierai un segnale logico basso 0v, se invii HIGH invierai un segnale logico alto 5v.

Un po’ di sintassi:

Per definire come utilizzeremo un dato pin puoi usare il seguente comando: pinMode(pin, modalità) dove pin indica il numero del pin che vogliamo settare con la modalità definita nel secondo parametro, modalità: INPUT o OUTPUT.
Per inviare un segnale al pin utilizza il comando: digitalWrite(pin,level) dove pin indica sempre il numero del pin a cui vogliamo inviare il segnale definito nel secondo parametro, level: LOW o HIGHT ( 0 o 1 ).

Per leggere un valore digitale, magari quello di un interruttore collegato a massa puoi utilizzare il comando pinMode con modalità INPUT, ed il comando digitalRead(pin) dove pin indica il numero del pin di cui vogliamo conoscere il valore.

Alcuni degli ingressi digitali presentano la sigla PWM, per la trattasione di cos’è un segnale PWM ti invito a leggere in internet spiegazioni molto più esaurienti di quella che potrei darti io, per me è molto chiara quella di Giovanni che trovo davvero un ottimo punto di partenza e non solo, ovviamente c’è anche la Wiki dedicata al PWM.
Ma vediamo cosa puoi farci, io ho sperimentato come pilotare dei servocomandi da modellismo oppure led con dissolvenza, scriverò presto degli articoli.
Il segnale PWM accetta come valori da 0 a 255, per ciascun valore varia il duty-cycle generato, ad esempio con il valore 0 otterrai un valore di duty-cycle dello 0% ossia sempre 0 in modo analogo a quello che avresti ottenuto utilizzando  digitalWrite(pin,LOW).
Un po’ di sintassi:

Ricorda sempre di settare la modalità del pin prima di eseguire l’invio dei comandi, in questo esempio ho utilizzato il pin 11 scrivendo: pinMode(11,OUTPUT) indico ad Arduino di utilizzarlo in modo OUTPUT ( come una uscita ); posso quindi inviare il mio segnale con duty-cycle al 50%: analogWrite(11,127), avrai notato che ho utilizzato analog Write anche se il pin 11 è un pin digitale, il motivo è che il tipo di segnale che desidero generare ha una variazione di valori da 0 a 255 e non solo 0 e 1, la funzione digitalWrite accetta come secondo parametro solo 0 e 1 oppure LOW e HIGH. Il valore 127 è esattamente a metà della mia scala ( 0 – 255 ) quindi il duty-cycle generato sarà del 50%.

Per comprendere meglio la questione duty-cycle ho preso l’immagine riportat sul sito Arduino contenete alcuni valori simbolo del duty-cycle in funzione del numero che specificherai:

Tutorial PWM

Infine ci sono 6 pin dedicati ai segnali analogici, ma solo in input, ossia questi pin servono principalmente per acquisire dei segnali provenienti da sensori di tipo analogico: trimmer, potenziometri, fororesistenze, ultrasuoni, IR, ecc… ossia tutti quei sensori che possono generare un segnale analogico in funzione della loro stimolazione (luminosa, meccanica, ecc) se ad esempio volessi rilevare la distanza con un sensore IR dovrai utilizzare uno di questi pin.

Un po’ di sintassi:

Non è necessario settare questi pin con la modalità essendo solo pin di input Arduino sa già come utilizzarli.
Per leggere il valore presente sul pin 5, ad esempio, utilizza il comando: analogRead(pin) -> analogRead(5) il valore rilevato può variare da 0 a 1023, all’interno del range indicato ogni variazione del segnale sarà indicata con una variazione di tale valore.

Nei prossimi articoli vedremo come pilotare un led con dissolvenza(fade), come rilevare la distanza di un oggetto con un sensore IR e man mano come pilotare dei servo motori, e tanto altro ancora …

Permalink link a questo articolo: http://www.mauroalfieri.it/informatica/programmare-con-arduino-%e2%80%93-pin-digitali-e-analogici.html

97 comments

6 pings

Vai al modulo dei commenti

  1. Agostino

    Dove é possibile trovare gli argomenti sul comando di servo motori?

    1. Mauro Alfieri

      Ciao Agostino,
      io parto sempre dal sito ufficiale arduino.cc ci sono molte informazioni veramente utili, sui servo ad esempio puoi consultare la pagina http://arduino.cc/en/Reference/Servo che descrive la classe Servo.
      Ho intenzione di scrivere un tutorial sull’uso dei servo, non garantisco l’uscita ma lo farò presto.

    2. Mauro Alfieri

      Ciao Agostino,
      è on-line il primo dei miei tutoria sui servo: http://www.mauroalfieri.it/elettronica/tutoria-arduno-servo.html

      Spero possa esserti utile.

      1. Angelozap

        Un informazione! Ma gli altri Pin a cosa servono? Tipo Vin? Grazie mille! Ottimo sito!

        1. Mauro Alfieri

          Ciao Angelo,
          nel blog ci sono molti articoli in cui descrivo l’uso degli altri pin.
          Vin é collegato alla tensione di ingresso di arduino.

          Mauro

  2. Andrea Zanni

    Ciao, ho una domanda, è possibile settare HIGH a un valore diverso da 5V per un pin in output?ad esempio a 2 V?
    grazie

    1. Mauro Alfieri

      Ciao Andrea,
      Il valore HIGH è preimpostato a 255 non ai volt erogati, potresti provare con una uscita PWM controllandola in analogWrite, cerca come usare l’output PWM come potenziometro, penso sia quello che ti occorre, magari un prossimo articolo lo dedico a questo problema.

      Grazie e buon divertimento.

  3. Andrea Zanni

    Intanto grazie della risposta. Ti spiego meglio il mio problema, io con arduino devo pilotare alcuni componenti digitali che hanno come range massimo di tensione digitale in ingresso un valore di circa 3V. Io li piloto tramite i pin SPI di arduino mega 2560. per questo ti chiedevo se era possibile cambiare il valore di default di High. ora la domanda che mi viene da farti è posso conciliare l’output Pwm e quello SDI????grazie!!

  4. Andrea Zanni

    mi sono scordato di dire una cosa, l’alimentazione del mio componente è +- 2.5V

    1. Mauro Alfieri

      Ciao Andrea, non sono molto ferrato sull’uso dell’SPI, se pupo fornirmi qualche link su cui documentarmi provo a capire se quelo che vuoi fare è fattibile.
      Pubblico i tuoi commenti perchè magari altri lettori del blog con maggiori conoscenze delle mie possano darti aiuto.

      Ciao

  5. Andrea Zanni

    Ciao…sinceramente non ho ancora trovato nulla di così interessante in giro riguardo al mio problema…intanto grazie…

  6. Davide

    Ciao Mauro, mi sto avvicinando ad Arduino e vorrei realizzare un progetto che prevede l’utilizzo di due componenti (sensore temperatura e orologio) che andrebbero collegati agli stessi PIN (+5V, GND, Clock (SCL), Data (SDA)): i primi 2 (+5V e GND) immagino non siano in problema, ma gli ultimi 2 (Clock (SCL) e Data (SDA), da connettere rispettivamente ai PIN analogici 5 e 4) immagino che non sia possibile collegarli agli stessi PIN: hai qualche suggerimento per risolvere questo problema? Posso usare altri PIN (ad esempio 3 e 2) per collegare questi 2? Se sì, significa che devo cambiare qualche libreria? Grazie mille!

    1. Mauro Alfieri

      La tua ipotesi potrebbeessere una buona soluzione, che librerie utilizzi?

    2. Mauro Alfieri

      Ciao Davide, come procede il tuo progetto? Mi hai inviato i nomi delle librerie che intesi usare?
      Se vuoi seguimi su twiter @mauroalfieri ci sono altri appassionati ed esperti come noi che possono darti aiuto.
      Mauro

  7. andreino

    Salve Mauro, ti faccio una domanda forse banale :<>:

    Grazie

    1. Mauro Alfieri

      Quale domanda vuoi sottopormi?

      Mauro

  8. ivob

    intanto ringrazio anticipatamente !!!! sto cercando di leggere due o tre segnali analogici collegati agli ingressi A0.A1,A2 io ho trovato il codie per uno solo come avrai capito sono all’inizio puo darmi un aiuto grazie !!!

    1. Mauro Alfieri

      Ciao Ivob,
      prova a seguire un po’ di tutorial sul blog, se sei alle prime armi certamente potrai trovare tante cose interessanti da scoprire.
      Per la tua richiesta di leggere più segnali analogici puoi risolverla in molti modi, il più semplice è usare lo stesso comando “analogRead” per ciascun ingresso.

      Se mi scrivi cosa vuoi farci con questi segnali magari posso darti altre info più dettagliate.

      Mauro

  9. gcam

    Salve, devo utilizzare un ADC esterno con arduino: MCP3301.
    L’ADC utilizza l’interfaccia SPI. Ho cercato di capire il funzionamento dell’interfaccia, che sembra semplice, utilizzando la libreria. Però mi sfuggono alcune cose specialmente nella fase di configurazione: SPI.setClockDivider, SPI.setDataMode, SPI.setBitOrder(). Considerando l’ADC in questione quali sono i valori corretti da utilizzare ?
    Per quanto riguarda la gestione dell’ADC, utilizzo il codice sotto riportato, però devo capire se eseguo le cose correttamente. La gestione dei cicli e i bit che leggo, forse dovuto al fatto che ancora non so leggere il datasheet in particolare la pagina 21 e 22.

    // inslude the SPI library:
    #include

    # define CS 10 // Pin Selezione
    //# define MOSI 11 // MOSI // non utilizzato in quanto l’ADC non necessità di configurazione
    # define MISO 12 // MISO
    # define SCLK 13 // CLOCK

    #define FASTADC 1
    #ifndef cbi
    #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
    #endif
    #ifndef sbi
    #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
    #endif

    long readvalue0;

    void setup()
    {
    // Set pin modalità
    pinMode (CS, OUTPUT);
    //pinMode (MOSI, OUTPUT);
    pinMode (MISO, INPUT);
    pinMode (SCLK, OUTPUT);

    // Disabilitare il dispositivo per iniziare
    digitalWrite (CS, HIGH);
    //digitalWrite (MOSI, LOW);
    digitalWrite (SCLK, LOW);

    Serial.begin (115200);

    //SPI.setClockDivider (SPI_CLOCK_DIV2);
    //SPI.setClockDivider (SPI_CLOCK_DIV4);
    //SPI.setClockDivider (SPI_CLOCK_DIV8);
    //SPI.setClockDivider (SPI_CLOCK_DIV16);
    //SPI.setClockDivider (SPI_CLOCK_DIV32);
    //SPI.setClockDivider (SPI_CLOCK_DIV64);
    SPI.setClockDivider (SPI_CLOCK_DIV128);

    SPI.setDataMode (SPI_MODE0);
    //SPI.setDataMode (SPI_MODE1);

    //SPI.setBitOrder (MSBFIRST);
    //SPI.setBitOrder (LSBFIRST);
    }

    void loop ()
    {
    long t0=micros();
    for(int k=0; k<500; k++)
    {
    readvalue0 = read_adcSlow ();
    Serial.println (readvalue0, DEC);
    }
    }

    int read_adcSlow ()
    {
    long avg = 0; int value=0;
    for (int k=0; k=0; i–)
    {
    //value += digitalRead (MISO) << i;
    value += (bitRead(PINB, 4) << i);
    //cycle clock
    digitalWrite (SCLK, HIGH);
    digitalWrite (SCLK, LOW);
    }
    avg=avg+value;
    digitalWrite (CS, HIGH);
    //delayMicroseconds (10);
    }
    avg=avg/4;
    return avg;
    }

    sapete dirmi se eseguo le cose correttamente e come faccio a verificare ?

    grazie.

    1. Mauro Alfieri

      Ciao gcam,
      purtroppo non ho mai provato l’ADC MCP3301 ed ho fatto poche esperienze con l’interfaccia SPI.
      Pubblico il tuo commento perchè altri appassionati possano darti un aiuto.

      Se intanto riesco a sperimentare con questo ADC e trovo qualche dritta te la invio.

      Mauro

  10. gcam

    Ti posso dire che il codice ‘funziona’.

    Speravo di avere qualche dritta sulla lettura del datascheet, anche per poter utilizzare altri dispositivi SPI.

    grazie.

    sul datasheet cosa si intende per SB ?
    praticamente ci sono due bit null, sb e poi 11 bit che dovrebbero corrispondere al valore.

    Poichè l’ADC consente di settare una VREF esterna compresa tra 400mV e 5V, vorrei settare come VREF 400 mV. Come la creo ?

  11. simone

    ciao,
    volevo porti una domanda: che tensioni e che correnti può gestire arduino negli ingressi analogici? cioè quanti volt e quanti ampere posso collegare in ingresso?
    grazie,
    simone.

    1. Mauro Alfieri

      Ciao Simone,
      puoi verificare sul sito ufficiale le caratteristiche della tua scheda, variano in funzione del modello ( Uno, Mega, Due, … )

      Mauro

  12. michele

    salve, sto utilizzando ArduinoLeonardo e mi servirebbe il comando per configurare i piedini analogici in digitale.. sapresti dirmi come si fa? grazie.

    1. Mauro Alfieri

      Ciao Michele,
      non ho compreso la richiesta, vuoi usare I pin analogici come digitali?

      Hai provato a dichiararlo con il pinMode() e leggerli con digitalRead()?

      Spero. Aver interpretato la tua richiesta.

      Mauro

  13. Loris

    Ciao Mauro
    Devo per necessita creare un programmino per arduino uno
    Non e tanto complesso…. Sono disposto a finanziare il tutto
    Sei disposto ad aiutarmi ?
    Ciao Loris

    1. Mauro Alfieri

      Ciao Loris,
      descrivimi in una email ciò che vuoi realizzare, l’indirizzo é l’info del blog.
      Ti aiuto volentieri e se non richiede molto tempo non ci sono problemi economici.

      Ti chiedo la cortesia, in email, di mettere tutti i dettagli possibili.

      Mauro

  14. Loris

    Grazie mille ti sto inviando il tutto

  15. LORIS

    CIAO MAURO
    SCUSAMI SE TI DISTURBO… TI è ARRIVATA LA MIA MAIL CON IL VIDEO ?

    1. Mauro Alfieri

      Ciao Loris,
      no, non mi è arrivato nulla.
      Puoi evitare il MAIUSCOLO 🙂

      Grazie
      Mauro

  16. Loris

    Te l’ho inviata con un video su info@mauroalfieri.dot.it
    e giusto?

    1. Mauro Alfieri

      Ciao Loris,
      Dot in inglese é . Quindi il dominio é mauroalfieri.it

      Cosa contiene il video?

      Mauro

  17. Loris

    Il video c’è il movimento che deve fare la macchina…
    Oggi te lo rinvio

  18. Roberto

    Salve Mauro!
    Innanzi tutto volevo farle i complimenti per il suo sito che offre guide dettagliate e ottime per iniziare con arduino.
    Veramente un ottimo lavoro.
    Volevo chiederle se riusciva a togliermi un dubbio con arduino: quando cerco di accendere 2 led solo il primo si accende al pieno della potenza mentre gli altri si accendono fiacchi e quasi non si vede nemmeno.
    Come posso fare per farli accendere? le ho provate tutte.
    Roberto

    1. Mauro Alfieri

      Ciao Roberto,
      per poter rispondere con precisione avrei bisogno di sapere:
      – quanti sono i led
      – che tipo di led sono
      – a quali pin li hai connessi
      – quali resistenze hai utilizzato
      meglio ancora se sai l’assorbimento di ciascun led.
      La causa principale potrebbe essere l’elevata richiesta di corrente da parte dei led, arduino è in grado di erogare 40mA max per pin ed in totale 150mA massimi.

      Mauro

      1. Roberto

        Non conosco le specifiche dei led perchè li ho trovati in un kit di arduino.
        Per fare una prova avevo connesso i led senza resistenza per quello non andavano.
        Mettendo delle resistenze da 220 ohm si accendono entrambi un pò meno forte.
        Grazie mille Mauro.
        Volevo chiedere un’altra cosa:
        è possibile bloccare temporaneamente il loop ad un determinato punto facendolo riprendere alla pressione di uno o più tasti?
        Grazie mille in anticipo.

        1. Mauro Alfieri

          Ciao Roberto,
          ben fatto per i led.
          Si esistono diverse tecniche per ottenere una pausa temporanea fino alla pressione di un pulsante o altro segnale.
          Ti consiglio di approfondire i cicli di tipo “while” che consentono di creare dei loop interni alla funzione loop() stessa.

          Mauro

  19. Fabiano

    Ciao Mauro,
    vorrei collegare ad un pin digitale dell’Arduino UNO un telecomando per le luci del giardino. L’idea è quella di mantenere sempre premuto con un morsetto il pulsantino del telecomando ed agire, tramite Arduino, sulla sua alimentazione per accendere/spegnere le luci. Il telecomando funziona con due batterie a bottone (del tipo CR2032) da 3 V ciascuna, quindi 6 V in tutto. L’assorbimento medio del telecomando è di 14 mA.

    Arrivo alla mia domanda: visto che l’output del pin digitale è di 5 V, questi potrebbero bastare (e quindi potrei collegare direttamente il telecomando, ovviamente senza le batterie, al pin) oppure il Volt di differenza mi obbliga ad usare un mosfet?

    Tante grazie per l’attenzione.
    Fabiano

    1. Mauro Alfieri

      Ciao Fabiano,
      se, come dici i 5v sono sufficienti al telecomando non hai bisogno di mosfet o altro, se non lo sono ti consiglio un relè per arduino.
      In ogni caso mi sembra una soluzione macchinosa, hai pensato di usare direttamente arduino come telecomando? Ho scritto degli articoli in merito.

  20. marco

    Volevo chiedere un parere,Vorrei utilizzare Arduino per sostituire la scheda di controllo di una stufa a pellet,è fattibile la cosa?

    1. Mauro Alfieri

      Ciao Marco,
      mi sembra pericoloso in quanto le stufe a pellet avranno sicuramente una centralina complessa per il controllo fumi, erogazione del pellet e bruciatore.
      Solitamente i produttori sottopongono a complessi controlli e certificazioni i loro prodotti per dichiararli sicuri.
      Se la tua stufa non ha delle funzioni che desideri controlla che non sia possibile integrare tali funzioni esternamente, magari tramite arduino, su protocolli di tipo seriale, I2C o SPI.

  21. tesla668

    Carissimo Mauro, innanzitutto un sincero ringraziamento per come esponi la programmazione ed i passi per realizzare un progetto. Io ho perso il lavoro di tecnico commercile con altre 90 persone, mi occupavo di soluzioni per la connessione elettrica. Adesso sto affrontando un percorso di riprofessionalizzazione, visto che vendendo un monoprodotto mi sono perso molte cose per starda…tra cui Arduino, che mi sta appassionando e aiuando. Ho un problema con la gestione di più cicli all’ionterno dello stesso programma. Faccio un esempio se devo gestire 4 input e 4 output ( Analog i primi e Digital i secondi), metti che devo timerizzare un OUTPUT e lo faccio con DELAY, tuto il programma si ritarda. Mi sono letto tutti i manuali possibili ed ho trovato una soluzione nel tuo Tutorial Interrupt ,ne ho capito il funzionamento edho realizzato tutto.

    C’è qualcosa di più leggero ? Come posso gestire tempi di intervento divesi sugli OUTPUT?

    GRAZIE e forza ,continua su questa strada

    CIAO

    1. Mauro Alfieri

      Ciao Roberto,
      al posto del delay() puoi usare la funzione millis() per verificare il trascorrere del tempo ed evitare il delay.
      E’ più leggero ma di certo differente dall’uso degli interrupt che servono a tutt’altra cosa e sono solo 2 in arduino uno.

  22. Michael

    Ciao non potresti fare un piccolo progetto serra con ecoduino non solo che dia da bere ma che rinfreschi l’ ambiente se è troppo caldo e che tramite fotoresistenze si accendono dei led come illuminazione a mo di serra idroponica. Grazie se leggi questo commento bel blog 🙂

    1. Mauro Alfieri

      Ciao Michael, sarebbe un progetto interessante e sicuramente leggendo gli articoli che ho già scritto sarai in grado di farlo di solo, pensa alla soddisfazione di dire: l’ho fatto io al posto di dire agli amici “l’ho copiato da un sito”

  23. Guglielmo

    Ciao Mauro da poco tempo sono entrato nel mondo di Arduino e ho letto alcuni dei tuoi corsi che sono veramente comprensibili anche per persone poco esperto come il sottoscrito. Io vorrei costruire una piccala attrezzatura semi automatica movimentata da 2 cilindri pneumatici comandati da 2 elettrovalvole con 2 solenoidi, come ingressi ho 3 sensori di prossimità, 3 sensori di fine corsa dei cilindri, un pulsante di emergenza, uno di avvio ciclo e uno di fine cicli, con la scheda Shield IN/OUT cod.8220-VMA05 è possibile farla funzionare?
    Grazie
    Ciao

    1. Mauro Alfieri

      Ciao Guglielmo,
      contandoi sensori che vuoi inserire sono più di 6, se non conto male, e questa scheda gestisce 6 sensori di input e 6 output che nel tuo caso sarebbero troppi output.
      Probabilmente una shield con 4 relay sarebbe più che sufficiente ed i sensori li colleghi direttamente ad arduino se lavorano a 5v.

  24. Guglielmo

    Ciao Mauro
    Avendo la scheda 6 ingressi analogici e 6 digitali pensavo di utilizzare dei sensori digitali e i pulsanti analogici, mentre non ho problemi per le uscite in quanto sono 4 per i 2 cilindri + 1 per la valvola di scarico rapido per l’emergenza.
    Colgo l’occasione per augurati un buon 2015
    Guglielmo

    1. Mauro Alfieri

      Ciao Guglielmo,
      perdonami ma avevo inteso che tu volessi utilizzare solo gli ingressi digitali della shield in-out ( 6 appunto ) se usi anche quelli analogici puoi avere in ingresso 12 input ( 6 analogici e 6 digitali ) ricorda che sono tutti ingressi a 5v e che gli analogici ti daranno un valore da 0 a 1023 in funzione del circuito che gli connetti.

      1. Guglielmo

        Grazie delle informazioni.
        Pensavo anche; è possibile, avendo montato la scheda in / out su arduino, poter collegare anche il display LCD ACM1602B per visualizzare istruzioni, allarmi o commenti.

        grazie ancora per la disponibilità.

        Guglielmo

        1. Mauro Alfieri

          Ciao Guglielmo,
          a memoria ti direi di no in quanto il display necessita di 8 pin + 1 pin di blacklight per il controllo e la IN/OUT di 6 pin digitali.
          So che la Lemontech.cc ( http://www.lemontech.cc ) sta per produrre una shield LCD che funziona con soli due pin ed a quel punto potresti riuscirci.
          Tieni sotto controllo il sito per sapere quando sarà disponibile.

  25. Davide

    Salve Mauro,
    Avrei una domanda da porle, premetto che sono agli inizi!
    Come posso sapere la totale quantità di alimentazione che mi serve per un progetto fatto da Arduino uno+wifishield di adafruit+sensore dht22? Come si può fare? Mi servirebbero più informazioni possibili a riguardo.
    La ringrazio tanto, davvero!

    1. Mauro Alfieri

      Ciao Davide,
      il modo più affidabile che conosco è costruire il circuito e misurare la corrente assorbita in fase di funzionamento per il periodo che ti interessa monitorare in modo da avere valori certi.

  26. Andrea

    Buongiorno Mauro,

    e complimenti per il tuo spazio web che per me è diventato di riferimento, nel cercare di capire Arduino.
    A proposito di segnali in ingresso ti chiedo:

    ho bisogno di avviare un programma attraverso un pulsante, e poi il programma deve tornare all’inizio, in attesa di una nuova pressione del pulsante.
    Il probema è che il pulsante, una volta premuto, può rimanere premuto anche a lungo, anche quando il programma è già finito ed attende il nuovo segnale.
    Io vorrei che il programma si riavviasse solo quando:
    il pulsante è stato rilasciato, e poi nuovamente premuto.
    Cioè, credo, con un impulso, anziché con uno stato.
    Come faresti?

    Ti ringrazio per la disponibilità.

    Andrea.

    1. Mauro Alfieri

      Ciao Andrea,
      io userei un boolean di controllo se la pressione è avvenuta lo setti a “true” e verifichi la pressione, al rilascio imposti “false” così sai se il pulsante è già stato premuto o è ancora premuto dalla volta precedente.

  27. federico

    ciao, sono un ragazzo di 14 anni molto appassionato di queste cose.
    volevo davvero ringraziarti, perché grazie ai tuoi cosiddetti corsi sto riuscendo a capire la programmazione, in attesa di ricevere arduino.
    grazie 10000

    1. Mauro Alfieri

      Bene Federico,
      io lo faccio con piacere e so che tu imparerai tanto 🙂

  28. ezio

    Ciao a tutti ho bisogno di una mano sto realizzando un progetto ma mi sono bloccato … Il progetto è una macchina per riempire il vino nelle bottiglie … Tutto il progetto di basa su un loop che comanda una sequenza di operazioni solo che adesso mi servirebbe che a metà loop il sistema si fermasse e tramite un pulsante vorrei farlo ripartire io per continuare l’altra metà rimanente di loop

    1. Mauro Alfieri

      Ciao Ezio,
      descritto con i pochi particolari che mi dici potrei ipotizzare tante soluzioni e magari nessuna adatta.
      Cosa intendi per “una sequenza di operazioni solo che adesso mi servirebbe che a metà loop il sistema si fermasse”:

      quali sono le operazioni ?
      quanto dura ciascuna ?
      quanti sensori usi per capire in che punto sei ?
      quando capisci che sei a metà ?
      a metà del loop() cosa succede che ti fa capire che ci sei arrivato ?
      ogni loop() serve solo ad un ciclo o per riempire una bottiglia ci vogliono più cicli ?
      é un prodotto personale o devi industrializzarlo ?

  29. Francesco

    Ciao e grazie per l’articolo!
    Ho notato che quando pongo il servo in posizione 90°, il servo sembra rimani acceso senza che la testina si muova. Ad angoli tipo 45° o altri, il servo raggiunge la posizione e poi si spegne (non si sente nulla). A 90, raggiunge la posizione e rimane acceso (si sente il rumore del motorino interno).

    È normale?

    1. Mauro Alfieri

      Ciao Francesco,
      non dovresti udire un sovraccarico del servo per mantenere la posizione, questo indica che il motore non riesce a raggiungere o mantenere la posizione e l’elettronica del servo tende a correggere continuamente.

      1. Francesco

        Quindi è difettoso? Ho parlato con chi me l’ha venduto e mi ha detto che è normale…

        1. Mauro Alfieri

          Ciao Francesco,
          mi sono probabilmente spiegato in modo errato: ti ho scritto il motivo per cui verifichi questo comportamento.
          La causa non è necessariamente un malfunzionamento del prodotto potrebbe ad esempio dipendere dal tipo di controllo che effettui o da altri fattori esterni, ad esempio la meccanica a cui è collegato, ecc…
          Per verificarlo ti consiglio di testare il servo con un controller per modellisti, possibilmente della stessa ditta produttrice del servo, verificando che ad ogni comando il relativo posizionamento.

  30. Alberto

    Ciao Mauro, avrei bisogno di alcune informazioni per un progetto che sto tentando di realizzare con Arduino Mega SDK.
    Ti anticipo che sono molti anni che non tocco elettronica e non mi sono mai approcciato ad arduino sinora, tuttavia ci provo.
    Il mio scopo è quello di leggere tramite input analogici dei valori di tensione e digitalizzarli per leggerli in tempo reale.
    Leggo sul sito di arduino che il range in input analogico è 0-5 v ed una corrente massima di 40mA.

    Come alimentazione utilizzo una normale batteria 9V duracell.

    Vengo alle domande:
    – C’è modo di limitare la tensione di uscita da un circuito in mofo da non far mai arrivare oltre 5v ad arduino?
    (tento una risposta: con uno zener 5.1 o 4.7? e come dovrebbe essere fatto il circuito? Ho provato col solo zener ed in pochi secondi è diventato rovente ergo troppi mA)

    – C’è modo di limitare la corrente a 40mA (o meno) per lo stesso motivo di cui sopra?

    Grazie per la disponibilità

    1. Mauro Alfieri

      Ciao Alberto,
      senza sapere a quale tipo di progetto stai lavorando e che tipo di sensore stai collegando non so risponderti.

  31. Antonio

    Ciao Mauro,
    devo pilotare un motore attraverso arduino, controllando:
    1 velocità del motore (attraverso un potenziometro);
    2 tempo di lavoro, ovvero il tempo per cui deve girare (controllato sempre attraverso un potenziometro);
    3 tempo di pausa, ovvero quando il motore non deve girare (controllato sempre attraverso un potenziometro).
    per farlo ho scritto 2 programmi, quello che controlla la velocità e uno che controlla il tempo di lavoro, mentre per il tempo di pausa non ho visto ancora nulla.
    visto che i due programmi sono separati ho bisogno di unirli, non ci riesco perchè ci sono 2 righe di codice per azionare il motore. potresti aiutarmi?

    [[ codice rimosso in automatico ]]

    Grazie in anticipo.

    1. Mauro Alfieri

      Ciao Antonio,
      innanzitutto ti chiedo di rispettare le regole in fondo ad ogni articolo e nelle pagine del blog.
      Non correggo codici di altri e sopratutto nei commenti.

      Per il tuo problema ti basta fare uno schema mentale delle fasi da eseguire e in che sequenza eseguirle, poi tradurre in un unico sketch il risultato, non puoi avere due righe che contemporaneamente debbano azionare il motore in quanto o sei in fase 1 o in fase 2 o in fase3 non sarai mai in fase 1 e 2 contemporaneamente

      1. Antonio

        Chiedo scusa per non aver utilizzato il tag per scrivere il codice, quindi non posso regolare la velocità del motore e contemporaneamente regolare il tempo di lavoro? Ovviamente io voglio farlo con due potenziometri.

        1. Mauro Alfieri

          Certo che puoi Antonio,
          leggi bene la mia risposta ed i consigli che ti ho scritto.

  32. Guli

    Con arduino uno mi ritrovo le uscite digitali non PWN in stato low con 3volt invece che a gnd….non dovrei avere solo 0 o 5V?

    1. Mauro Alfieri

      Ciao Guli,
      hai già provato a collegarci un led+resistenza per verificare che sia una tensione effettiva?
      L’arduino è originale?

  33. Angelo

    Ciao Mauro, complimenti per il sito e per il modo con cui spieghi, sono a muovere i primi passi con Arduino uno, ti volevo chiedere se hai fatto una guida su come gestire un pulsante NO e un pulsante NC in serie.
    Volevo capire come si programma arduino con il classico comando marcia, arresto e blocco sicurezza.
    Grazie, intanto continuo a leggere i tuoi articoli.

    1. Mauro Alfieri

      Ciao Angelo,
      nel corso Base trovi molti tutorial sui pulsanti che puoi adattare al tuo scopo.

  34. Davide

    Salve. È possibile utilizzare una porta analogica come se fosse una porta pwm? Mi spiego: ho da utilizzare un led rgb ma ho gia tutte le porte pwm utilizzate posso usare le porte analogiche in modo che possa “impostare” il colore del led? E se si come?

    1. Mauro Alfieri

      Ciao Davide,
      i pin analogici possono essere usati come digitali in input o output ma come PWM in output mi sembra di no. Puoi verificare sul pinout arduino.

  35. Nico

    ciao Mauro vorrei sapere da te se e possibile con arduino controllare l’automobile mi spiego meglio
    vorrei che arduino controllasse lo stato porte aperte avaria luci o altre avarie controllo temperatura e via discorrendo ma essendo l’impianto della macchina a 12V spenta e circa 14V accesa ti chiedo come superare tale o se mi puoi indirizzare in qualche modo premetto che non sono ne un tecnico ne un informatico ma solo un appassionato autodidatta grazie in anticipo

    1. Mauro Alfieri

      Ciao Nico,
      volendoti collegare direttamente agli impianti esistenti, io lo sconsiglio per una questione di garanzia e sicurezza stradale, puoi usare degli optoisolatori opportunamente tarati per interfacciare i sensori a 12/14v a uscite a 5v.
      Nel blog trovi trattato l’argomento e dovrai costruirti tu un circuito adatto predendolo dal datasheet o da qualche manuale di elettronica.

  36. luigi

    ciao mauro.
    sto creando un progetto scolastico in cui faccio comunicare due arduino uno come trasmettitore/ricevitore. l’unico problema è che non so come settare tutti i pin digitali (che saranno led) a livello basso. dove una volta andati HIGH tornino bassi dopo qualche millisecondo (microsenddelay)

    1. Mauro Alfieri

      Ciao Luigi,
      trovi nel blog molti articoli in cui è spiegato come portare un pin da HIGH a LOW.

  37. Gianpiero

    Ciao Mauro….inizio a dirti che di elettronica non ci capisco un tubo…ho comprato però.. Un kit da AMAZON e precisamente ELEGOO STARTER KIT mega 2560r3…vorrei costruire un sensore di umidità per interno con display a 16 pin ..ho provato ma non riesco,anche perche non so come collegarli..mi invii per favore in e_mai uno schema su come devo collegare il display alla scheda ? Grazie mille Gianpiero

    1. Mauro Alfieri

      Ciao Giampiero,
      trovi tutto nel blog, basta usare il campo di ricerca.
      Premetto che i display sono trai componenti più complessi da collegare e variano i collegamenti da display a display, nel blog trovi alcuni esempi, per essere certo di non danneggiarli ti serve lo schema di collegamento del produttore.

  38. Elia

    Ciao Mauro,
    posso usare i pin 0 e 1 come input/output digitale? Sto provando con 2 pushbutton ma mi ritorna un segnale sempre HIGH (diversamente da altri pushbutton connessi su pin differenti). Non so se usandoli come output per 2 led possa cambiare qualcosa…

    Grazie tante.

    1. Mauro Alfieri

      Ciao Elia,
      se li usi come pin digitali non puoi usare il serial monitor e le istruzioni Serial nel tuo sketch. Trovi il motivo descritto in alcuni articoli del mio corso base gratuito arduino on-line

  39. Pierpaolo

    Buongiorno, ho iniziato da poco a utilizzare Arduino non originale ma alla fine mi sembra che non cambi nulla. I primi problemi sono stati causati dal driver che non riconosceva la scheda sulla com3. Adesso tutto ok. Ma il maledetto led “L” che continua a lampeggiare sempre anche quando cambio listato. Ho letto sul forum che bisogna mettere un resistore da 100k dal pin 13 (che corrisponde al pin 19 Atmega328p) e gnd!!! Proverò. Chissà perchè si utilizzano ancora le porte com (se fosse seriale ok) con la porta usb ………………….. . In ogni caso volevo far presente che a me non funziona nulla, inserisco un codice ma senza ottenere niente di niente. Volevo iniziare con il progetto pulse heart ma per il momento sono fermo. Ho acquistato un libro per iniziare a utilizzare al meglio questa schedina e appena mi arriva sperimento. Caspita forse era meglio il mitico ST7! Saluti.

    1. Mauro Alfieri

      Ciao Pierpaolo,
      se tu usassi l’originale non avresti tutti questi problemi.

  40. renato de felice

    desidero contattare mauro alfieri per commissionarlo un mio progetto che non riesco
    a far funzionare ( forse 79 anni la memoria fa cilecca)
    renato de felice grazie

    1. Mauro Alfieri

      Ciao Renato,
      puoi scrivermi del progetto alla casella info del blog, la medesima da cui ti è arrivata questa email.

  41. Biagio Antonio Lo Cascio

    Ciao Mauro, ho conosciuto oggi il tuo sito.
    Ho un piccolo problema, ho ditate su IDE uno sketch ed in una ria di seta, ho digitato : digitalState(2); // Pin INPUT.
    Facendo la verifica mi spunta :exit status 1 ‘ was not declared in this scope’.
    Vorrei sapere cosa significa e cosa dovrei fare.
    Sono alle prime armi.
    Ringrazio anticipatamente

    1. Mauro Alfieri

      Ciao Antonio,
      in primo luogo non ho compreso cosa tu sta facendo, forse a causa della correzione del cellulare la frase è incomprensibile.
      Il comando “digitalState” non esiste.

  42. Simone

    Ciao Mauro,
    innanzitutto complimenti per il magnifico lavoro che hai realizzato.
    Ho un problema che apparentemente può sembrare stupido ma che non riesco a risolvere per via della mia poca conoscenza di Arduino.
    Sto utilizzando un Arduino Mega 2560 con il quale devo gestire un Mass Flow Controller.
    Il mio problema riguarda l’apertura della valvola del MassFlow il quale richiede un voltaggio di +5 VDC e deve essere effettuato dal pin analogico (nel mio caso, il pin in questione è il A4) quindi dal pin A4 di Arduino (il quale è collegato al pin relativo del MassFlow) mi deve uscire un voltaggio di +5 VDC che mi permette l’apertura della valvola .
    Ora le chiedo: come si scrive questo comando che vorrei effettuare nello sketch?
    La ringrazio anticipatamente per l’aiuto che mi darà.

    1. Mauro Alfieri

      Ciao Simone,
      innanzitutto ti consiglio di leggere e comprendere i miei articoli ed il corso arduino base gratuito che ho realizzato e pubblicato in questo blog.
      Perché vuoi usare il pin A4 come output? I pin A0-A5 possono essere usati come Analogici in input o digitali in output.

      1. Simone

        Ciao Mauro,
        la scelta del pin A4 è stata casuale, serviva solo per capire come effettuare il comando; usare il pin A4 come output mi sono reso conto che era un errore.
        Comunque, leggendo i suoi articoli e il corso base di arduino, sono riuscito a risolvere questo problema.
        La ringrazio di nuovo per l’aiuto e per la disponibilità.

        1. Mauro Alfieri

          Bravissimo Simone.

  43. Aldo Leardi

    Buongiorno Mauro, cercando indicazioni su Arduino sono incappato sul tuo lavoro che trovo impressionante e frutto sicuramente di una passione pura. Io sono datato e distratto da altre cose ma per onorare il regalo di Arduino fattomi a Natale dai nipoti, ho provato a farne una applicazione. Si tratta di misurare un impulso che va alto per un tempo variabile da 4ms a 1004 ms . Ho usato l’istruzione durata = pulseIn(pin, HIGH, 1004000) . che poi divido per 1000 e visualizzo. Il risultato sembra coerente con la durata rilevata sull’oscilloscopio tranne che per valori superiorti a 30 ( 30000 micros ) ho inversione di segno. Ti sarei grato se potessi indicarmi come uscirne , ne va della mia onorabilità di nonno. Grazie e buon divertimento.

    1. Mauro Alfieri

      Ciao ALdo,
      lavoro encomiabile per essere un primo esperimento .. hai tutta la mia stima.
      L’inversione di segno potrebbe essere dovuta solo ad un errato tipo si variabile utilizzata che trasformando i numeri in binario ti riporta a valori negativi raggiunto il suo limite superiore.
      Che tipo di variabile hai utilizzato?

  44. Aldo Leardi

    Buongiorno Mauro, ho risolto il problema impostando la variabile come ” unsigned long” . E’ bastato leggere qualche lezione del tuo corso. Lavoro meritorio. Grazie. Se dovessi mettere la testa a posto, non è escluso che torni a disturbarti per altri consigli. Buon lavoro

    1. Mauro Alfieri

      Bene Aldo,
      se tu volessi condividere i tuoi progetti sarò lieto di pubblicarli.
      Leggi nella sezione “Collabora al Blog” come fare e pensa che se oggi quello che ho scritto è stato utile a te ciò che hai da raccontare domani sarà utile ai tuoi nipoti e non solo.

  1. Mauro Alfieri » Blog Archive » Tutoria Arduno e i servo

    […] Se vuoi pilotare dei servo prima di tutto devi sapere che la complessità dell’opera nasce dalla necessità di utilizzare un duty-cycle per impartire comandi a questi meravigliosi oggetti in grado di trasformare la volontà elettronica in movimento. Arduino dispone, secondo i modelli, di uscite PWM ossia pin digitali in grado di generare un duty-cycle utilizzabile per far muovere un servo, puoi trovare una panoramica sull’argomento in questo mio articolo. […]

  2. Mauro Alfieri » Blog Archive » Arduino: led rgb e Ikea

    […] il vaore ad Arduino sul pin definito alle linee 18-20, i valori passati saranno tradotti in segnali PWM dai pin di […]

  3. Mauro Alfieri » Blog Archive » Tutorial: arduino, led rgb e potenziometri

    […] Se non ti è chiaro perchè utilizzo la funzione analoWrite() se ho collegato il led alle uscite digitali PWM puoi leggere questo mio articolo che ti chiarirà le idee: Programmare con Arduino – Pin Digitali e Analogici. […]

  4. WiRC: collegato ad arduino per comandare il tuo robot

    […] indica il tempo del duty-cycle, se non sai cos’è ti invito a leggere questo mio articolo: Programmare con Arduino – Pin Digitali e Analogici in cui trovi una semplice spiegazione di come funziona e a cosa […]

  5. Frequenza PWM su Arduino Duty Cycle Mauro Alfieri Elettronica Robotica

    […] Ti invito a leggere l’introduzione sul’argomento in questo articolo. […]

  6. Programmare con Arduino - leggere un segnale analogico - Mauro Alfieri Elettronica Domotica Robotica Elettronica

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Puoi usare i seguenti tag ed attributi HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>