Arduino - Funzioni I / O

I pin sulla scheda Arduino possono essere configurati come ingressi o uscite. Spiegheremo il funzionamento dei pin in quelle modalità. È importante notare che la maggior parte dei pin analogici Arduino può essere configurata e utilizzata esattamente allo stesso modo dei pin digitali.

Pin configurati come INPUT

I pin di Arduino sono configurati per impostazione predefinita come input, quindi non è necessario dichiararli esplicitamente come input con pinMode()quando li usi come input. Si dice che i pin configurati in questo modo siano in uno stato di alta impedenza. I pin di ingresso richiedono al circuito che stanno campionando richieste estremamente ridotte, equivalenti a un resistore in serie di 100 megaohm davanti al pin.

Ciò significa che ci vuole pochissima corrente per cambiare il pin di ingresso da uno stato all'altro. Ciò rende i pin utili per attività come l'implementazione di un sensore tattile capacitivo o la lettura di un LED come un fotodiodo.

Pin configurati come pinMode (pin, INPUT) a cui non è collegato nulla, o con fili ad essi collegati che non sono collegati ad altri circuiti, segnalano cambiamenti apparentemente casuali nello stato del pin, captano rumore elettrico dall'ambiente o accoppiano capacitivamente lo stato di un pin vicino.

Resistori di pull-up

I resistori di pull-up sono spesso utili per portare un pin di ingresso a uno stato noto se non è presente alcun ingresso. Questo può essere fatto aggiungendo un resistore di pull-up (a + 5V) o un resistore di pull-down (resistore a terra) sull'ingresso. Un resistore da 10K è un buon valore per un resistore pull-up o pull-down.

Utilizzo del resistore pull-up integrato con pin configurati come ingresso

Ci sono 20.000 resistori pull-up integrati nel chip Atmega a cui è possibile accedere dal software. Si accede a questi resistori di pull-up integrati impostando ilpinMode()come INPUT_PULLUP. Questo effettivamente inverte il comportamento della modalità INPUT, dove HIGH significa che il sensore è OFF e LOW significa che il sensore è ON. Il valore di questo pull-up dipende dal microcontrollore utilizzato. Sulla maggior parte delle schede basate su AVR, il valore è garantito tra 20kΩ e 50kΩ. Su Arduino Due, è compreso tra 50kΩ e 150kΩ. Per il valore esatto, consultare la scheda tecnica del microcontrollore sulla scheda.

Quando si collega un sensore a un pin configurato con INPUT_PULLUP, l'altra estremità deve essere collegata a terra. In caso di un interruttore semplice, questo fa sì che il pin legga HIGH quando l'interruttore è aperto e LOW quando l'interruttore è premuto. Le resistenze di pull-up forniscono corrente sufficiente per illuminare un LED debolmente collegato a un pin configurato come ingresso. Se i LED in un progetto sembrano funzionare, ma in modo molto debole, è probabile che questo sia ciò che sta accadendo.

Gli stessi registri (posizioni di memoria interna del chip) che controllano se un pin è HIGH o LOW controllano le resistenze di pull-up. Di conseguenza, un pin configurato per avere resistenze di pull-up attivate quando il pin è in modalità INPUT, avrà il pin configurato come HIGH se il pin viene quindi commutato in una modalità OUTPUT con pinMode (). Funziona anche nell'altra direzione e un pin di uscita lasciato in uno stato HIGH avrà la resistenza di pull-up impostata se commutato su un ingresso con pinMode ().

Example

pinMode(3,INPUT) ; // set pin to input without using built in pull up resistor
pinMode(5,INPUT_PULLUP) ; // set pin to input using built in pull up resistor

Pin configurati come OUTPUT

Si dice che i pin configurati come OUTPUT con pinMode () siano in uno stato di bassa impedenza. Ciò significa che possono fornire una quantità sostanziale di corrente ad altri circuiti. I pin Atmega possono generare (fornire corrente positiva) o assorbire (fornire corrente negativa) fino a 40 mA (milliampere) di corrente ad altri dispositivi / circuiti. Questa è una corrente sufficiente per illuminare intensamente un LED (non dimenticare il resistore in serie) o per far funzionare molti sensori ma non abbastanza corrente per far funzionare relè, solenoidi o motori.

Il tentativo di far funzionare dispositivi ad alta corrente dai pin di uscita, può danneggiare o distruggere i transistor di uscita nel pin o danneggiare l'intero chip Atmega. Spesso, questo si traduce in un pin "morto" nel microcontrollore ma i chip rimanenti funzionano ancora adeguatamente. Per questo motivo, è una buona idea collegare i pin OUTPUT ad altri dispositivi tramite resistori da 470Ω o 1k, a meno che la massima corrente prelevata dai pin non sia richiesta per una particolare applicazione.

Funzione pinMode ()

La funzione pinMode () viene utilizzata per configurare un pin specifico in modo che si comporti sia come input che come output. È possibile abilitare le resistenze interne di pull-up con la modalità INPUT_PULLUP. Inoltre, la modalità INPUT disabilita esplicitamente i pull-up interni.

sintassi della funzione pinMode ()

Void setup () {
   pinMode (pin , mode);
}
  • pin - il numero del pin di cui si desidera impostare la modalità

  • mode - INPUT, OUTPUT o INPUT_PULLUP.

Example

int button = 5 ; // button connected to pin 5
int LED = 6; // LED connected to pin 6

void setup () {
   pinMode(button , INPUT_PULLUP); 
   // set the digital pin as input with pull-up resistor
   pinMode(button , OUTPUT); // set the digital pin as output
}

void setup () {
   If (digitalRead(button ) == LOW) // if button pressed {
      digitalWrite(LED,HIGH); // turn on led
      delay(500); // delay for 500 ms
      digitalWrite(LED,LOW); // turn off led
      delay(500); // delay for 500 ms
   }
}

Funzione digitalWrite ()

Il digitalWrite()viene utilizzata per scrivere un valore HIGH o LOW su un pin digitale. Se il pin è stato configurato come OUTPUT con pinMode () , la sua tensione sarà impostata al valore corrispondente: 5V (o 3.3V su schede 3.3V) per HIGH, 0V (ground) per LOW. Se il pin è configurato come INPUT, digitalWrite () abiliterà (HIGH) o disabiliterà (LOW) il pullup interno sul pin di ingresso. Si consiglia di impostare pinMode () su INPUT_PULLUP per abilitare la resistenza di pull-up interna.

Se non si imposta pinMode () su OUTPUT e si collega un LED a un pin, quando si chiama digitalWrite (HIGH), il LED potrebbe apparire scuro. Senza impostare esplicitamente pinMode (), digitalWrite () avrà abilitato il resistore pull-up interno, che agisce come un grande resistore limitatore di corrente.

Sintassi della funzione digitalWrite ()

Void loop() {
   digitalWrite (pin ,value);
}
  • pin - il numero del pin di cui si desidera impostare la modalità

  • value - ALTO o BASSO.

Example

int LED = 6; // LED connected to pin 6

void setup () {
   pinMode(LED, OUTPUT); // set the digital pin as output
}

void setup () { 
   digitalWrite(LED,HIGH); // turn on led
   delay(500); // delay for 500 ms
   digitalWrite(LED,LOW); // turn off led
   delay(500); // delay for 500 ms
}

funzione analogRead ()

Arduino è in grado di rilevare se c'è una tensione applicata a uno dei suoi pin e segnalarlo tramite la funzione digitalRead (). C'è una differenza tra un sensore on / off (che rileva la presenza di un oggetto) e un sensore analogico, il cui valore cambia continuamente. Per leggere questo tipo di sensore, abbiamo bisogno di un diverso tipo di pin.

Nella parte in basso a destra della scheda Arduino, vedrai sei pin contrassegnati con "Analog In". Questi pin speciali non solo dicono se c'è una tensione applicata a loro, ma anche il suo valore. Utilizzando ilanalogRead() funzione, possiamo leggere la tensione applicata a uno dei pin.

Questa funzione restituisce un numero compreso tra 0 e 1023, che rappresenta tensioni comprese tra 0 e 5 volt. Ad esempio, se è presente una tensione di 2,5 V applicata al pin numero 0, analogRead (0) restituisce 512.

Sintassi della funzione analogRead ()

analogRead(pin);
  • pin - il numero del pin di ingresso analogico da cui leggere (da 0 a 5 sulla maggior parte delle schede, da 0 a 7 su Mini e Nano, da 0 a 15 su Mega)

Example

int analogPin = 3;//potentiometer wiper (middle terminal) 
   // connected to analog pin 3 
int val = 0; // variable to store the value read

void setup() {
   Serial.begin(9600); // setup serial
} 

void loop() {
   val = analogRead(analogPin); // read the input pin
   Serial.println(val); // debug value
}