Programmare con Arduino – leggere un segnale digitale

Continuo la mia serie di articoli sulle basi della programmazione con Arduino prendendo spunto da questo articolo direttamente presente sul sito Arduino, che cosa aggiungo la mia personale spiegazione passo passo del codice e qualche consiglio …

Innanzitutto ecco lo schema dei collegamenti:

Arduino Button example
Arduino Button example

non ho ancora capito con quale programma il team di arduino faccia questi schemi ma sono davvero chiari e ben fatti, ottimo lavoro come al solito.
Tornando allo scopo dell’articolo introduciamo una cosa simpatica: la lista della spesa !!!

  1. una scheda Arduino
  2. una breadboard
  3. un interruttore a pulsante ( normalemente aperto )
  4. una resistenza da 10K
  5. degli spezzoni di filo da utilizzare per i collegamenti

Per assemblare l’esperimento possiamo seguire il disegno, avendo cura di connettere la resistenza da 10K come resistenza di pull-down ( pressione del bottone ) ossia la resistenza ha lo scopo di non far andare in corto circuito Arduino quando premiamo il pulsante.

L’altro contatto del bottone lo abbiamo colegato al pin 2 di Arduino che andremo a leggere con il nostro sketch.
Il pin 2 non è stato scelto a caso, non siamo partiti dal pin 0 o 1 in quanto questi 2 pin sono riservat da Arduino rispettivamente come Rx e Tx seriali.

Lo sketch che utilizzeremo è molto semplice, ma il mio scopo è chiarire concetti semplici per poi unirli in un progetto più complesso, se impari i rudimenti e le cose semplici sarà più immediata l’applicazione a realizzazioni complesse:

/*
 DigitalReadSerial
 Reads a digital input on pin 2,
 prints the result to the serial monitor

 This example code is in the public domain.
 */

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT);
}

void loop() {
  int sensorValue = digitalRead(2);
  Serial.println(sensorValue, DEC);
}

Lo sketch presentato inizia con il consueto commento multilinea in cui è possibile distinguere lo scopo del programma e la possibilità di utilizzarlo liberamente.
linee 1-7: commentoo multilinea
linea 9: dichiaro la funzione setup(), come hai già visto in altri sketch è fondamentale per Arduino, serve a settare tutti i valori di partenza, una vera e propria inizializzazione del programma

linea 10: utilizzando il comnado begin( 9600 ) dell’oggetto Serial comunico ad Arduino che voglio utilizzare il suo canale di comunicazione seriale, potrò scrivere informazioni sul monitor del computer o leggere degli input attraverso questo canale, ma queste operazioni le vedremo al tempo dovuto, per adesso l’importante è che tu sappia che Serial.begin(9600) apre un canale di comunicazione seriale a 9600 boud tra Arduino ed il computer

linea 11: ritrovi il comando più gettonato pinMode(2,INPUT) che imposta il pin 2 come INPUT, ossia abilita la ricezione di informazioni provenieti da questo pin, essendo il pin 2 un pin di tipo digitale i seganli che dovrai aspettarti di ricevere sono di tipo digitale ( 0 e 1 )

linea 14: dichiaro la funzione loop(), che questa una vecchia conoscenza, vedi tutorial precedenti

linea 15: in questa linea trovi più concetti raggruppati, in programmazione questo genere di sintassi si traduce come compressione del codice o ottimizzazione del codice, si utilizza per ridurre le liee di codice accorpando più comandi su di una sola linea; potrei scrivere la sola linea 15 come le seguenti linee:
int sensorValue;   // inizializzo una variabile non ancora dichiarata sensorValue in cui memorizzerò il valore letto dal pin 2
sensorValue = digitalRead(2); // con il comando digitalRead(2) leggo il valore del pin 2 ad ogni ciclo del loop() e assegno tale valore alla variabile sensorValue dichiarata sopra. Anche scritta nella forma monolinea il significato non cambia, ho solo risparmiato spazio e ottimizzato il codice

