Lezione 3 – Corso di Elettronica Creativa con Arduino Sensor Kit

A distanza di qualche mese riprendo le mie brevi lezioni sull’uso dell’Arduino Sensor Kit, mi dispiace non stato celere nel produrre altre lezioni, ma gli impegni lavorativi mi hanno parecchio coinvolto.

Come già avevo avuto modo di segnalare nelle precedenti lezioni, per la realizzazione di queste guide prendo come riferimento l’indice presente sul sito Arduino e su quella traccia realizzo lezioni un po’ più approfondite che mi permettono poi di strutturare una lezione di laboratorio di circa due ore di attività.

Giusto per non far “arrabbiare” nessuno — mi riferisco a chi potrebbe critica le modalità con cui vengono presentati alcuni argomenti di elettronica — ricordo che queste lezioni sono dedicate a chi non ha mai affrontato lo studio dell’elettronica (neofiti o studenti della secondaria di primo grado e studenti dei primi due anni della scuola superiore), pertanto alcuni concetti richiedono chiarimenti e inevitabili semplificazioni, che consentiranno di riprendere gli stessi argomenti con maggiore facilità quando le competenze teoriche saranno più solide.

Gli obiettivi di questa terza lezione sono:

  • comprendere come funziona un pulsante a livello elettrico e meccanico.
  • sviluppare sketch via via più complessi:
    • accensione di un LED alla pressione del pulsante;
    • Indicazione dello stato del LED sulla SerialMonitor;
    • cicli di blink avviati da pulsante;
    • cicli di blink avviati da pulsante e segnalazione del numero di cicli.

Per lo svolgimento di questa esercitazione abbiamo necessità solamente dell’Arduino Sensor Kit ed utilizzeremo:

Il pulsante:

Il LED:

Un po’ di teoria

Contatto meccanico e rimbalzo

Quando premiamo il pulsante, le lamine metalliche rimbalzano per qualche millisecondo: il segnale oscilla tra HIGH e LOW prima di stabilizzarsi. Se non lo gestiamo otteniamo letture multiple indesiderate.

Pull-up e pull-down

Nel caso in cui si utilizzano pulsanti esterni a quelli presenti sull’Arduino Sensor Kit tenere in conto quanto segue, perché sarà utile quando svilupperete in autonomia successivi circuiti senza questo kit, di seguito una breve precisazione.

Nel caso desiderate invece collegare un pulsante esterno, fate riferimento alle mie (ormai vecchie slide) di cui vi allego alcune pagine (le slide le trovate su questo sito nella sezione Arduino, oppure direttamente: Alfabeto di Arduino – lezione 2):

Perché non usare un filo diretto senza resistenza?

Se collegassi il pin direttamente a VCC e il pulsante a GND, quando premuto avreste un cortocircuito 5 V → GND, con decine di mA (o più) che potrebbero danneggiare pulsante e scheda Arduino.

Nel nostro caso però stiamo utilizzando l’Arduino Sensor Kit e la resistenza di Pull-Down è già presente sulla scheda in cui è presente il pulsante, quindi per ora non bisogna preoccuparsi di effettuare altri collegamenti.

Continuiamo tranquillamente e realizziamo i collegamenti che vedete nell’immagine che segue in cui il Led è collegato al D6 e il pulsante al D4:

Esempio 1: accendiamo e spegniamo il LED alla pressione del pulsante

1// Prof. Maffucci Michele
2// Utilizzo di un pulsante per accendere il LED
3 
4const int buttonPin = 4;      // pulsante dello Shield connesso al D4
5const int ledPin    = 6;      // led sulla scheda
6 
7void setup() {
8  pinMode(ledPin, OUTPUT);          // ledPin dichiarato come output
9  pinMode(buttonPin, INPUT);        // buttonPin dichiarato come input
10}
11 
12void loop() {
13  int stato = digitalRead(buttonPin); // Memorizza lo stato corrente sul pin 4
14  digitalWrite(ledPin, stato);        // LED acceso quando premuto
15}

