Sesto Esperimento: creare un pulsante con un led

by admin on 05/08/2011

 

Da questo twitt nasce il tutorial che segue, continuate ad inviare richieste, e se sono realizzabili con pochi componenti così da essere di facile comprensione per tutti, realizzerò un tutorial!!!

Una piccola introduzione… i LED sono “macchine reversibili”: infatti, se la loro giunzione viene esposta direttamente ad una forte fonte luminosa o ai raggi solari, ai terminali appare una tensione, grazie a questa caratteristica, possiamo realizzare un pulsante utilizzando un led.

Le premesse:

Se volete sapere cos’è un LED leggete l’articolo ad esso dedicato qui.

Colleghiamo Arduino tramite una porta usb al pc, avviate l’ide, se non avete ancora configurato l’ide vi rimando all’articolo specifico qui.

Perfetto adesso entriamo nel vivo del tutorial, per prima cosa elenchiamo il materiale occorrente:

1 Arduino (il mio è un 2009)
1 Led ad alta luminosità
2 led colorati (giallo e verde)
1 breadboard (di qualsiasi dimensione)
7 fili per i collegamenti

Tempo di realizzazione 5 minuti
copiamo lo sketch (il programma) nell’ide, basta selezionare tutto il programma di seguito, poi tasto destro, copia ed incolla nella pagina bianca dell’ide.
—-Inizio programma—-

 

/*
 An open-source button LED for Arduino. This project will be enhanced on a regular basis
 (cc) by Walter Esposito , http://www.arduinoproject.it
 http://creativecommons.org/license/cc-gpl
 */

#define LED_N 2 //cambio il nome del pin 2 digitale in LED-N
#define LED_P 3 //cambio il nome del pin 3 digitale in LED-P

#define Led_Green 12  //cambio il nome del pin 12 digitale in Led_Green
#define Led_Yellow 7   //cambio il nome del pin 3 digitale in Led_Yellow

void setup()
 {
  Serial.begin(9600); //settaggio velocità di scambio dati tramite seriale

  pinMode(LED_N,OUTPUT);  //inizializzazione pin 2 
  pinMode(LED_P,OUTPUT);  //inizializzazione pin 3
  pinMode(Led_Green, OUTPUT);   //inizializzazione pin 12
  pinMode(Led_Yellow, OUTPUT);    //inizializzazione pin 7 

 }

void loop()
 {

  unsigned int j; //inizializzazione variabile

  digitalWrite(LED_N,HIGH); //applica voltaggio inverso 
  digitalWrite(LED_P,LOW);  //alle giunzioni p-n

  pinMode(LED_N,INPUT);     //acquisisce il valore dal pin digitale 2
  digitalWrite(LED_N,LOW);  // spegne la resistenza di pull-up interna

  for ( j = 0; j < 30000; j++) {      // conta quanto tempo impiega il diodo a dissipare la carica accumulata
    if ( digitalRead(LED_N)==0) break;
  }

  Serial.println(j); //stampa su seriale usato per il debug

  if(j<1500) //se j è inferiore a 1500
  {
    digitalWrite(Led_Green, HIGH); // pone pin 12 ad high (accende il led)
    digitalWrite(Led_Yellow, LOW);   // pone pin 7 ad low (spegne il led)
    delay(100);                   // aspetta 1/10 di secondo
  }
  else
  {
    digitalWrite(Led_Yellow, HIGH);  // pone pin 7 ad high (accende il led)
    digitalWrite(Led_Green, LOW);  // pone pin 12 ad low (spegne il led)
    delay(100);                   // aspetta 1/10 di secondo
  }

 }

—-Fine programma—-

 

una volta copiato lo sketch clicchiamo sull’icona upload ed attendiamo il caricamento su Arduino.

upload

Ora scolleghiamo Arduino dal pc, sistemiamolo vicino alla breadboard ed iniziamo ad inserire i componenti.
Posizionare la breadboard in modo da avere i pin digitali il più vicino possibile, così si evitano di accavallare i fili.

Inserire i 3 led su un’unica linea della breadboard distanziati di 3-4 pin uno dall’altro in questo modo


Colleghiamo i fili in questo modo:

  • LED VERDE   Anodo (terminale + lungo)  ——————–-  ARDUINO uscita digitale 12
  • LED VERDE   Catodo (terminale + corto)  ———————  BREADBOARD linea alimentazione  (-)
  • LED GIALLO  Anodo (terminale + lungo)  ——————–   ARDUINO uscita digitale 7
  • LED GIALLO  Catodo (terminale + corto)  ——————–   BREADBOARD linea alimentazione  (-)
  • LED ALTA LUMINOSITA’ Anodo (lungo)  ———————  ARDUINO uscita digitale 3
  • LED ALTA LUMINOSITA’ Catodo (corto)  ———————  ARDUINO uscita digitale 2
  • BREADBOARD linea alimentazione (-)       ———————  ARDUINO GND

Di seguito una foto che illustra la disposizione dei vai componenti e i relativi collegamenti:

 