linea 16: il valore che ho raccolto deve servirmi a qualcosa, ad esempio scrivendo tale valore sulla seriale di comunicazione con il computer; per farlo riprendo il mio oggetto Serial e ne utilizzo il metodo println(sensorValue, DEC) in particolare il comando println (print line) scrive il valore contenuto nella variabile sensorValue sul monitor seriale di Arduino andando a capo ad ogni scrittura, ho aggiunto che un seondo parametro DEC che consente al println di convertire il valore letto in formato DECIMALE comprensibile.

Trasferiemo il nostro Sketch sulla scheda e aprimo il monitor seriale:  serial monitor

In condizione normale, pulsante non premuto, vedremo scorrere sul monitor serale una sequenza di 0, alla pressione del pulsante vedremo il valore printato variare da 0 a 1, rilasciando il pulsante il valore varia da 1 a 0.

Ora può sembrare inutile questo esempio tuttavia hai iniziato a prendere confidenza con il monitor seriale, utilissimo per il debug dei tuoi sketch e con la lettura di un valore digitale, ad esempio un finecorsa di un motore stepper (passo-passo) o un interruttore a leva inserito difronte ad un robot che la contatto con un oggetto inverte la marcia e tantissimi altri utlizzi.

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-digitale.html

48 commenti

2 ping

