Le schede Arduino compatibili sono dotate di un numero variabile di piedini che l’utente può utilizzare come ingressi o uscite digitali.
Questi piedini possono essere sia ingressi che uscite.
La costruzione corretta di un programma prevede che il programmatore dichiari (inizializzi) ogni piedino digitale che intende usare dichiarando prima dell’uso se è un ingresso o un’uscita.
Le librerie di base dell’IDE di Arduino in questo sono tolleranti e così abbiamo che, quando scriviamo nel nostro codice
xx = digitalRead(pp);
la traduzione in codice macchina effettuata in fase di compilazione non tiene conto del settaggio del piedino come ingresso e si limita a rilevarne lo stato mentre, quando scriviamo nel nostro codice
digitalWrite(pp, SSSS);
la traduzione in codice macchina effettuata in fase di compilazione può realizzare varie combinazioni che sono funzione del settaggio ad INPUT o ad OUTPUT del piedino e del livello indicato da SSSS. In questo caso, il nostro piedino potrà essere “visto” dal circuito collegato al nostro controllore come un’uscita (linea a bassa impedenza), come una linea ad impedenza compresa fra i 20 e i 50 kOhm (pin INPUT e PULLUP attivo su processore AVR ATMega) o come una linea ad alta impedenza (INPUT senza PULLUP)
Per cui, se scriviamo il seguente codice:
int XX;
int YY;
void setup()
{
}
void loop()
{
XX = digitalRead(2);
YY = digitalRead(3);
digitalWrite(10,XX);
digitalWrite(11,YY);
delay(500);
}
Ciò che otterremo sarà:
Il risultato apparentemente corretto fornito dal codice è funzione delle caratteristiche del circuito più che del corretto funzionamento del programma.
Questo non aiuta di certo il nostro percorso formativo che dovrebbe abituarci a dichiarare correttamente le modalità di funzionamento dei singoli piedini digitali prima di utilizzarli ma, quando la sorte ci è favorevole, ci aiuta facendo “funzionare” (??) i nostri programmi nonostante i nostri errori (di forma).
Per inciso, il codice corretto sarebbe stato
int XX;
int YY;
void setup()
{
PinMode(2, INPUT);
PinMode(3, INPUT);
PinMode(10, OTPUT);
PinMode(11, OTPUT);
}
void loop()
{
XX = digitalRead(2);
YY = digitalRead(3);
digitalWrite(10,XX);
digitalWrite(11,YY);
delay(500);
}
In merito al comportamento dell’IDE di Arduino ricordatevi che va a discapito della nostra crescita e del supporto (effettivo) allo sviluppo del nostro codice.
Per concludere:
Ricordatevi di dichiarare (nella Setup() o comunque nel codice) per ogni piedino di I/O digitale che intendete usare, la modalità di funzionamento. Questo si fa con l’istruzione
PinMode(pp, MMMM);
dove
pp è il numero corrispondente al piedino
(attenzione che in alcune schede con processore diverso dagli AVR segue
una numerazione diversa. Troverete le indicazioni per la corrispondenza
nella documentazione della scheda)
MMMM è uno dei seguenti valori INPUT INPUT_PULLUP OUTPUT
Va comunque ricordato che, nel momento in cui dovessimo lavorare con un ambiente di sviluppo (IDE) diverso da Arduino o, nel momento in cui l’IDE di Arduino e il suo compilatore dovesse diventare più rigoroso, se le cose sui GPIO (piedini di I/O digitale) non vanno come vogliamo, è il caso di iniziare con il dare un’occhiata alle dichiarazioni di inizializzazione del microcontrollore.
Approfondimenti:
INPUT_PULLUP
I registri di configurazione dei GPIO del ATMega328
Lascia un commento