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

venerdì 13 gennaio 2012

Digital input

Abbiamo visto nei precedenti post come utilizzare i pin digital I/O per generare un'uscita digitale.
Vediamo ora come utilizzare questi pin come ingresso. In particolare utilizzeremo un ingresso digitale per accendere un LED...nei prossimi post renderò l'esempio più interessante.

Cosa ci serve:

  • Board Arduino
  • 1 resistenza 1K
  • 1 resistenza 100 Ohm
  • 1 LED


Sketch

/*
 *  Ingressi digitali
*/
 
int ledPin = 12;                // Pin a cui connettere il led
int InPin = 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(InPin, INPUT);    // Imposta il pin del pulsante come ingresso
}


void loop(){
  val = digitalRead(InPin);   // 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
  }
}


Con pinMode(InPin, INPUT) abbiamo definiti il pin 2 come ingresso digitale e con val = digitalRead(InPin); possiamo leggerne lo stato e attribuirlo alla variabile val.
A questo punto connettendo il pin 2 a massa = LOW (pin GND) il pin 12 andrà in stato LOW e il LED si spegnerà mentre collegandolo a 5v = HIGH (pin 5v)  il pin 12 andrà in stato HIGH e il LED si accenderà.

ATTENZIONE!

Come nel caso del Digital output dobbiamo prestare attenzione a non bruciare il pin di I/O evitando sovratensioni (>5v) o correnti troppo alte.
Possiamo porre una resistenza da 100 ohm prima del pin di INPUT per evitare cortocircuiti. Se per errore definiamo un pin come output e lo colleghiamo a +5v ..... il corto brucerebbe l'ingresso!!!


giovedì 12 gennaio 2012

Arduino e LED (Digital Output...continua)

Finora abbiamo fatto lampeggiare il LED presente sulla scheda dell'arduino.
Vediamo in questo post come accendere un led utilizzando un'uscita digitale.

Cosa ci serve:
  • Arduino Board
  • 1 led
  • 1 resistenza 220ohm

Cos'è un led?
Un led è un componente che trasforma la corrente in luce. LED è l'acronimo di Light Emitting Diode; essendo un diodo permette alla corrente di transitare solo in una direzione (da + verso -) e la blocca nella direzione inversa, pertanto è necessario "orientare" il led nella direzione correta se vogliamo che si illumini.nz
La gamba più lunga del led indica il lato positivo (anodo). L'anodo è riconoscibile anche dalle dimensioni inferiori rispetto al catodo.

Perchè devo usare una resistenza?
Le uscite dell'arduino sono in grado di erogare al massimo 40mA. Per proteggere l'uscita abbassandone la corrente utilizziamo una resitenza.
Allo stesso tempo la resistenza proteggerà il dispositivo (nel nostro caso il led)

Come calcolo il valore della resistenza?
La resistenza è dimensionata in base alla quantità di corrente che vogliamo far transitare attraverso il nostro led. Maggiore è la corrente e maggiore sarà la luminosità del led
Led diversi vengono attraversati da tensioni diverse:

led rosso                                         1,7 V 
led verde                                         2,2 V

led ad alta intesità (bianchi o blu)  4,5 V

per il nostro arduino con uscite a 5V se utilizziamo un led verde (2,2V) la resistenza sarà attraversata da 2,8V. Per la legge di Ohm R=V/I avremmo che la corrente che attraversa la resistenza (e di conseguenza il led) sarà pari a 2,8V/2200ohm = 0,0014A.

Non dobbiamo esagerare con la corrente altrimenti corriamo il rischio di bruciare il led. Allo stesso tempo una resistemza troppo alta non consentira al led di illuminarsi.Generalmente un led normale (3mm o 5mm) sopporta una corrente massima di 20mA pertanto nel nostro circuito la resitenza minima dovrà essere pari a :
(5V-2,2V)/0,020mA = 160 ohm

Ricordando quanto visto in un precedente post al fine di proteggere anche il pin dell'arduino da correnti eccessive megli utilizzare resistenze >470ohm

Sketch

In maniera analoga a quello che abbiamo già visto utilizzando il led integrato sul pin 13 il codice, per far lampeggiare un led collegato al pin 2 dovremmo utilizzare il codice seguente:



void setup()
{
pinMode(2, OUTPUT);      //configuriamo il pin 2 come uscita digitale
} 
void loop()                     
  digitalWrite(2, HIGH);    // accende il led portando alta l'uscita
  delay(1000);              // un secondo di attesa
  digitalWrite(2, LOW);     // spegne il led portando bassa l'uscita
  delay(1000);              // un secondo di attesa
}

possiamo quindi compilare il codice e inviarlo all'arduino.

Circuito





Riferimenti:

http://www.thebox.myzen.co.uk/Tutorial/LEDs.html
http://www.ladyada.net/learn/arduino/LEDs.html
http://www.ladyada.net/learn/arduino/lesson3.html
http://ledcalc.com/
http://arduino.cc/en/Tutorial/DigitalPins





mercoledì 11 gennaio 2012

Digital Output

Come già detto l'Arduino DuemilaNove dispone di 14 pin che possono agire come ingressi o uscite digitali.
Per configurare un pin come ingresso/uscita utilizziamo l'istruzione PinMode nel metodo setup() utilizzando la seguente sintassi:

PinMode(numero_pin, [INPUT/OUTPUT]);

Per configurare il pin 1 come uscita scriveremo quindi

PinMode(1, OUTPUT);


In questo post mi occuperò delle uscite digitali e per fare questo mi affiderò nuovamente all'esempio Blinker fornito con l'ambinete di sviluppo.

/*
Blink
Turns on an LED on for one second, then off for one second, repeatedly.
This example code is in the public domain.

*/
void setup() {               
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
 
 pinMode(13, OUTPUT);     

} 

void loop() {

  digitalWrite(13, HIGH);   // set the LED on

  delay(1000);              // wait for a second

  digitalWrite(13, LOW);    // set the LED off

  delay(1000);              // wait for a second

}
Nello sketch viene utilizzato il PIN 13 che dispone già di un LED sulla scheda. Dopo aver inizializzato il pin come uscita nel metodo setup() possiamo portare l'uscita digitale a stato 1 (accendendo il led) o 0 (spegnendo il led) utilizzando il comando digitalWrite:

digitalWrite(numero_pin, [HIGH/LOW]);

Un'uscita può avere valore HIGH corrispondente a +5V o LOW corrispondente a 0V.

Utilizzando questo comando e l'istruzione delay(millisecondi) che introduce un ritardo definito in millisecondi all'interno del metodo loop() possiamo ottenere l'effetto desiderato.



ATTENZIONE!!!

Un uscita digitale si comporta come un generatore di tensione e cercherà di erogare una corrente pari a quella richiesta dal carico collegato. L'uscita digitale dell'Arduino però è in grad di erogare al massimo 40mA. Se si collega al pin  un apparato con un maggiore assorbimento o se si verifica un cortocircuito si rischia di rompere il transistore legato al pin e di renderlo inutilizzabile. Per questa ragione è consigliabile inserire tra l'uscita e il dispositivo una resistenza per limitare la corrente. Per esempio mettendo in serie al dispositivo una resistenza da 220 ohm avremmo una corrente pari a 5v / 220 ohm = 23 mA

martedì 10 gennaio 2012

Arduino: Struttura di uno sketch

Un programma per arduino è chiamato sketch.
Uno sketch è costituito almeno da 2 parti:
  • metodo setup()
  • metodo loop()
il metodo setup viene richiamato all'avvio della scheda o dopo un reset della stessa.
Questo metodo viene utilizzato per la dichiarazione delle variabili e per richiamare eventuali librerie

Il metodo loop viene eseguito continuamente e consente all'Arduino di essere sempre pronto a reagire a input.


Proviamo ad analizzare un vero sketch aprendo nell'editor l'esempio "Blinker" come visto nel precedente post

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.

  This example code is in the public domain.
 */


void
setup() {              
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(13, OUTPUT);    
}


void
loop() {
  digitalWrite(13, HIGH);   // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // set the LED off
  delay(1000);              // wait for a second
}


Le prime righe che incontriamo sono dei commenti che vengono ignorati dal compilatore. 
Per commentare un blocco utilizziamo i tag /*     */
Per commmentare una singola riga utilizziamo //  


Riconosciamo subito i due metodi setup() e loop().
I metodi setup e loop vengono definiti con la sintassi void setup() e void loop() e sono delimitati dalle parentesi graffe. Ciascun comando contenuto dei due metodi pricipali è terminato dal segno di ;


Dopo aver scritto/caricato il programma all'interno dell'editor possiamo verificarne la sintassi attraverso l'icona
 

Prima di compilare il programma e caricarlo nella memoria dell'Arduino utilizzando l'icona
 


Possiamo infine eseguirlo premendo il pulsante RESET sulla scheda

Vedremo in un prossimo post la sintassi dei singoli comandi.


 

lunedì 2 gennaio 2012

Welcome Arduino!!

Inizia la mia avventura con Arduino http://www.arduino.cc/, una semplice piattaforma hardware che si basa su un microcontrollore AVR della ATMEL. Il progetto è nato in Italia ed è completamente opensource pertanto è possibile trovare migliaia di progetti ed esempi sparsi per la rete.
In particolare prenderò confidenza con il modello Duemilanove che è equipaggiato con un ATmega328 dotato di 14 digital input/output pins (di cui 6 utilizzabili per inviare segnali PWM), 6 analog inputs, un oscillatore a 16 MHz , una connessione USB.
L'uso della scheda è molto semplice grazie anche alla mole di documentazione disponibile e al semplice ambiente di programmazione (pensato per non programmatori) si è subito operativi, vediamo come.

Cosa ci server per iniziare

Hardware
Acquistare o costruirsi un Arduino. In Italia lo trovate per esempio da RobotItaly  http://www.robot-italy.com/. Nel mio caso un Arduino 2009. Il costo è di una ventina di euro.

Software
Scaricare l'ultima versione dell'ambiente di programmazione dal sito http://arduino.cc/en/Main/Software


Driver
Se si dispone del sistema operativo Windows Vista o successivi l'Arduino viene riconosciuto non appena collegato alla USB altrimenti è necessario scaricare i driver che potete trovare nella'mbiente di programmazione appena scaricato o sul sito  FTDI website. in ogni caso trovate la doumentazione nella sezione Gettin Started del sito ufficiale Arduino.


Ed ora...iniziamo!

Connettere l'Arduino al computer via USB (in questo modo forniremo anche l'alimentazione necessaria alla scehda)
Lanciare l'applicazione Arduino e

  • dal menu Tool alla voce Board selezionare il modello di Arduino posseduto
  • dal menu Tool alla voce Serial Port selezionare la porta lla quale è connesso l'Arduino (se non si è certi di quale sia basta sconnettere la scheda e vedere quale porta sparisce...ecco è proprio quella)

NOTA: qualora il programma si rivelasse particolarmente lento nell'aprire il menu Tool verificare dal Pannello di Controllo di Windows che non siano presenti apparati Bluetooth non connessi ed eventualmente rimuoverli (ogniqualvolta si apre tale menu infatti il sofware riverifica tutte le porte seriali attentendo eventuali timeout di risposta)

Siamo già operativi, infatti nel microcontrollore dell'Arduino è precaricato un firmware (il bootloader) per cui possiamo subito inviare alla scheda il nostro primo programma.

A questo punto possiamo scrivere il codice nel nostro editor.......ops ma non so programmare!!! Nessun problema nel menu file troviamo una serie di esempi pronti. Proviamo per esempio a caricare il nostro primo programma inviando  l'esempio blinker alla scheda.

Dal menu File alla voce Example scegliamo Blinker. Nell'editor viene visualizzato il codice.

A questo punto non ci resta che compilare e caricare il programma sul microcontrollore premendo il pulsante con la freccia verso destra


Ecco fatto, dopo pochi secondi di caricamentto il LED presente sulla scheda comincia a lampeggiare proprio come ci aspettavamo.

Nei prossimi post cercherò di analizzare gli elementi fondamentali del programma di esempio e proseguire poi con nuove applicazioni.

Il programma rimarra sull'arduino anche se lo spegnamo; ogniqualvolta lo alimenteremo quindi il programma andrà in esecuzione e il LED inizierà a lampeggiare