Se vi state chiedendo che fine ha fatto la resistenza serie del LED e la resistenza di PULL-UP indicata nello schema precedente, da usare se desiderate usare componenti esterni, vi dico che queste sono integrate all’interno dei singoli elementi presenti sull’Arduino Sensor Kit.

Esempio 2: accendiamo e spegniamo il LED alla pressione del pulsante e segnaliamo lo stato sulla serial monitor

1// Prof. Maffucci Michele
2// Utilizzo di un pulsante per accendere il LED
3// e segnalazione sulla serialMonitor
4 
5const int buttonPin = 4;      // pulsante dello Shield connesso al D4
6const int ledPin    = 6;      // led sulla scheda
7 
8void setup() {
9  Serial.begin(9600);
10  pinMode(ledPin, OUTPUT);          // ledPin dichiarato come output
11  pinMode(buttonPin, INPUT);        // buttonPin dichiarato come input
12}
13 
14void loop() {
15  int stato = digitalRead(buttonPin); // Memorizza lo stato corrente sul pin 4
16  digitalWrite(ledPin, stato);        // LED acceso quando premuto
17  Serial.print("LED = ");             // Stampa in modo continuo LED =
18  Serial.println(stato);              // 1 LED acceso 0 LED spento
19}

Serial.begin(9600);
Inizializza la porta seriale e stabilisce la velocità di trasmissione a 9600 baud: è il “canale” con cui il microcontrollore può dialogare con il Serial Monitor (o con un altro dispositivo) inviando e ricevendo dati.

Serial.print() / Serial.println();
Spediscono sulla seriale il testo o il valore passato: Serial.print() continua sulla stessa riga, mentre Serial.println() aggiunge a fine messaggio il carattere di “a capo” (CR+LF), così ogni chiamata successiva compare su una nuova riga nel Serial Monitor.

Esercizio 3: sequenza blink (5 cicli) avviata mediante la pressione di un pulsante

All’interno dello sketch che segue utilizzeremo un’istruzione if. Riprendo quanto già spiegato nelle mie lezioni che trovate su questo sito.

L’istruzione if è composta da un blocco “condizione” che verifica se una deterniata condizione logica si verifica. Se la “condizione” risulta “Vera“, viene eseguita un blocco “istruzioni“, se la “condizione” risulta “Falsa“, non viene eseguito il blocco “istruzioni” e l’esecuzione del programma prosegue oltre l’istruzione if.

In altro modo, se la condizione di controllo, costituita ad esempio dal superamento di un valore analogico rispetto ad un valore dato, risulta vera, verrà eseguito il codice incluso tra le parentesi graffe che seguono il controllo, altrimenti se la condizione di controllo risulta falsa, non vengono eseguite le istruzioni dell’if  e l’esecuzione del programma continua con la porzione di codice che segue.

1if (someVariable ?? value)
2{
3   doSomething;
4}

(con ?? indichiamo l’operatore logico usato dalla condizione di controllo e può essere: =, =, ==, !=)

L’esempio sopra confronta la variabile someVariable con il valore contenuto in value che può essere una variabile o una costante. Se il confronto o la condizione all’interno delle parentesi tonde risulta vera, verrà eseguita la porzione di codice inclusa tra le parentesi graffe, doSomething, altrimenti se la condizione risulta falsa viene saltata la porzione tra parentesi graffe e l’esecuzione prosegue dopo l’ultima parentesi graffa.

Nota: fate attenzione che se accidentalmente usate ‘=’, ad esempio if(x=10), tecnicamente è un’operazione valida, l’operazione assegna alla variabile x il valore 10 che è un’operazione sempre vera, quindi lo sketch si comporterà diversamente da come avevamo progettato. Invece se usiamo “==” (doppio uguale) in if(x==10) viene verificato se la variabile x è uguale al numero 10.

Pensate a “=” come ad un’operazione di assegnamento e “==” come ad una operazione di confronto (“è uguale a”).

Realizziamo ora l’esercizio 3:

1// Prof. Maffucci Michele
2// Realizzare un circuito in cui l’avvio dell’esecuzione
3// della sequenza di accensione e spegnimento per 5 volte viene avviata mediante la
4// pressione di un pulsante. Una successiva pressione avvia nuovamente la sequenza.
5 
6// Inizializzazione della variabile chiave per effettuare
7// un'unica sequenza (5 volte) di accensione e spegnimento
8// del LED connesso al pin 6
9 
10int chiave = 0;
11 
12const int buttonPin = 4;      // pulsante dello Shield connesso al D4
13const int ledPin    = 6;      // led sulla scheda
14 
15void setup() {
16  pinMode(ledPin, OUTPUT);          // ledPin dichiarato come output
17  pinMode(buttonPin, INPUT);        // buttonPin dichiarato come input
18}
19 
20void loop() {
21  if (digitalRead(buttonPin) == HIGH) { //se il pulsante è premuto esegui l'azione
22    chiave = 1;                         //cambia il valore di chiave in 1
23  }
24  if (chiave == 1) {                    //se il valore di chiave è 1 esegui l'azione
25    for (int contatore = 0; contatore < 5; ++contatore) {
26      digitalWrite(ledPin, HIGH);
27      delay(1000);
28      digitalWrite(ledPin, LOW);
29      delay(1000);
30    }
31    //cambia il valore di chiave in 2 per escludere il ciclo for
32    chiave = 2;
33  }
34}

Esercizio 4: sequenza blink (5 cicli) avviata mediante la pressione di un pulsante e segnalazione sulla SerialMonitor del numero di volte (cicli) in cui viene avviata la sequenza di blink.

In questo caso utilizziamo una variabile globale chiamata “ciclo” che segnala sulla SerialMonitor il numero di cicli da 5 blink del LED.

1// Prof. Maffucci Michele
2// Realizzare un circuito in cui l’avvio dell’esecuzione
3// della sequenza di accensione e spegnimento per 5 volte viene avviata mediante la
4// pressione di un pulsante. Una successiva pressione avvia nuovamente la sequenza.
5// Segnaliamo sulla SerialMonitor il numero di volte (cicli) in cui viene avviata la sequenza di blink.
6 
7// Inizializzazione della variabile chiave per effettuare
8// un'unica sequenza (5 volte) di accensione e spegnimento
9// del LED connesso al pin 6
10 
11int chiave = 0;
12 
13const int buttonPin = 4;      // pulsante dello Shield connesso al D4
14const int ledPin    = 6;      // led sulla scheda
15 
16// variabile utilizzata per indicare il numero di cicli da 5 blink
17int ciclo = 0;
18 
19void setup() {
20  Serial.begin(9600);               // inizializzazione della SerialMonitor
21  pinMode(ledPin, OUTPUT);          // ledPin dichiarato come output
22  pinMode(buttonPin, INPUT);        // buttonPin dichiarato come input
23}
24 
25void loop() {
26  if (digitalRead(buttonPin) == HIGH) { // se il pulsante è premuto esegui l'azione
27    chiave = 1;                         // cambia il valore di chiave in 1
28    // se il pulsante è premuto inizia il ciclo ed incrementa il contatore di cicli
29    ciclo = ciclo + 1;
30  }
31  if (chiave == 1) {                    //se il valore di chiave è 1 esegui l'azione
32  Serial.print("Ciclo = ");
33  Serial.println(ciclo);
34    for (int contatore = 0; contatore<5; ++contatore) {
35      digitalWrite(ledPin, HIGH);
36      delay(1000);
37      digitalWrite(ledPin, LOW);
38      delay(1000);
39    }
40    //cambia il valore di chiave in 2 per escludere il ciclo for
41    chiave = 2;
42  }
43}

2 pensieri su “Lezione 3 – Corso di Elettronica Creativa con Arduino Sensor Kit

  1. Giuseppe

    Salve,
    nel codice compare
    contatore &amp;amp;lt; 5;
    non mi è chiara la condizione di confronto.
    Puoi gentilmente chiarirmela?
    Grazie!

    Rispondi
    1. admin Autore articolo

      Ciao Giuseppe,
      scusami è un errore del plug-in il codice che vedi rappresenta in html il carattere “<", ora ho sistemato. Fammi sapere se tutto ok. Saluti.

      Rispondi

Rispondi a Giuseppe Annulla risposta

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

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.