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 …

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: https://www.mauroalfieri.it/informatica/programmare-con-arduino-%e2%80%93-pin-digitali-e-analogici.html

115 pings

Skip to comment form

  1. […] 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. […] il vaore ad Arduino sul pin definito alle linee 18-20, i valori passati saranno tradotti in segnali PWM dai pin di […]

  3. […] 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. […] 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. […] Ti invito a leggere l’introduzione sul’argomento in questo articolo. […]

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

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.