Vai al modulo dei commenti

    • nicola il 25 Marzo 2012 alle 22:39
    • Rispondi

    ma perchè la resistenza di pull down dev’essere di 10 k?

    1. Ciao,
      10K è un valore abbastanza alto da garantirti di rilevare correttamente il dato sull’ingresso digitale.

      Mauro

        • Massimo il 2 Luglio 2013 alle 08:52
        • Rispondi

        Buongiorno, scusate il mio alto grado di ignoranza in materia.
        Vorrei capire meglio il fatto della resistenza elettrica. Che succede se non la metto?
        Nell’articolo vien scritto che va in corto circuito, ma di quale voltaggio ed amperaggio stiamo usando?
        Che succede se metto una resistenza superiore? Con che criterio si mette?
        Dove trovo i dati tecnici dell’arduino? E se avessi alimentato con una sorgente superiore? Ci sono limiti? La risolvo sempre e comunque con un’adeguata resistenza?

        1. Ciao Massimo,
          tante domande presuppongono che sei davvero motivato ad imparare e questo mi fa piacere.
          Trovi le informazioni su arduino e sulle tensioni, correnti ecc… sul sito ufficiale arduino.cc

          Per la resistenza siccome parliamo di 5v e 40mA massimi puoi mettere una 220ohm o 330ohm o 1Kohm o superiore.
          Se non metti una resistenza quando premi il pulsante metti in corto il terminale positivo con il negativo.

          Mauro

            • Massimo il 22 Ottobre 2013 alle 15:04

            Ho iniziato da ieri a seguire questo interessantissimo corso. Non ho alcuna esperienza di programmazione e spero – tempo permettendo – di acquisirne almeno le basi per poter anch’io realizzare qualcosa delle tante che mi gironzolano per la mente. Per quanto riguarda la domanda del mio omonimo, penso che la risposta più appropriata sia che la resistenza collegata a GND polarizzi il pin 2 a GND; senza questa e con il pulsante aperto il pin 2 “flotterebbe” e quindi sarebbe instabile ed i risultati incerti. Mentre premendo il pulsante il pin 2, lo stesso viene collegato direttamente a positivo. Quindi, per riassumere, non mettendo la resistenza e premendo il pulsante non si mette in corto l’alimentazione ma si leggerà 1 e quando si rilascia il pulsante la lettura diventerà instabile, non avendo collegamenti con il negativo, e potrà leggersi 0 o 1 in alternanza, discontinui o casuali.
            Massimo

          1. Ottimo Massimo, continua così 🙂

            Mauro

            • Maurizio il 13 Maggio 2017 alle 13:01

            Ciao, purtroppo per me sono un po ignorante in materia ma appassionato di elettronica e meccanica in generale, vorrei chiederti se e come posso realizzare il mio progetto con Arduino, ho bisogno di muovere un motore 12v da 250 w tramite due potenziometri accoppiati insieme, uno deve dire al motore quando andare giù e l’altro quando andare su, quindi devo lavorare con un asse con due comandi , una negativo ed uno positivo. I due potenziometri verranno azionati tramita la corsa di due fili e dovrebbero dire al motore, in virtù della posizione raggiunta dal potenziometro, dove fermarsi….in poche parole devo collegare una leva ad un motore che deve andare su e giù di pochi centimetri e si deve fermare al punto morto del potenziometro e muoversi seguenti l’incremento del potenziometro fino al limite impostato, in tutto la rotazione negativa e positiva non deve superare i 40 gradi.

          2. Ciao Maurizio,
            io ti consiglierei di usare un servomotore. Qualora tu non possa sostituire il tuo motore dovrai applicare le tecniche di controllo di un servo con feedback al tuo motore.
            On line, su google, dovresti trovare come funziona un servo motore e riprodurre il tutto nel tuo progetto.
            Considera anche che se i dati del motore sono corretti ( 250W 12v = 20Ah ) non sarà facile trovare un driver adeguato.

    • Matteo il 12 Aprile 2012 alle 21:09
    • Rispondi

    Ciao Mauro, il software utilizzato per fare questi schemi è Fritzing (http://fritzing.org/)
    Tra l’altro ho visto chè oltre a disegnare è possibile far realizzare la board vera e propria, mono o multistrato! (non ho approfondito sui costi!)

    1. Ciao Matteo,
      si il programma è proprio quello che indichi.
      Per fare gli schemi che posto nei miei articoli è valido, non so come se la cavi con dei PCB.

      Mauro

      1. Ciao Mauro, continuo a leggere con crescente interesse i tuoi articoli e sono capitato anche qui … il post e’ gia’ ‘vecchiotto’ ma volevo comunque dire la mia su Fritzing. Sono un newbie assoluto in elettronica ma me la cavo piuttosto bene con grafica e DIY artigianale manuale. Un paio di anni mi lanciai nel tentativo di realizzare una PCB e capitai sul sito di Fritzing, beh da allora ne ho realizzate una decina, completamente casalinghe (toner transfer con ferro da stiro e bagno in cloruro ferrico) e devo dire che Fritzing ha fatto una buona parte … e’ estremamente facile nell’uso e si apprende velocemente, si stampa in vettoriale la maschera per l’etching e dopo qualche tentativo-fallimento si riesce a stabilire la procedura corretta per produrre PCB a mio avviso degne di molti progetti anche impegnativi. Sul mio piccolo sito trovate le realizzazioni che sono riuscito ad ottenere anche e soprattutto grazie a Fritzing.
        Un saluto a tutti i lettori di questo bel blog!

      • Federico il 11 Settembre 2015 alle 15:47
      • Rispondi

      salve, io sto usando questo (online) e mi trovo bene https://123d.circuits.io/lab.
      effettua anche la simulazione

      1. Grazie Federico,
        conosco questo tool ed a volte lo utilizzo per le simulazioni in aula.
        In generale preferisco sperimentare direttamente con arduino.

          • Federico il 14 Settembre 2015 alle 14:26
          • Rispondi

          io al momento lo uso perchè non vorrei rovinare componenti o arduino stesso..sono un principiante 😀

    • Albano il 3 Dicembre 2012 alle 22:44
    • Rispondi

    Prima di tutto complimenti per l’iniziativa.
    Scusa la mia ignoranza ma la resistenza deve essere collegata solo tra la massa ed il pulsante o può essere collegata anche tra polo+ e pulsante.
    C’è una regola?(sono nuovo in queste cose ma desideroso ad imparare)
    Grazie!

    1. Ciao Albano,
      la resistenza collegata a massa (polo negativo) evita che il segnale sul pin arduino sia flottante, ossia passi da LOW ad HIGH continuamente senza la pressione del pulsante, rendendoti impossibile rilevarne il valore.

      Puoi collegarli anche al + e l’altro polo al – ma devi anche cambiare il pin di arduino e il codice che rileva la pressione del pulsante.

      Mauro

    • roberto il 10 Febbraio 2013 alle 18:58
    • Rispondi

    salve,
    ho una domanda da porle: dallo schema elettrico si evince che il pulsante è collegato in serie tra l’alimentazione 5v, la resistenza e la massa. la mia domanda è la seguente: perchè il pin2 non è collegato al circuito in serie? dipende dal tipo di pulsante?

    roberto

    1. Ciao Roberto,
      il pulsante è collegato al pin del pulsante essendo un pulsante in cui i terminali sono connessi tra loro a 2 a 2, se colleghi il pin 2 da un lato o dall’atro del pulsante rispetto alla verticale non cambia nulla.

      Mauro

        • roberto il 11 Febbraio 2013 alle 14:08
        • Rispondi

        mi scusi se insito, ho posto male la domanda. non capisco come fa il pin 2 a leggere un segnale e,allo stesso tempo, come interagisce la resistenza all’interno del circuito. non riesco a capire la circuitazione della corrente

        grazie,
        Roberto

        1. Ciao Roberto,
          il pin 2 legge solo il segnale, quando il pulsante non è premuto la tensione circola attraverso la resistenza dal negativo del circuito ( Gnd ) al pin 2 segnalando un valore LOW, alla pressione del pulsante al pin 2 arriva direttamente la connessione con il positivo ( +5v ) portando l’ingresso sul pin 2 a HIGH.

          Mauro

    • Gabriele il 19 Febbraio 2013 alle 16:29
    • Rispondi

    Grazie, mi e’ stato molto utile 😀

    correggi il titolo del post perfavore pero’ 😉 (Programmare con Arduino – leggere un segnale DIDITALE)

    1. Corretto grazie.

      Mauro

    • Antonio il 22 Marzo 2013 alle 17:55
    • Rispondi

    non ho ancora capito con quale programma il team di arduino faccia questi schemi ……….

    il software in questione è un simulatore il: Fritzing, scaricabile al sito: http://fritzing.org/

    guarda questo video: http://www.youtube.com/watch?feature=player_embedded&v=Hxhd4HKrWpg

    Fritzing is an open-source hardware initiative to support designers, artists, researchers and hobbyists to work creatively with interactive electronics.

    credo sia indispensabile per chi usa arduino.

    spero di essere stato utile e di riuscire a seguire le tue lezioni (tienimi aggiornato via email). Ciao

    1. Ciao Antonio,
      grazie 1000, da un po uso anche io Fritzing e lo trovo incredibile.
      Iscriviti alla Newsletter per ricevere aggiornamenti sugli articoli e sui corsi che tengo su Arduino.

      Mauro

    • Gennaro il 24 Luglio 2013 alle 12:53
    • Rispondi

    Ciao e complimenti, una curiosità a cosa serve fare quei collegamenti sulla board (quelli alla destra cavetto rosso e nero)

    1. Ciao Gennaro,
      in questo esempio non sono importanti, puoi ometterli.

      Mauro

    • Christian il 4 Agosto 2013 alle 14:36
    • Rispondi

    Ciao,

    Grazie per queste lezioni davvero utili!
    Una domanda: perchè io ottengo i risultati opposti? Cioè 1 a pulsante non premuto e 0 quando lo premo?

    Christian

    1. Ciao Chritian,
      prova ad invertire i collegamenti.

      Mauro

    • Christian il 4 Agosto 2013 alle 14:41
    • Rispondi

    …ah …scusa.. avevo invertito i fili terra e alimentazione!!!

    1. Ottimo.

      Mauro

    • Gabriele il 7 Ottobre 2013 alle 01:08
    • Rispondi

    Ciao e complimenti. Sono nuovo e incapace quindi mi scuso da subito. Il mio quesito é questo: come mai nello schema dei collegamenti è previsto anche il collegamento tra le 2 colonne principali della breadboard anche se la seconda colonna non viene utilizzata? Mi riferisco al collegamento in fondo a destra nell’immagine dello schema.
    Grazie in anticipo.

    1. Ciao Gabriele,
      ottima osservazione, ho solo riutilizzato un disegno di un progetto differente in cui utilizzavo anche quel collegamento.

      Mauro

    • gabriele il 29 Ottobre 2013 alle 19:02
    • Rispondi

    il programma usato per fare lo schema sopra riportato si chiama fritzing

    1. Ciao Gabriele,
      se quella posta é una domanda, la risposta é si.

      Mauro

    • Domenico il 20 Novembre 2013 alle 17:35
    • Rispondi

    Ciao Mauro,
    il programma che usano per disegnare gli schemi si chiama fritzing,
    me lo sto scaricando anche io da qui :http://fritzing.org/download/
    ma sono sicuro che già lo sapevi. un grazie per il tuo aiuto.
    Domenico

    1. Grazie Domenico,
      si mi era giunta come info, ma è sempre apprezzato il contributo.

      Mauro

    • ManyGold il 8 Gennaio 2014 alle 03:12
    • Rispondi

    Il programma che cerchi per fare i demo solo disegnati si chiama FRITZING

    http://www.fritzing.org

    ciao e buon lavoro 🙂

    1. Grazie 1000 ManyGold !

    • francesco il 20 Giugno 2014 alle 12:29
    • Rispondi

    Ciao mauro, ti chiedo che cosa cambia nello script se inserisco un sensore IR. C’è qualche modo per non considerare le librerie del sensore?grazie della disponibilità.saluti

    1. Ciao Francesco,
      purtroppo non ho compreso cosa mi chiedi e che rapporto ci sia tra il sensore IR e questo articolo.

    • Antonio il 11 Dicembre 2014 alle 20:51
    • Rispondi

    Ciao Mauro ho una cosa da chiederti se mi puoi rispondere

    ho provato a pilotare un led leggendo un ingresso e mi succede questo quando comando il led a off mi rimane una tensione residua da Arduino ed il led resta accesso anche se in maniera lieve
    come posso fare ?

    volevo pilotare un uscita con cambiamento di stato di un input praticamente un semplice on/off

    grazie

    1. Ciao Antonio,
      il led lo hai interposto ad una resistenza?
      Controlla con il tester che il valore di tensione sul pin sia a 0 quando invii LOW.

    • NICOLA il 8 Ottobre 2016 alle 14:07
    • Rispondi

    Buongiorno ,praticamente quando io premo il pusante trasmetto un volore positivo sul pin 2,giusto!

    1. Certo Nicola

    • Pino il 10 Marzo 2020 alle 23:13
    • Rispondi

    Ciao, avrei bisogno del tuo aiuto se puoi. Ho comprato da poco il NANO 33 IOT per realizzare un azionamento di un registro su un organo a canne. Ne so veramente poco di Arduino, e ho difficoltò a trovare info più dettagliate sul suo uso ( ovviamente non riesco a leggere tutto quello che c’è in rete perchè faccio prima a morire di vecchiaia ). Ho anche comprato in kit Elegoo che fornisce una manciata di componenti ed una scheda di alimentazione da inserire sulla bredboard. Ovviamente ho dovuto imparare a scrivere il programma ( grazie alle tue dispense ) e dopo vari tentativi ho trovato i driver per il Nano ( il Seven non lo vede e non ha i driver ) . Ti spiego cosa dovrebbe fare il Nano : deve accorgersi se l’interruttore è chiuso e quindi azionare un relè a 12 volt che farà girare in un senso ( ma solo per 900 ms pena la bruciatura ) un motorino a 12 volt che sposterà una stecca di legno. Dopo un tempo che può variare da 30 s a 2 o 3 minuti, l’interruttore sarà riaperto e Nano deve azionare un secondo relè che invertirà il senso di rotazione del motore solo per 900 ms. Le domande sono diverse :
    posso usare il pin A0 per input dell’interruttore ?
    Come devo settarlo digitale o analogico ?
    Visto che non si può dargli il positivo diretto, ho pensato di mettere una R da 1000 ohm sul positivo e una R da 220 ohm verso massa, in maniera da avere normalmente quasi 1 volt in Ao ad interruttore aperto e, quando è chiuso verso il positivo ( cortocircuita quindi la R da 1000 ohm ) , avrei 5 volt su A0. Mi sembra di aver letto che le soglie sono appunto Low se inferiore a 1,5 volt e High se superiore a 3,5 volt quindi come dimensionamento dovremmo esserci.
    Il Nano può essere alimentato a 5 volt ? Tramite il pin Vin ?? Chiedo questo perchè la basetta di Elegoo ha doppia possibilità ( 5 volt o 3,3 volt ) ma non mi è chiaro come devo settarla per il Nano perchè leggo dappertutto che funziona solo a 3,3 volt. Ho letto i tuoi appunti , ma non sono sicuro di aver capito.
    Adesso devo capire come posso mandarti lo schema elettrico e lo sketch.
    ti metto comunque il programma. Se puoi verificare il corretto funzionamento, grazie

    [[ codice rimosso in automatico ]]

    1. Ciao Pino,
      il codice è stato rimosso in automatico come da regolamento, che ti invito a leggere.
      In merito alle tue domande:

      posso usare il pin A0 per input dell’interruttore ? Si puoi usarlo se non hai proprio nessun pin digitale a disposizione.
      Come devo settarlo digitale o analogico ? Puoi settarlo in analogico, leggerlo in analogico e verificare i valori con il monitor seriale.
      Il Nano può essere alimentato a 5 volt ? L’arduino nano ufficiale si, quello clonato non saprei, non lo possiedo e conosco, dovresti chiedere al produttore la scheda tecnica.

      Se fossi interessato ad un progetto su commissione trovi le regole di ingaggio nella pagina “sostienimi” (https://www.mauroalfieri.it/sostienimi.html)

    • Pino il 15 Marzo 2020 alle 01:52
    • Rispondi

    Grazie della risposta Mauro. Non so cosa vuoi dire con “progetto su commissione”. Non sono un professionista ma un hobbista. Imparare ad usare arduino è un modo come un altro per tenere allenata la memoria visto che tra qualche mese andrò in pensione, e devo avere qualcosa che mi impegni il tempo. A parte questo, che differenza c’è tra le due tipologie di pin A0-A7 e D1-D13 ? Qual’è quindi il più indicato per leggere un interruttore ? Dal punto di vista elettrico ( corrente, tensione ) cosa cambia ? Gli assorbimenti ? Il pilotaggio di circuiti esterni ( transistor ,relè, ) può essere affidato indifferentemente ad un A e ad un D ? In definitiva, se voglio leggere un interruttore e comandare un transistor che a sua volta comanda un relè, quali pin conviene usare ? Ti dico questo perchè ho fatto tentativi diversi ma non da segni di vita. Il programma dopo la verifica mi dice che non ci sono errori, ma azionando l’interruttore sul pin A1 non abilita l’uscita D12 e nemmeno la D11. Il tutto verificato col tester.(direttamente sul pin ) . Ho comprato il modulo (veramente ne ho presi 3 ) sul sito di Arduino e si comportano nello stesso modo. Se provo a premere il reset, mi abilita il pin 12 per il tempo da me programmato 5 s e poi si spegne. Hai qualche idea del perchè faccia cosi ? Ho fatto vedere il listato ad un mio collega programmatore in C++ e il programma è ok. Non so come procedere per trovare l’inghippo. Se è possibile, ti chiedo aiuto. Grazie.

    1. Ciao Pino,
      è sempre bello poter imparare e scoprire cose nuove e questa tua passione è certamente da coltivare.
      Ti consiglio di iniziare dal mio corso base arduino gratuito on-line o dalla versione in pillole video fatta con tinkercad (https://www.mauroalfieri.it/corso-arduino-gratuito-con-tinkercad.html) un passo alla volta saprai rispondere da solo alle domande che mi poni.

      In merito al pulsante è bene iniziare con i pin digitali, sono più semplici da controllare e verificare eventuali errori nei collegamenti.

  1. […] 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 […]

  2. […] Programmare con Arduino – leggere un segnale diditale […]

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.