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:
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 !!!
- una scheda Arduino
- una breadboard
- un interruttore a pulsante ( normalemente aperto )
- una resistenza da 10K
- 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:
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.
48 commenti
2 ping
Vai al modulo dei commenti
ma perchè la resistenza di pull down dev’essere di 10 k?
Autore
Ciao,
10K è un valore abbastanza alto da garantirti di rilevare correttamente il dato sull’ingresso digitale.
Mauro
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?
Autore
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
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
Autore
Ottimo Massimo, continua così 🙂
Mauro
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.
Autore
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.
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!)
Autore
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
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!
salve, io sto usando questo (online) e mi trovo bene https://123d.circuits.io/lab.
effettua anche la simulazione
Autore
Grazie Federico,
conosco questo tool ed a volte lo utilizzo per le simulazioni in aula.
In generale preferisco sperimentare direttamente con arduino.
io al momento lo uso perchè non vorrei rovinare componenti o arduino stesso..sono un principiante 😀
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!
Autore
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
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
Autore
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
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
Autore
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
Grazie, mi e’ stato molto utile 😀
correggi il titolo del post perfavore pero’ 😉 (Programmare con Arduino – leggere un segnale DIDITALE)
Autore
Corretto grazie.
Mauro
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
Autore
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
Ciao e complimenti, una curiosità a cosa serve fare quei collegamenti sulla board (quelli alla destra cavetto rosso e nero)
Autore
Ciao Gennaro,
in questo esempio non sono importanti, puoi ometterli.
Mauro
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
Autore
Ciao Chritian,
prova ad invertire i collegamenti.
Mauro
…ah …scusa.. avevo invertito i fili terra e alimentazione!!!
Autore
Ottimo.
Mauro
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.
Autore
Ciao Gabriele,
ottima osservazione, ho solo riutilizzato un disegno di un progetto differente in cui utilizzavo anche quel collegamento.
Mauro
il programma usato per fare lo schema sopra riportato si chiama fritzing
Autore
Ciao Gabriele,
se quella posta é una domanda, la risposta é si.
Mauro
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
Autore
Grazie Domenico,
si mi era giunta come info, ma è sempre apprezzato il contributo.
Mauro
Il programma che cerchi per fare i demo solo disegnati si chiama FRITZING
http://www.fritzing.org
ciao e buon lavoro 🙂
Autore
Grazie 1000 ManyGold !
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
Autore
Ciao Francesco,
purtroppo non ho compreso cosa mi chiedi e che rapporto ci sia tra il sensore IR e questo articolo.
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
Autore
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.
Buongiorno ,praticamente quando io premo il pusante trasmetto un volore positivo sul pin 2,giusto!
Autore
Certo Nicola
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 ]]
Autore
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)
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.
Autore
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.
[…] 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 […]
[…] Programmare con Arduino – leggere un segnale diditale […]