Circuito completo

Perfetto il circuito è pronto!!!!

Di seguito una serie di foto cn relativo commento spiegazione, dimenticavo, se si clicca sulla foto, la stessa si ingrandisce, poi per tornare alla visualizzazione normale basta cliccare sulla x in alto a destra della foto.

Situazione normale, luce ambientale alta

Quando si da alimentazione al circuito, si accende il led verde che ci fa capire che abbiamo una giusta condizione di luce per poter utilizzare il dispositivo, come regolare tale impostazione viene spigato nella parte relativa al codice.

Avvicinando la mano il led verde si spegne e si accende il giallo

Avvicinando un dito o una mano sul led ad alta luminosità (il trasparente) si spegne il led verde e si accende il led giallo, allontanandosi  si ritorna alla situazione iniziale, questo è il funzionamento del circuito che crea un pulsante attraverso un led, naturalmente per avere una maggiore precisione bisogna utilizzare led ad alta luminosità e a 10mm così che si possa assorbire luce anche in situazioni di scarsa illuminazione.

Per un utilizzo prolungato di tale circuito è consigliato l’uso di resistenze ,così da evitare di bruciare i led, una porta digitale di Arduino eroga al massimo 40mA a 5V  valore bel al di sopra dei 20-25 mA supportati da un led lasciato acceso per parecchio tempo, quindi bisogna assolutamente inserire delle resistenze di circa 220 Ohm.

Illustriamo il programma creato,

Definizione pin led

Le prime due righe di codice permettono di modificare il nome dei pin digitali 2 e 3 di Arduino in nomi di più immediata comprensione, in questo caso sono stati definiti LED_N e LED_P cioè con il nome specifico del componente della giunzione del led  N e P

Definizione dei led

Come le prime due righe di codice anche queste modificano il nome dei pin di Arduino, in questo caso un solo pin per ogni led visto che la loro funzionalità rimane quella di segnalare visivamente un cambio di stato

Void setup()

 

Si passa direttamente al void setup () e i vari settaggi da eseguire sono

Serial.begin() che permette di settare la velocità di trasmissione dei dati tramite seriale, 9600 è un valore intermedio tra quelli possibili, per esigenze particolari ricodo che ci sono diverse velocità impostabili, sul serial monitor del vostro eide sono segnalate le velocità supportate.

pinMode( , ) serve a settare il pin digitale di Arduino, tale funzione riceve due parametri in ingresso, il primo è il numero di pin digitale di Arduino, nel nostro caso sono nomi ad esempio LED_N, il secondo parametro serve a specificare se si tratta di un segnale in entrata o in uscita, nel nostro caso OUTPUT (uscire) cioè dal pin denominato LED_N può uscire un segnale. Questa specificazione viene fatta solo per i pin digitali, i pin analogici non vanno preventivamente impostati.

Naturalmente il discorso vale per tutte e quattro le righe di codice che portano la dicitura pinMode() sono settate, per ora, tutte in uscita.

Il setup è finito, con il prossimo pezzo di codice entriamo nel vivo del programma.

Void loop il ciclo del programma

Il Void loop() è la funzione principale del programma che contiene le operazioni che vengono ciclicamente ripetute, vediamo nel particolare cosa succede al suo interno:

unsigned int j; creiamo una variabile da usare in un ciclo, in programmazione, le variabili j,k vengono spesso usate come variabili di supporto a cicli for, la dicitura unsigned sta a significare che tale variabile non ha i valori negativi, questo stratagemma serve per utilizzare delle variabili che allocano poco spazio di memoria ma riescono a contenere cifre più alte, di regola la variabile int va da – 32768 a + 32767 usando unsigned possiamo usare numeri che vanno da 0 a 65535 cioè tutti i numeri rappresentabili con 2 byte.

Ora inizia la parte magica, queste operazioni che seguono ci permettono di utilizzare un led in “reverse mode”

digitalWrite(LED_N, HIGH) La funzione digtalWrite mi permette di scrivere su un pin digitale di arduino, gli unici valori accettati da un pin digitale sono alto o basso, 0/1 (corrispondenti a due livelli di tensione convenzionali 5V per alto e 0V per basso), quindi in questa riga di codice scriviamo un valore alto sul pin LED_N

digitalWrite(LED_P,LOW) ed impostiamo un valore basso sul pin LED_P.

Le due righe appena commentate ci permettono di invertire le giunzioni di un led, impostando una tensione sulla giunzione N e un valore basso sulla giunzione P facciamo si che la giunzione non sia più P-N ma N-P questo è un passaggio base per poter far funzionare l’intero progetto, e come se prendendo un multimetro e pongo sul catodo il + e sull’anodo il -, il valore di tensione che leggo varia in base all’illuminazione della stanza.

pinMode(LED_N,INPUT) fino ad ora il pin LED_N è stato impostato in modo da  dare un valore di 5v (alto) al led stesso, ora impostiamo il pin digitale in input così da poter leggere il valore che risulta al suo interno, in poche parole diamo prima 5v al led e poi poniamo il pin in modo da poter leggere il suo valore, che ricordiamo potrà essere alto o basso.

