Archivi tag: microcontrollore

Arduino – lezione 04: realizzare un programma che identifica le variazioni di stato

Prenderò spunto dal commento che mi è stato lasciato da un mio studente per introdurre l’uso delle istruzioni:

if
if...else
Switch Case

Lo scopo di questa lezione è quello di realizzare un programma che conta quante volte il pulsante viene premuto, per un ciclo di 4 pressioni, alla quinta pressione il led lampeggia una volta e poi si riavvia il ciclo.

Per questa lezione useremo:

  1. breadboard
  2. 4 diodi led
  3. 1 pulsante
  4. 1 resistenza da 10KOhm
  5. Arduino duemilanove

La prima versione del programma è quella che è stata realizzata dal mio studente, realizzazione di uno sketch per effettuare la seguente funzione:

Prima pressione: led lampeggia ogni mezzo secondo
Seconda pressione: led lampeggia ogni secondo
Terza pressione: led lampeggia ogni secondo e mezzo
Quarta pressione: led si spegne

Realizziamo un circuito come indicato nelle immagini che seguono:

La proposta interessante ed elegante dell’allievo, sfrutta l’istruzione “Switch Case” che permette di definire quale porzione di codice eseguire in funzione del valore di una variabile. Ciò consente di evitare lunghe catene di if-else.
Il “break” alla fine di ogni “case” viene usato per interrompere il controllo degli altri “case“.

// Esempio 05:
// Primo tocco: led lampeggia ogni mezzo secondo
// Secondo tocco: led lampeggia ogni secondo
// Terzo tocco: led lampeggia ogni secondo e mezzo
// Quarto tocco: led si spegne

const int  BUTTON = 2;    // pin di input a cui è collegato il pulsante
const int LED = 13;       // LED collegato al pin digitale 13

// Variabili globali (tutti interi)
int statoButton     = 0;      // stato del pulsante (inizialmente non premuto)
int lastStatoButton = 0;      // ultimo stato del pulsante (per ora non premuto)
int countButton     = 0;      // Conteggio del bottone

// Avvio dell'applicazione
void setup()
{
  pinMode(LED, OUTPUT);       // imposta il pin digitale come output
  pinMode(BUTTON, INPUT);     // imposta il pin digitale come input
}

// Avvio del loop
void loop()
{

  // Verifico se l'utente ha premuto il bottone
  if(digitalRead(BUTTON))
  {
    // Aspetto 15ms per far alzare il dito all'utente
    delay(15);
    // Cambio l'ultimo stato del bottone
    if(lastStatoButton==0) lastStatoButton=1;
    else lastStatoButton=0;
    // Aumento il count del bottone
    if(countButton<=3) countButton=countButton+1;
    else countButton=0;
  }

  // In base allo stato del bottone scelgo l'azione del led
  switch (countButton)
  {
    // Led lampeggia ogni mezzo secondo
  case 1:
    digitalWrite(LED, HIGH);  // accende il LED
    delay(500);              // aspetta un secondo
    digitalWrite(LED, LOW);   // spegne il LED
    delay(500);              // aspetta un secondo
    break;

    // Led lampeggia ogni secondo
  case 2:
    digitalWrite(LED, HIGH);  // accende il LED
    delay(1000);              // aspetta un secondo
    digitalWrite(LED, LOW);   // spegne il LED
    delay(1000);              // aspettaun secondo
    break;

    // led lampeggia ogni secondo e mezzo
  case 3:
    digitalWrite(LED, HIGH);  // accende il LED
    delay(1500);              // aspetta un secondo
    digitalWrite(LED, LOW);   // spegne il LED
    delay(1500);              // aspetta un secondo
    break;

    // Led si spegne
  case 0:
    delay(15);
    digitalWrite(LED, LOW);
    delay(5000);              // aspetta un secondo
    break;
  }
}

Il programma come si intuisce dal filmato, presenta alcuni problemi.

Rimbalzo
Il problema dei segnali spuri dovuti al rimbalzo del pulsante non consente di controllare esattamente la selezione.

Attesa
Durante l’attesa, mentre si vede lampeggiare il led, premendo il pulsante non si ha cambiamento di stato fino a quando non termina il tempo in cui lampeggia il led.

Discriminare
Difficoltà di discriminare in quale situazione ci si trova, tempi troppo brevi per percepire la differenza delle 4 condizioni.

Per risolvere i problemi sopra elencati vi propongo 6 varianti all’esempio 1, ciò mi permetterà di introdurre nuove istruzioni del linguaggio di programmazione.

Prima di fornirvi le mie soluzioni ho necessità di introdurre l’uso dell’istruzioni Serial ed utilizzare il programma “StateChangeDetection” che potete trovare in File > Examples > 2.Digitale > StateChangeDetection o direttamente on-line sul sito Arduino che trovate di seguito

Continua a leggere

Arduino Duemilanove

Cari studenti è da circa una settimana che mi è arrivata la nuova scheda Arduino Duemilanove, qualcuno di voi in questi giorni mi ha visto in laboratorio giocare con questo microcontrollore.

Per gli studenti di quarta che vogliono impostare una bella tesina per la maturità (pensateci ora!) potrebbe essere un’ottima idea utilizzare Arduino, qualcuno di voi si è fatto già avanti.

Per maggiori informazioni www.arduino.cc

In queste vacanze farò esperimenti e vi terrò aggiornati in laboratorio.

arduino2009