Archivi tag: digital

Errori comuni nell’uso di Arduino – confondere pin analogici con pin digitali

Come sicuramente saprete i pin analogici di Arduino UNO, da A0 a A5 possono essere utilizzati anche in modalità digitale e questa caratteristica alcune volte crea qualche confusione in quanto i pin se vengono utilizzati in modalità analogica non è necessario dichiararne il pinMode all’interno del setup(), ciò ovviamente non accade se bisogna usarli in modalità digitale.
Dopo un po’ questa funzionalità viene memorizzata, un modo per non dimenticare questa caratteristica potrebbe essere quella di inserire una dichiarazione “inutile” che ne rammenta la modalità di utilizzo:

void setup() {
   Serial.begin(9600);
   analogRead(A2); // Sensore di luminosità
   pinMode(13, OUTPUT);
   pinMode(2, INPUT);
}

In ogni caso, per i miei studenti chiedo di ricordare a mente senza aggiungere dichiarazioni inutili, ma se si è all’inizio tale notazione può essere accettata.

Un’altra cosa che noto  confonde è l’uso della notazione Ax per i pin digitali e non del valore decimale.
In Arduino.h viene definito ad esempio A2 come una costante di tipo intero. Su Arduino UNO ad A2 è assegnato il valore numerico 16 e poiché è una costante di tipo intero possiamo trattare a tutti gli effetti A2 come se si trattasse del numero 16.

Per completezza ricordo che:

  • A0 -> 14
  • A1 -> 15
  • A2 -> 16
  • A3 -> 17
  • A4 -> 18
  • A5 -> 19

In generale sconsiglio di indicare i pin analogici con il loro valore numerico per due motivi:

  1. la notazione Ax immediatamente mette in evidenza che si tratta di pin analogico,
  2. se utilizziamo su una scheda con più pin I/O, come un Arduino Mega non andremo in confusione e non rischieremo far andare in collisione un pin digitale con un pin analogico nel caso ad esempio che stessimo mettendo mano ad uno sketch funzionante su Arduino Uno e che vogliamo far funzionare sul Mega, infatti su Arduino UNO l’A0 corrisponde al pin 14 della scheda mentre sull’Arduino Mega corrsiponde al pin 54 della scheda, se usiamo la notazione Ax non ci sbagliamo.

Ricordate inoltre che se all’interno del nostro loop() passiamo ad una digitalRead un valore da 0 a 5 non intendiamo segnalare un pin digitale da 0 a 5, ma uno dei pin da A0 ad A5.

Buon lavoro 🙂

Appunti di programmazione su Arduino: ingressi e uscite digitali

Continuano le lezioni sulla programmazione su Arduino, se avete necessità di consultare le lezioni precedenti guardate la sezione Appunti di programmazione che trovate nella sezione Arduino di questo sito.

pinMode(pin, mode)

Utilizzato all’interno del void setup(), consente di configurare un determinato pin e stabilisce se deve essere un pin di INPUT o di OUTPUT.

pinMode(pin, OUTPUT);        // imposta 'pin' come output

I pin digitali di Arduino sono per default impostati come pin di INGRESSO, perciò non è necessario dichiararli esplicitamente come input con la pinMode(). Nel caso si debba utilizzarli come pin di uscite è indispensabile impostare il pin come OUTPUT con il comando pinMode(pin, OUTPUT). I pin configurati come input si dice che sono in uno stato di alta impedenza.

Il processore Atmega presente sulla scheda Arduino è dotata, sui ogni piedino di ingresso digitale, di una resistenza di pull-up da 20KOhm che abilitata via software consente di impostare il pin come input. Le istruzioni sono le seguenti:

pinMode(pin, INPUT);       // imposta 'pin' come input
digitalWrite(pin, HIGH);   // attiva la resistenza di pull-up,
                           //'pin' viene impostato HIGH

Le resistenze di pull-up vengono normalmente utilizzate per connettere gli input come interruttori.

Si noti che nell’esempio sopra non viene configurato un pin come output, è un modo per attivare il pull-up interno.

I pin configurati come OUTPUT sono detti a bassa impedenza e sono in grado di fornire 40 mA (milliampere) ad altri dospositivi o circuiti. Questa è una corrente sufficiente per accendere un LED (non dimenticate di inserire in serie una resistenza), ma non è una corrente sufficiente per pilotare la maggior parte dei relè, bobine o motori.

I cortocircuiti sui piedini di Arduino possono danneggiare o distruggere i pin di output o danneggiare l’intero chip Atmega. Quando si ha la necessità di utilizzare i pin come output per collegare dispositivi esterni è buona prassi inserire in serie al pin un resistore da 470 Ohm o 1 KOhm.

digitalRead(pin)

Legge lo stato di uno specifico pin digitale ed il valore restituito può essere HIGH o LOW. Il ‘pin’ può essere specificato come una variabile o una costante (0-13).

value = digitalRead(Pin);   // imposta 'value' al valore
                            // letto sul pin

digitalWrite(pin, value)

Pone a livello HIGH o LOW l’uscita digitale ‘pin’. Il ‘pin’ può essere specificato come una variabile o una costante (0-13).

L’esempio che segue legge un pulsante collegato ad un ingresso digitale e visualizza su un LED, connesso ad una uscita digitale, quando il pulsante viene premuto:

int led = 13;  // il LED è connesso all'uscita digitale 13
int pin = 7;   // il pulsante è collegato al pin digitale 7
int value = 0; // variabile per memorizzare il valore letto

void setup()
{
  pinMode(led, OUTPUT); // imposta il pin 13 come OUTPUT
  pinMode(pin, INPUT);  // imposta il pin 7 come INPUT
}

void loop()
{
  value = digitaRead(pin);   // imposta 'value' uguale
                             // al valore letto su 'pin'
  digitalWrite(led, value);  // imposta 'led' al valore
                             // della variabile 'value'
}

Per le lezioni precedenti consultare la sezione Appunti di programmazione che trovate nella pagina Arduino di questo sito.