digitalWrite(LED_N,LOW) imposto un valore basso su LED_N in modo da spegnere le resistenza di pull-up (la resistenza di pull-up è una resistenza che fa in modo che un valore non definito sia impostato come valore alto, essa serve per stabilizzare il segnale che viene letto, noi la dobbiamo spegnere così da poter leggere in quanto tempo il led si “scarica” ed avere una lettura precisa di tale valore)

for ( j = 0; j < 30000; j++){ } questa riga di codice è l’inizio di un ciclo chiamato ciclo for essa è praticamente presente in tutti i linguaggi di programmazione procedurali, e serve ad eseguire una serie di istruzioni per un numero definito di volte, analiziamolo in dettaglio, per prima cosa impostiamo la nostra variabile a 0, quindi j=0 in modo da non avere numeri di letture sbagliate, poi impostiamo la condizione, cioè quante volte devono essere ripetute le operazioni al suo interno, in questo caso partendo da 0 fino a quando j non è minore di 30000 quindi da 0 a 29999 cioè 30000 volte, per ultimo l’operazione j++ serve per incrementare il valore di j questa dicitura è una forma ridotta della seguente operazione j=j+1, per esempio la prima volta che si entra nel ciclo for la j vale 0, la seconda volta grazie a questa operazione la j vale 1 e così via fino al valore impostato nella condizione, per completezza, nella condizione del ciclo for può essere inserita anche una variabile al posto di un valore fisso, nel caso che tale valore sia un risultato di un’operazione precedente.

Tormando al programma, tale operazione ci permette di leggere dopo quante volte ceh viene eseguito il ciclo la carica accumulata sul led si “scarica”, il valore risultante che viene salvato su j ci da un’idea della quantità di luce che il led riscontra nell’ambiente, se tale valore è basso, la luce presente è forte, quindi tale valore è inversamente proporzionale alla luce riscontrata, di seguito illustro la riga di codice interna a tale ciclo, a sua volta un ciclo un if

if ( digitalRead(LED_N)==0) break; questo ciclo controlla che la sua condizione, in questo caso ( digitalRead(LED_N)==0) è vera, cioè controlla se il valore contenuto nel pin LED_N è 0, basso, oramai scarico, una volta che tale condizione è vera viene eseguita l’operazione contenuta in tale ciclo, nel nostro caso una singola istruzione break; tale parola ci permette di interrompere le letture ed uscire dal ciclo for precedente.

Serial.println(j); tale riga di codice stampa tramite la funzione serial.println() il valore di j sulla porta seriale seguito da un invio, essa è una operazione solo di debugging (controllo, verifica) per determinare i valori da impostare che variano da led a led, una volta messo a puntino il codice può essere tranquillamente eliminata.

if(j<1500) {} il ciclo if controlla se il valore di j è inferiore a 1500, se la condizione è verificata si entra in tale ciclo e tramite questa operazione  digitalWrite(Led_Green, HIGH); si pone alto il pin Led_Green, cioè si accende il led verde e si spegne con questa digitalWrite(Led_Yellow, LOW); il led giallo, naturalmente il valore di 1500 deve essere adattato al vostro caso, se la stanza risulta poco luminosa o il led utilizzato come pulsante è piccolo, tale valore va incrementato utilizzando il serial monitor dell’ide si può scegliere un valore che permette una distinzione netta tra il valore riscontrato toccando il led e quello riscontrato non toccandolo, l’ultima operazione di tale ciclo è il classico delay(100); ma questa volta con il valore 100 relativo ad 1/10 di secondo, vi ricordo che delay è la funzione che permette di avere una pausa del numero di millisecondi tra parentesi, all’interno del ciclo.

 

else{} è un’alternativa alle istruzioni inserite all’interno del ciclo if, il ciclo if fa un controllo su una condizione, se tale condizione è vera si eseguono le istruzioni al suo interno, altrimenti, si può sia chiudere tale ciclo e continuare l’esecuzione del programma, sia inserire altre operazioni da effettuare utilizzando else, che ci permette di attribuire delle operazioni se la condizione contenuta nell’if è falsa, nel nostro caso il ramo else viene utilizzato per accendere il led giallo quando il valore riscontrato in j è maggiore di 1500 cioè quando abbiamo una intensiatà di luce ambientale bassa, quando tocchiamo il led, le operazione sono  digitalWrite(Led_Yellow, HIGH); si pone il pin digitale Led_Yellow a 1 cioè accendiamo il led giallo e tramite l’operazione che segue togliamo alimentazione al led verde digitalWrite(Led_Green, LOW);
Anche questo tutorial è giunto al termine, buon divertimento e mi racomando modificate sempre i codici e i circuiti così da  avere un controllo totale sul vostro Arduino nel più breve tempo possibile!!!

6 Responses to “Sesto Esperimento: creare un pulsante con un led”

Rispondi a karen millen Annulla risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *