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.

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/programmare-con-arduino-leggere-un-segnale-digitale.html

44 comments

2 pings

Skip to comment form

    • nicola on 25 marzo 2012 at 22:39
    • Reply

    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 on 2 luglio 2013 at 08:52
        • Reply

        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 on 22 ottobre 2013 at 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 on 13 maggio 2017 at 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 on 12 aprile 2012 at 21:09
    • Reply

    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 on 11 settembre 2015 at 15:47
      • Reply

      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 on 14 settembre 2015 at 14:26
          • Reply

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

    • Albano on 3 dicembre 2012 at 22:44
    • Reply

    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 on 10 febbraio 2013 at 18:58
    • Reply

    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 on 11 febbraio 2013 at 14:08
        • Reply

        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 on 19 febbraio 2013 at 16:29
    • Reply

    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 on 22 marzo 2013 at 17:55
    • Reply

    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 on 24 luglio 2013 at 12:53
    • Reply

    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 on 4 agosto 2013 at 14:36
    • Reply

    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 on 4 agosto 2013 at 14:41
    • Reply

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

    1. Ottimo.

      Mauro

    • Gabriele on 7 ottobre 2013 at 01:08
    • Reply

    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 on 29 ottobre 2013 at 19:02
    • Reply

    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 on 20 novembre 2013 at 17:35
    • Reply

    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 on 8 gennaio 2014 at 03:12
    • Reply

    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 on 20 giugno 2014 at 12:29
    • Reply

    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 on 11 dicembre 2014 at 20:51
    • Reply

    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 on 8 ottobre 2016 at 14:07
    • Reply

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

    1. Certo Nicola

  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

Your email address will not be published.

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