mercoledì 25 gennaio 2012

led e pulsante (Digital Input...continua)

Ora che conosciamo le resistenze di pullup possiamo implementare il nostro circuito che ci permetterà di accendere un LED utilizzando un pulsante.


Sketch

/*
 *  Ingressi digitali
*/
 
int ledPin = 12;                // Pin a cui connettere il led
int switchPin = 2;              // Pin a cui connettere il pulsante
int val;                        // variabile per leggere lo stato del pulsante


void setup() {
  pinMode(ledPin, OUTPUT);      // Imposta il pin del LED come uscita
  pinMode(switchPin, INPUT);    // Imposta il pin del pulsante come ingresso
}


void loop(){
  val = digitalRead(switchPin);   // legge l'input e lo inserisce in una variabile
  if (val == LOW) {               // se il pulsante è premuto
    digitalWrite(ledPin, HIGH);   // accende il LED
  }
  if (val == HIGH) {              // se il pulsante è premuto
    digitalWrite(ledPin, LOW);    // spegne il LED
  }
}


Schema

Schema generato con fritzing


Lo sketch appena descritto presenta un problema. I pulsanti per come sono costruiti presentano il cosidetto effetto rimbalzo , ovvero non appena premuti, nei primi millisecondi, generano del rumore che potrebbe falsare la lettura.
Per ovviare a questo problema possiamo leggere i valori in input a distanza di qualche millisecondo e verificare se sono uguali tagliando in questo modo il rumore dell'effetto rimbalzo;


void loop(){
  val = digitalRead(switchPin);      // legge il valore
  delay(10);                         // aspetta 10 millisecondi
  val2 = digitalRead(switchPin);     // rilegge il valore
  if (val == val2) {                 // se i due valori sono uguali
     if (val == LOW) {               // se il pulsante è premuto
       digitalWrite(ledPin, HIGH);   // accende il LED
     }
     if (val == HIGH) {              // se il pulsante è premuto
       digitalWrite(ledPin, LOW);    // spegne il LED
  } 
} 


Riferimenti:
http://www.ikalogic.com/debouncing.php
http://arduino.cc/it/Tutorial/Debounce



martedì 24 gennaio 2012

Resistenze di pull up

Nell'esempio precedente abbiamo cambiato lo stato di un pin di digital input collegandolo a GND piuttosto che a 5V.
Un metodo più semplice è quello di utilizzare un pulsante per variare lo stato di un pin. Prima di questo però dobbiamo introdurre un nuovo concetto: le resistenze di pullup

Resistenze di pull up

Gli ingressi dell'arduino sono ad alta impedenza ovvero richiedono (assorbono) una corrente minima per cambiarne lo stato.
Questo è molto vantaggioso e ci permette di gestire facilmente i dispositivi da collegare agli ingressi, ma presenta anche un inconveniente: essendo così sensibili gli ingressi lasciati liberi (non collegati) presentano valori casuali causati dai rumori di fondo e non un valore LOW come potremmo erroneamente pensare.



Nello schema sopra riportato con pulsante premuto avremo un valore HIGH sul pin di ingresso, mentre con circuito aperto avremo valori in ingresso oscillanti.
Per questa ragione dobbiamo far si che il nostro pin sia sempre connesso o a 5V o a 0V.
Potremmo ovviare il problema connettendo il circuito aperto a terra:




Ma in questo caso il problema nasce quando chiudiamo il circuito che causa un bel cortocircuito con conseguente danneggiamento del nostro arduino.



Per fare questo possiamo utilizzare il seguente schema:



Nello schema abbiamo introdotto una resistenza da 10K chiamata resistenza di pull up.
Fintatochè il pulsante non è premuto il pin rimane stato HIGH; la corrente che fluisce è bassa per via della resistenza, ma data l'alta impedenza degli ingressi è sufficiente a mantenere alto lo stato.
Quando premiamo il pulsante la corrente fluisce verso massa e la tensione prossima a 0V porta il pin in stato LOW. In questo caso non abbiamo corto circuito poichè la resistenza limita la corrente ( I = V/R=5V/10.000ohm= 5mA)

L'obiettivo raggiunto utilizzando una resistenza di pull up è quello di togliere le fluttuazioni al pin di input; Il compito della resistenza di pull up è i ridurre la corrente che attraversa il circuito.

Solitamente per i circuiti di pull up si utilizzano resistenze da 10K, ma se vogliamo possiamo utilizzare resistenze da 47K o superiori.

Utilizzando una resistenza di pull up avremmo uno stato HIGH con il circuito aperto (pulsante non premuto) e LOW con circuito chiuso (pulsante premuto). Questo può inizialmente creare un po' di confusione, ma è solo una convenzione.

Resistenza di pull up interna
E' possibile attivare una resistenza di pull up interna all'Atmega con l'istruzione
 
pinMode(pin, INPUT);           // set pin to input
digitalWrite(pin, HIGH);       // turn on pullup resistors
 

In questo modo viene attivata sul pin in ingresso una resistenza di pull up pari a  30K.
Rispetto alle resitenze di pullup reali quelle software hanno il limite di avere un valore fisso che in certi casi potrebbe non essere adeguato

Resistenze di pull down
In maniera analoga alle resistenze di pull up possiamo utilizzare resistenze di pull down. In questo caso il circuito aperto porterà il pin in stato LOW e il circuito chiuso in stato HIGH.








Riferimenti

http://www.seattlerobotics.org/encoder/mar97/basics.html
http://www.thebox.myzen.co.uk/Tutorial/Inputs.html
http://www.ladyada.net/learn/arduino/lesson5.html
http://arduino.cc/en/Tutorial/Button