Archivi categoria: arduino

Nuova famiglia Arduino Nano

Ricevo e volentieri pubblico la rassegna stampa di Arduino.cc in cui viene presentata la nuova famiglia di Arduino Nano.

New Arduino Nano family

Small, iconic, powerful. An affordable, robust, compact and easy to program board’s family, with Arduino ‘signature’ quality.

Maker Faire Bay Area, May 17th 2019, Arduino announces the new Nano family.
Designed with makers in mind, the new Nano family offers affordable boards for everyday projects. Retaining  Arduino quality and reliability they make it easier than ever to turn your project ideas into a reality. They are  compatible with classic Arduino boards, have low energy consumption and more powerful processors.

New Nano family is composed by 4 boards:

  • Arduino Nano Every – perfect ​for everyday projects.
  • Arduino Nano 33 IoT – small, secure and IoT connected.
  • Arduino Nano 33 BLE – small, low-power, and Bluetooth connected.
  • Arduino Nano BLE Sense – small, low-power, and Bluetooth connected with a wide range of on-board sensors.

For makers who want to prototype compact projects, the Arduino Nano offer a small and powerful solution,  affordable for everyone, but with the Arduino quality our users deserve. Because every project counts.

Massimo Banzi – co-founder of Arduino – commented: ​“The new Nano’s are for those millions of makers who  love using the Arduino IDE for it’s simplicity and open source aspect, but just want a great value, small and powerful board they can trust for their compact projects. With prices from as low as $9.90 for the Nano Every,  this family fills that gap in the Arduino range, providing makers with the Arduino quality they deserve for those  everyday projects”.

A focus on new boards

Arduino Nano Every
The Arduino Nano Every is a miniature sized module based on the Microchip ATMega4809 microcontroller. The  board can be used in a breadboard when mounting pin headers, or as a SMT module directly soldered on a PCB  thanks to its castellated pads. It’s a compact workshorse, that can replace the classic Arduino Nano in all  projects where users need more capabilities. An ATSAMD11 (with Arm Cortex M0+ processor) acts as a high  performance USB to serial converter that could re-programmed by skilled users to achieve even more.

Arduino Nano 33 IoT
The Arduino Nano 33 IoT is a miniature sized module containing an Arm Cortex-M0+ processor based ATSAMD21  microcontroller, a WiFi+BT module based on Espressif ESP32, a 6-axis IMU, and a crypto chip which can securely  store certificates and pre shared keys. The board can either be used in a breadboard, or as a SMT module,  directly soldering it via the castellated pads. An ATSAMD11 Arm Cortex-M0+ processor acts as a high  performance USB to serial converter that could re-programmed by skilled users to achieve even more. The board is compatible with Arduino IoT Cloud.

Arduino Nano 33 BLE
The Arduino Nano 33 BLE is a miniature sized module containing a ublox NINA B306 module, based on Nordic  nRF52480 and containing an Arm Cortex-M4F and a 9-axis IMU. The module can either be mounted as a DIP  component, or as a SMT component, directly soldering it via the castellated pads.

Arduino Nano BLE Sense
The Arduino Nano 33 BLE Sense is a miniature sized module containing a ublox NINA B306 module, based on  Nordic nRF52480 and containing a powerful Arm Cortex-M4F and a large set of sensors. The module can either  be mounted as a DIP component, or as a SMT component, directly soldering it via the castellated pads. Built for low power consumption, Nano 33 BLE Sense is designed for environmental sensing (barometer, humidity,  temperature, light) and human interface applications thanks to the embedded microphone and proximity/gesture sensor.

The Arduino Nano family is available in pre-order. Arduino Nano Every and Arduino Nano 33 IoT are available from  mid June. Arduino Nano 33 BLE and Arduino Nano BLE Sense are available from mid July.

[press release]

Errori comuni nell’uso di Arduino – evitare lo stato flottante di un pin di Arduino

Uno degli errori tipici che riscontro durante le correzioni degli esercizi dei miei studenti alle prime esperienze nell’uso dei microcontrollori, è quello di ritenere che su un pin non collegato a nulla vi sia la presenza di uno stato logico LOW, questo non è corretto. Viene definito floating (flottante) un pin di ingresso a cui non è collegato nulla, in questa condizione sul pin potrebbe essere presente qualsiasi stato.

L’uso di un resistore collegato in modalità pull-up o pull-down costringerà il pin a uno stato noto, ma questa non è l’unica modalità.  E’ possibile fissare uno stato su un pin utilizzando un metodo, in parte già illustrato in un mio precedente post, che sfrutta l’utilizzo di un resistore di pull-up interno alla scheda. Per abilitare questa resistenza sarà sufficiente indicare all’interno del setup la funzione pinMode() con largomento “INPUT_PULLUP” oppure nella stessa maniera utilizzando le istruzioni:

pinMode(pin, INPUT);       // imposta 'pin' come input
digitalWrite(pin, HIGH);   // attiva la resistenza di pull-up,
                           //'pin' viene impostato HIGH

Per entrambe le modalità noterete che il LED è normalmente accesso, alla pressione del pulsante si spegnerà.

Circuito

 

Modalità 1

void setup() {
  pinMode(8, OUTPUT);       // Utilizzo del LED sul pin 8

  // Abilita la resistenza interna di Pull-Up
  pinMode(7, INPUT);        // Collegamento del pulsante al pin 7
  digitalWrite(7, HIGH);    // attiva la resistenza di pull-up, sul pin 7

}

void loop() {
  bool statoPulsante = digitalRead(7);   // memorizza lo stato corrente sul pin 7
  digitalWrite(8, statoPulsante);        // accende il LED se statoPulsante e 1, lo spegne se 0
}

Modalità 2

void setup() {
  pinMode(8, OUTPUT);

  // INPUT_PULLUP abilita la resistenza interna di Pull-Up
  pinMode(7, INPUT_PULLUP);       // Collegamento del pulsante al pin 7
}

void loop() {
  bool statoPulsante = digitalRead(7);  // memorizza lo stato corrente sul pin 7
  digitalWrite(8, statoPulsante);       // accende il LED se statoPulsante e 1, lo spegne se 0
}

Nel caso abbiate la necessità di invertire lo stato e fare in modo che il LED sia normalmente spento e si accenda alla pressione del pulsante sarà sufficiente applicare l’operatore NOT, indicato con il simbolo “!”  alla funzione digitalRead(7):

bool statoPulsante = !digitalRead(7);

Lo sketch completo sarà:

void setup() {
  pinMode(8, OUTPUT);

  // INPUT_PULLUP abilita la resistenza interna di Pull-Up
  pinMode(7, INPUT_PULLUP);       // Collegamento del pulsante al pin 7
}

void loop() {
  bool statoPulsante = !digitalRead(7);  // memorizza lo stato corrente sul pin 10
  digitalWrite(8, statoPulsante);        // accende il LED se statoPulsante e 1, lo spegne se 0
}

Potete trovare un ulteriore esempio di applicazione alla pagina 78 delle slide: Alfabeto di Arduino – lezione 2

Arduino – Approfondimenti sulla modulazione di larghezza di impulso (PWM)

Scrivo questo post ad integrazione della lezione: Arduino – lezione 06: modulazione di larghezza di impulso (PWM) che sto utilizzando con i miei studenti di 4′ informatica per illustrare le modulazioni di tipo digitali. L’obiettivo è quello di mostrare sull’oscilloscopio come varia il  Duty Cycle di un’onda quadra su un pin di tipo PWM di Arduino utilizzato per impostare l’intensità luminosa di un LED mediante una regolazione applicata attraverso un trimmer connesso al pin A0 di Arduino.

Oltre alla visualizzazione sull’oscilloscopio si desidera, come riscontro, la stampa sulla Serial Monitor dei seguenti valori:

  • Tensione in input sul pin A0
  • Valore restituito dalla funzione analogRead() – (tra 0 e 1023)
  • Valore restituito dall’analogWrite – (tra 0 e 254)
  • Valore percentuale del Duty Cycle  (tra 0% e 100%)

Il circuito da realizzare con l’indicazione delle connessioni all’oscilloscopio è il seguente:

Sul canale X verrà visualizzata l’onda quadra in uscita dal pin 11 il cui Duty Cycle sarà regolato agendo sul trimmer.

Sul canale Y verrà visualizzata la tensione continua in input sul pin A0, che sarà convertita dal convertitore Analogico Digitale di Arduino in un valore compreso tra 0 e 1023  (risoluzione di 10 bit). Ricordo che tale conversione sarà fatta con l’istruzione analogRead(pin).

Poiché uno degli obiettivi è quello di visualizzare la tensione rilevata sul pin A0, ricordo che tale misurazione viene fatta utilizzando la funzione analogRead(pin) che legge il valore di tensione (compreso tra 0 e 5V) applicato sul piedino analogico ‘pin’ con una risoluzione di 10 bit e la converte in un valore numerico compreso tra 0 e 1023, corrispondente quindi ad un intervallo di 1024 valori, pertanto ogni intervallo corrisponde ad un valore di tensione Vu di:

Per sapere quindi il valore di tensione rilevato (nell’intervallo tra 0V e 5V) sarà sufficiente moltiplicare la tensione unitaria Vu per il valore restituito dalla funzione analogRead(pin), valore quantizzato indicato con Vq compreso tra 0 e 1023:

Sapendo che Vu corrisponde a 4,88 mV

possiamo anche scrivere che:

Questa formula sarà inserita all’interno dello sketch.

Di seguito la schermata dell’oscilloscopio che visualizza la situazione indicata dai dati stampati sulla Serial Monitor:

  • Vmax(2) indica la tensione in ingresso ad A0 (la piccola discrepanza tra valore indicato sull’oscilloscopio e la stampa sulla Serial Monitor dipende dalle approssimazioni di calcolo).
  • Vmax(1) indica il valore di picco della tensione sul pin 11.

La spiegazione del funzionamento dello sketch sono dettagliate nei commenti:

/* Prof. Michele Maffucci
   03.06.2019

   Regolazione luminosità LED mediante
   trimmer, si utilizza la funzione map

   Stampa sulla seriale:
   - del valore di tensione sul pin A0
   - del valore restituito dall'analogRead
   - del valore restituito dall'analogWrite
   - del valore del Duty Cycle %

   Questo codice è di dominio pubblico
*/

// pin analogico su cui inviare la tensione analogica (pin A0)
int misura = 0;

// pin a cui è connesso il LED
int pinLed = 11;

// variabile in cui conservare il valore inserito su A0
long val = 0;

// variabile in cui memorizzare il Duty Cycle
int inputVal = 0;

const long VoltRiferimento = 5.0; // valore di riferimento


void setup(){
  Serial.begin(9600);      // inizializzazione della comunicazione seriale
  pinMode(pinLed, OUTPUT); // definizione di ledPin come output
}

void loop(){
  // analogRead leggerà il valore su A0 restituendo un valore tra 0 e 1023
  // per approfondimenti si consulti il link: http://wp.me/p4kwmk-1Qd
  val = analogRead(misura);

  // analogWrite() accetta come secondo parametro (PWM) valori tra 0 e 254
  // pertanto "rimappiamo" i valori letti da analogRead() nell'intervallo
  // tra 0 e 254 usando la funzione map
  // per approfondimenti si consulti il link: http://wp.me/p4kwmk-1Tu
  inputVal = map(val, 0, 1023, 0, 254);

  // accendiamo il LED con un valore del Duty Cycle pari a val
  analogWrite(pinLed,inputVal);

  // Tensione inviata sul pin analogico A0.
  // Valore in virgola mobile.

  float volt = (VoltRiferimento/1024.0)*val;

  // visualizzazione il valore della tensione su A0,
  // del valore restituito dalla analogRead,
  // del valore restituito dall'analogWrite
  // e del Duty Cycle %

  // per approfondimenti sull'uso di String si consulti il link: https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/

  Serial.println(String("Tensione su A0: ") + volt + "V" + String(";  ") + "analogRead: " + val + String(";  ") + String("Valore analogWrite: ") + inputVal + String("; ") + String("Duty Cycle %: ") + (inputVal/255.0)*100 + String("%;"));
  delay(500); // stampa una strina di valori ogni mezzo secondo
}

Buon Coding a tutti 🙂

Appunti di programmazione su Arduino: Rispondere ad un telecomando ad infrarossi

In preparazione delle prossime lezioni con i miei studenti condivido la traccia dell’attività di laboratorio in cui mostro come con Arduino è possibile comandare i dispositivi collegati al microcontrollore utilizzando un telecomando ad infrarossi.

La comunicazione ad infrarossi (IR) è una tecnologia wireless ampiamente utilizzata e facilmente realizzabile. Tra gli impieghi più noti: telecomandi TV, termometri ad infrarossi, sensori di movimento (PIR) utilizzati ad esempio per gli antifurti.

Utilizzando Arduino si potrebbero realizzare sperimentazioni che utilizzano la comunicazione IR per realizzare telecomandi per il controllo di robot, telecomandi per TV o fotocamere DSLR, oppure sistemi per monitorare la frequenza cardiaca o realizzare sensori di distanza.

In questa lezione spiegherò, spero in maniera in maniera accessibile a studenti ed appassionati di elettronica cosa sono gli infrarossi e come funzionano e successivamente mostrerò come utilizzare qualsiasi telecomando IR e comandare qualsiasi dispositivo  connesso ad Arduino.

Cosa sono gli infrarossi

La radiazione infrarossa è una forma di luce simile alla luce che vediamo intorno a noi, la differenza tra la luce visibile la la radiazione IR risiede nella frequenza e nella lunghezza d’onda. La radiazione infrarossa si trova al di fuori della gamma di luce visibile, quindi gli esserti umani non possono vederla.

Lo spettro elettromagnetico

EM Spectrum Properties it.svg
Di Annuale. Original version in English by Inductiveload – Translation from English version, Pubblico dominio, Collegamento

Luce visibile

Spettro elettromagnetico semplice.png
Di Teolindo04Opera propria, CC0, Collegamento

La comunicazione IR richiede che tra trasmettitore e ricevitore non vi siano ostacoli, si devono trovare in condizione di visibilità reciproca, non sarà quindi possibile trasmettere attraverso ostacoli, come i muri, come invece risulta possibile per la comunicazione WiFi o Bluetooth.

Come funzionano i trasmettitori ed i ricevitori IR

Un tipico sistema di comunicazione ad infrarossi richiede un trasmettitore IR e un ricevitore IR. Il trasmettitore è contenuto molto spesso in un contenitore simile a quello di un LED standard, con la differenza che produce una redazione elettromagnetica nel campo IR invece che nello spettro visibile.

Se guardate la parte anteriore di un telecomando del TV noterete il LED del trasmettitore IR:

Modulazione di un segnale IR

La radiazione elettromagnetica IR viene emessa da molte fonti: dal sole, dalle lampadine e da qualsiasi altra fonte di calore, ciò implica che queste fonti possono disturbare la comunicazione tra i nostri dispositivi IR comportandosi come dei veri e propri segnali di rumore. Per evitare che il rumore IR interferisca con il segnale IR dei nostri dispositivi, viene utilizzata una tecnica che prende il nome di modulazione.

Se prendiamo in considerazione il telecomando di un TV, quando premiamo uno dei pulsanti verrà emesso, tramite il LED IR, una sequenza di accensioni e spegnimenti del LED IR a frequenza fissata (tipica è la frequenza di 38 kHz) secondo uno schema specifico per ogni pulsante premuto.
Ad ogni pulsante è associato uno schema (detti pattern) specifico di 0 ed 1. Ad ogni stato logico è associata la frequenza di 0 Hz nel caso si voglia inviare uno 0 logico ed una frequenza di  38 kHz nel caso si voglia inviare un 1 logico. Gli schemi sono in genere costituiti da sequenze 12 o 32 bit.

Esistono diverse tecniche per ridurre la quantità di errori derivanti dal rumore esterno (soprattutto dalla luce solare), una di queste prevede che alla pressione di uno dei tasti del telecomando un oscillatore interno al trasmettitore fa “lampeggiare” il LED IR ad una frequenza fa per il livello logico 0 e ad una frequenza fb per un valore logico 1.

Il ricevitore prenderà in considerazione solo le sequenze di segnali alle frequenze fa e fb  associate ai valori 1 e 0 e scarterà tutte le altre frequenze che potrebbero essere derivanti da rumore IR esterno.

Sintesi schema di trasmissione e ricezione 

Il trasmettitore invierà la sequenza di o e 1 ad un decoder che riconoscerà la sequenza corretta.

La modalità in cui il segnale IR modulato viene convertito in binario è definito dal protocollo di trasmissione. Esistono diversi protocolli di trasmissione IR definiti dalle aziende produttrici: NEC,  Sony, Matsushita, NEC, RC5 sono tra i protocolli più comuni.

Nel caso del protocollo NEC il ricevitore converte il segnale IR modulato in un segnale binario, usando la seguente regola:

il livello logico 0 viene trasmesso con un impulso IR a livello ALTO lungo 562.5 μs seguito da un impulso IR BASSO lungo 562.5 μs. Un livello logico 1 inizia con un impulso IR a livello ALTO lungo 562,5 μs ad una frequenza di 38 kHz seguito da un impulso IR a livello BASSO lungo 1.687,5 μs.

Ogni volta che si preme un pulsante sul telecomando, viene generato un codice esadecimale univoco, questo sarà il codice che viene modulato ed inviato tramite il segnale IR al ricevitore. Per decifrare quale pulsante è stato premuto sul telecomando bisognerà  fare in modo che il microcontrollore sappia quale codice corrisponde a ciascun tasto sul telecomando.

Tenete in conto che ciascun telecomando, anche di stessa marca, invia codici esadecimali diversi anche per stessa funzionalità del pulsante,  quindi per i vostri progetti dovrete determinare, prima di procedere nelle sperimentazioni, il codice generato per ciascun tasto sul vostro telecomando.

Le schede tecniche dei telecomandi forniscono i codici esadecimali corrispondenti ad ogni tasto, nel caso non riusciate a trovare la scheda tecnica, in questo tutorial mostro come, con un semplice sketch, è possibile trovare immediatamente i codici associati ad ogni pulsante.

Prima di partire con le sperimentazioni

Durante le attività di sperimentazioni potrete utilizzare il telecomando del vostro TV, nel caso desiderate utilizzare telecomandi IR provenienti da apparati che non possedete più probabilmente potrebbe essere il caso verificarne il funzionamento.

Premesso che abbiate controllato la carica delle batterie del telecomando, un modo pratico per verificare il funzionamento del telecomando consiste nell’utilizzare una qualsiasi macchina fotografica digitale, anche quella del vostro smartphone, dispositivi in grado di visualizzare le frequenze IR.

  • Passo 1: spegnete l’illuminazione della stanza (per ridurre il rumore IR)
  • Passo 2: puntata il telecomando verso l’obiettivo
  • Passo 3: premete un qualsiasi pulsante ed osservate lo schermo della fotocamera, dovreste notare una luce tendente al blu, ciò identifica il funzionamento della trasmissione del segnale

Connettere il ricevitore IR ad Arduino

I ricevitori IR più comuni sono: TSOP4838, PNA4602, TSOP2438, TSPO2236

Tutti questi dispositivi presentano gli stessi collegamenti ed il circuito di collegamento ad Arduino è il medesimo, tranne che per il TSOP2438 in cui i piedini +5V e GND sono invertiti rispetto agli altri componenti elencati.

Per questo esercizio utilizzerò un ricevitore IR TSOP2236 – con demodulazione a 36 KHz.

Per poter utilizzare un ricevitore IR è indispensabile includere all’interno degli sketch la libreria IRremote.h che permette la gestione della trasmissione e la ricezione di segnali infrarossi.

Per i dettagli sull’uso della libreria vi rimando:

Nel caso abbiate problemi di utilizzo della libreria IRremote.h vi consiglio la lettura dell’articolo pubblicato su questo sito:

Arduino: problemi con la libreria IRremote.h – come risolverli

Ricordo che per l’invio dei segnali la libreria IRremote.h utilizza la modulazione PWM ed un timer specifico che utilizzando il pin numero 3. Nel caso abbiate la necessità di variare il pin è indispensabile modificare la libreria. Parlerò di ciò in una prossima lezione.

La spiegazione del funzionamento dei metodi utilizzati fate riferimento ai commenti inclusi nel codice.

Per l’esatto orientamento del TSOP2236 mantenere la protuberanza di fronte a se, in tal modo partendo da sinistra verso destra, come indicato nell’immagine che segue si avrà:

  • segnale (a sinistra)
  • +Vcc (centrale)
  • GND (a destra)

Esercizio 1

Realizzare uno sketch che permetta di far accendere e spegnere il led di controllo (collegato al pin 13) di Arduino ogni volta che si preme un pulsante del telecomando.

// Prof. Michele Maffucci
// 28.04.2019

// Il LED sul pin 13 si accende o si spegne ogni volta che viene
// un pulsante del telecomando

// ricevitore IR TSOP2236 - demulatore 36 KHz

// piedinatura vista frontale TSPO2236
// pin 1 (sx): pin Arduino
// pin 2 (centrale): +Vcc
// pin 3 (dx): GND

#include <IRremote.h>

const int pinRicevitoreIR = 4;             // pin a cui  collegato il ricevitore
const int ledPin = 13;                     // LED connesso al pin 13

IRrecv irrecv(pinRicevitoreIR);            // pin a cui  collegato il ricevitore
decode_results risultato;                  // salva il risultato ricevuto dal rilevatore IR

boolean lightState = false;                // ricorda se il LED e' acceso
unsigned long last = millis();             // ricorda quando e' stato ricevuto
                                           // l'ultima volta un segnale IR

void setup() {
    pinMode(ledPin, OUTPUT);
    irrecv.enableIRIn();                   // Attiva l'oggetto del ricevitore
}

void loop() {
  if (irrecv.decode(&risultato) == true) // vero se si e' ricevuto un messaggio
  {
    if (millis() - last > 250) {             // e' passato 1/4 di secondo dopo l'ultimo messaggio
      lightState = !lightState;              // se vero si cambia lo stato del LED
      digitalWrite(ledPin, lightState);
    }
    last = millis();
    irrecv.resume();                         // presta attenzione ad un altro messaggio
  }
}

Esercizio 2

Realizzare uno sketch che decodifica i segnali di un telecomando in modo che si possa realizzare un sistema di automazione comandato con i pulsanti del telecomando.
Per i collegamenti utilizzare lo schema dell’esercizio 01.

// Prof. Michele Maffucci
// 28.04.2019

// lettura codici esadecimali di un telecomando IR generico
// ricevitore IR TSOP2236 - demulatore 36 KHz

// piedinatura vista frontale TSPO2236
// pin 1 (sx): pin Arduino
// pin 2 (centrale): +Vcc
// pin 3 (dx): GND

#include <IRremote.h>

const int pinRicevitoreIR = 4;             // pin a cui  collegato il ricevitore

IRrecv irrecv(pinRicevitoreIR);            // pin a cui  collegato il ricevitore
decode_results risultato;                  // salva il risultato ricevuto dal rilevatore IR

void setup() {
    Serial.begin(9600);
    irrecv.enableIRIn();                   // Attiva l'oggetto del ricevitore
}

void loop() {
    if (irrecv.decode(&risultato)) {           // vero se si riceve un risultato
        Serial.print("0x");                    // stampa 0x che identifica un codice esadecimale
        Serial.println(risultato.value, HEX);  // stampa il valore esadecimale
        delay(50);                             // attesa di 50 millisecondi
        irrecv.resume();                       // ricezione del successivo valore
    }
}

Esercizio 3

Sfruttando lo sketch degli esercizi 1 e 2 identificare il codice di 5 pulsanti ed inviare sulla Serial Monitor i seguenti messaggi alla pressione dei pulsanti:

CODICE 1: Centrale
CODICE 2: Destro
CODICE 3: Sinistro
CODICE 4: Su
CODICE 5: Giù

Suggerimento
Utilizzare l’istruzione switch per discriminare tra la pressione dei diversi pulsanti

// Prof. Michele Maffucci
// 28.04.2019

// associazione codice invio messaggio sulla Serial Monitor
// ricevitore IR TSOP2236 - demulatore 36 KHz

// piedinatura vista frontale TSPO2236
// pin 1 (sx): pin Arduino
// pin 2 (centrale): +Vcc
// pin 3 (dx): GND

// N.B. nell'esempio sono stati inseriti nei rispettivi case i codici
// esadecimali utilizzati per il telecomando utilizzato
// sostituite questi valori a quelli che rilevate con lo sketch per la rilevazione
// dei codici esadecimali di qualsiasi telecomando


#include <IRremote.h>

int pinRicevitoreIR = 4;                   // pin a cui  collegato il ricevitore

IRrecv irrecv(pinRicevitoreIR);            // pin a cui  collegato il ricevitore
decode_results risultato;                  // salva il risultato ricevuto dal rilevatore IR

void setup() {
    Serial.begin(9600);
    irrecv.enableIRIn();                   // Attiva l'oggetto del ricevitore
}

void loop() {
    if (irrecv.decode(&risultato)) {       // vero se si riceve un risultato

        switch (risultato.value) {         // in funzione di uno dei 4 pulsanti premuti invia messaggio sulla Serial Monitor
            case 0x77E1A086:
            Serial.println("Centrale");
            break;

            case 0x77E16086:
            Serial.println("Destro");
            break;

            case 0x77E19086:
            Serial.println("Sinistro");
            break;

            case 0x77E15086:
            Serial.println("Su'");
            break;

            case 0x77E13086:
            Serial.println("Giu'");
            break;
        }
        irrecv.resume();                  // ricezione del successivo valore
    }
}

Esercizio 4

Accensione e spegnimento di un LED collegato al pin  8 con un solo pulsante di un telecomando. Visualizzare sulla Serial Monitor un messaggio che indica la pressione del pulsante.

Componenti

  • TSOP2236
  • LED
  • Resistenza da 220 Ohm

Nota
Tra pressione e successiva lettura della pressione di un pulsante lasciare trascorrere un tempo di 200 ms

// Prof. Michele Maffucci
// 28.04.2019

// accensione spegnimento di un LED con un telecomando IR generico
// ricevitore IR TSOP2236 - demulatore 36 KHz

// piedinatura vista frontale TSPO2236
// pin 1 (sx): pin Arduino
// pin 2 (centrale): +Vcc
// pin 3 (dx): GND

// N.B. nell'esempio è stato utilizzato come valore di controllo memorizzato in risultato.value
// il codice esadecimali del pulsante utilizzato per il telecomando usato come test
// sostituite questo valore con il pulsante del vostro telecomando

#include <IRremote.h>

const int pinRicevitoreIR = 4;             // pin a cui  collegato il ricevitore

IRrecv irrecv(pinRicevitoreIR);            // pin a cui  collegato il ricevitore
decode_results risultato;                  // salva il risultato ricevuto dal rilevatore IR

int ledPin = 8;                            // pin a cui  collegato il LED
int stato = 0;                             // se stato= 0 ledPin off - se stato = 1 ledPin on

void setup() {
    Serial.begin(9600);
    irrecv.enableIRIn();                   // Attiva l'oggetto del ricevitore
    pinMode(ledPin, OUTPUT);
}

void loop() {
    if ((irrecv.decode(&risultato)) && (risultato.value==0x77E1A086)) {
        if (stato == 0) {
            stato = 1;
            digitalWrite(ledPin, HIGH);
            Serial.println("Centro - HIGH");
            } else {
            stato = 0;
            digitalWrite(ledPin, LOW);
            Serial.println("Centro - LOW");
        }
        delay(200);
        irrecv.resume();
    }
}

Buon Coding a tutti 🙂

Appunti di programmazione su Arduino: esercizi di approfondimento su istruzione switch..case, display a 7 segmenti, Serial.read

Durante le scorse settimane ho svolto una serie di esercitazioni di laboratorio che avevano l’obiettivo di insegnare l’uso dell’istruzione switch…case e la modalità di ricezione dati seriali in Arduino.

La prima lezione è introdotta nel post:

Appunti di programmazione su Arduino: controllo di flusso – istruzione switch..case

Nell’articolo trovate due link che fanno riferimento a due guide sul sito Arduino in cui viene mostrato come utilizzando l’istruzione switch…case:

  • per inviare un output specifico sulla Serial monitor in funzione del valore letto dal sensore;
  • usare la Serial input per accendere uno specifico LED.

La seconda lezione è basata sul tutorial:

Arduino – lezione 08: display a 7 segmenti e creazione di librerie

In cui viene mostrato come pilotare un display a 7 segmenti realizzando un contatore da 0 a 9, e cicli di visualizzazione di numeri pari e numeri dispari. Nella parte finale del tutorial viene mostrato come realizzare una libreria dedicata alla gestione del display a 7 segmenti.

La terza lezione mostra come ricevere dati dalla seriale in Arduino.

Per questa parte è indispensabile svolgere le esercitazioni che trovate nelle slide:

Alfabeto di Arduino – Lezione 3 da pagina 53 a pagina 62

Successivamente aggiungo gli esercizi che di seguito condivido, in cui riprendendo la gestione del display a 7 segmenti, però questa volta inviamo dati dal computer mediante la tastiera al display comandato da Arduino.

Per lo svolgimento di questa parte è necessario effettuare una piccola variazione rispetto al circuito mostrato in: Arduino – lezione 08: display a 7 segmenti e creazione di librerie in questa lezione volutamente utilizzo tra tutti i pin il piedino 1 di Arduino che viene utilizzato normalmente come pin TX e ciò provoca un comportamento anomalo di accensione del LED e del display, ciò mi permette di spiegare l’utilizzo dei pin 0 e 1 di Arduino.

Il circuito da realizzare per la terza lezione è il seguente (i pin di controllo di Arduino sono presi in maniera sequenziale dal pin 6 al pin 12)

Esercitazione 1

  • Realizzare un contasecondi da 0 a 9 utilizzando un display 7 segmenti a catodo comune

Soluzione

// Prof. Michele Maffucci
// 14.04.2019

// Conteggio 9 secondi con display 7 segmenti a catodo comune

// definizione delle variabili a cui collegare ogni segmento del display
// la lettera rappresenta il segmento del display il numero il pin
// digitale di Arduino a cui è collegato il corrispondente pin del display

const int a=12;
const int b=11;
const int c=10;
const int d=9;
const int e=8;
const int f=7;
const int g=6;

// variabile che definisce la velocità con cui appaiono i numeri
const int pausa = 1000;

void setup()
{
  // inizializzazione dei pin ad OUTPUT
  for (int i=6; i<13; i++) {
    pinMode(i, OUTPUT);
  }
}

void loop ()
{
  for (int i=0;i<10;i++)
  {
    LedAcceso(i);
    delay (pausa);
  }
}

void LedAcceso(int n)
{
  switch(n)
  {
  case 0:
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, LOW);
    break;

  case 1:
    digitalWrite(a, LOW);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
    break;

  case 2:
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, LOW);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, LOW);
    digitalWrite(g, HIGH);
    break;
  case 3:
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, HIGH);
    break;

  case 4:
    digitalWrite(a, LOW);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    break;

  case 5:
    digitalWrite(a, HIGH);
    digitalWrite(b, LOW);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    break;

  case 6:
    digitalWrite(a, HIGH);
    digitalWrite(b, LOW);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    break;

  case 7:
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
    break;

  case 8:
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    break;

  case 9:
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    break;
  }
}

Esercitazione 2

  • Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9.
  • La scrittura avviene quando viene premuto l’invio della tastiera.

Soluzione

// Prof. Michele Maffucci
// 14.04.2019
// Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9
// La scrittura avviene quando si preme invio.

// definizione delle variabili a cui collegare ogni segmento del display
// la lettera rappresenta il segmento del display il numero il pin
// digitale di Arduino a cui è collegato il corrispondente pin del display

const int a = 12;
const int b = 11;
const int c = 10;
const int d = 9;
const int e = 8;
const int f = 7;
const int g = 6;

void setup()
{
  // inizializzazione della seriale
  Serial.begin(9600);

  // inizializzazione dei pin ad OUTPUT
  for (int i = 6; i < 13; i++) {
    pinMode(i, OUTPUT);
  }
}

void loop()
{
  if (Serial.available()) {
    int selettore = Serial.read();
    LedAcceso(selettore);
  }
}

void LedAcceso(int n)
{
  switch (n)
  {
    case '0':
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, HIGH);
      digitalWrite(g, LOW);
      break;

    case '1':
      digitalWrite(a, LOW);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, LOW);
      break;

    case '2':
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, LOW);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, LOW);
      digitalWrite(g, HIGH);
      break;

    case '3':
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, HIGH);
      break;

    case '4':
      digitalWrite(a, LOW);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '5':
      digitalWrite(a, HIGH);
      digitalWrite(b, LOW);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, LOW);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '6':
      digitalWrite(a, HIGH);
      digitalWrite(b, LOW);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '7':
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, LOW);
      break;

    case '8':
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '9':
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, LOW);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;
  }
}

Esercitazione 3

  • Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9.
  • La scrittura avviene quando viene premuto l’invio della tastiera.
  • All’avvio del programma deve essere mostrato un gioco di luci con accensione e spegnimento veloce in sequenza dei led: a, b, c, d, e, f del display

Soluzione

// Prof. Michele Maffucci
// 14.04.2019
// Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9
// La scrittura avviena quando si preme invio.
// All'avvio del programma gioco di luci con accensione veloce dei led: a, b, c, d, e, f

// definizione delle variabili a cui collegare ogni segmento del display
// la lettera rappresenta il segmento del display il numero il pin
// digitale di Arduino a cui è collegato il corrispondente pin del display

const int a = 12;
const int b = 11;
const int c = 10;
const int d = 9;
const int e = 8;
const int f = 7;
const int g = 6;

const int intervallo = 10;

void setup()
{
  // inizializzazione della seriale
  Serial.begin(9600);

  // inizializzazione dei pin ad OUTPUT
  for (int i = 6; i < 13; i++) {
    pinMode(i, OUTPUT);
  }
  roll();
}

void loop()
{
  if (Serial.available()) {
    int selettore = Serial.read();
    LedAcceso(selettore);
  }
}

void roll() {
  for (int i = 0; i < 6; i++) {
      digitalWrite(a, HIGH);
      delay(intervallo);
      digitalWrite(a, LOW);
      delay(intervallo);
      digitalWrite(b, HIGH);
      delay(intervallo);
      digitalWrite(b, LOW);
      delay(intervallo);
      digitalWrite(c, HIGH);
      delay(intervallo);
      digitalWrite(c, LOW);
      delay(intervallo);
      digitalWrite(d, HIGH);
      delay(intervallo);
      digitalWrite(d, LOW);
      delay(intervallo);
      digitalWrite(e, HIGH);
      delay(intervallo);
      digitalWrite(e, LOW);
      delay(intervallo);
      digitalWrite(f, HIGH);
      delay(intervallo);
      digitalWrite(f, LOW);
      delay(intervallo);
  }
}

void LedAcceso(int n)
{
  switch (n)
  {
    case '0':
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, HIGH);
      digitalWrite(g, LOW);
      break;

    case '1':
      digitalWrite(a, LOW);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, LOW);
      break;

    case '2':
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, LOW);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, LOW);
      digitalWrite(g, HIGH);
      break;

    case '3':
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, HIGH);
      break;

    case '4':
      digitalWrite(a, LOW);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '5':
      digitalWrite(a, HIGH);
      digitalWrite(b, LOW);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, LOW);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '6':
      digitalWrite(a, HIGH);
      digitalWrite(b, LOW);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '7':
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, LOW);
      break;

    case '8':
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '9':
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, LOW);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;
  }
}

Esercitazione 4

  • Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9.
  • La scrittura avviene quando viene premuto l’invio della tastiera.
  • All’avvio del programma deve essere mostrato un gioco di luci con accensione e spegnimento veloce in sequenza dei led: a, b, c, d, e, f del display
  • Alla pressione di un tasto diverso dai numeri da 0 a 9, gioco di luci e spegnimento del display.

Soluzione

// Prof. Michele Maffucci
// 14.04.2019
// Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9
// La scrittura avviena quando si preme invio.
// All'avvio del programma gioco di luci con accensione veloce dei led: a, b, c, d, e, f
// Alla pressione di un tasto diverso dai numeri da 0 a 9, gioco di luci e spegnimento del display.

// definizione delle variabili a cui collegare ogni segmento del display
// la lettera rappresenta il segmento del display il numero il pin
// digitale di Arduino a cui è collegato il corrispondente pin del display

const int a = 12;
const int b = 11;
const int c = 10;
const int d = 9;
const int e = 8;
const int f = 7;
const int g = 6;

const int intervallo = 10;

void setup()
{
  // inizializzazione della seriale
  Serial.begin(9600);

  // inizializzazione dei pin ad OUTPUT
  for (int i = 6; i < 13; i++) {
    pinMode(i, OUTPUT);
  }
  roll();
}

void loop()
{
  if (Serial.available()) {
    int selettore = Serial.read();
    LedAcceso(selettore);
  }
}

void roll() {
  for (int i = 0; i < 6; i++) {
      digitalWrite(a, HIGH);
      delay(intervallo);
      digitalWrite(a, LOW);
      delay(intervallo);
      digitalWrite(b, HIGH);
      delay(intervallo);
      digitalWrite(b, LOW);
      delay(intervallo);
      digitalWrite(c, HIGH);
      delay(intervallo);
      digitalWrite(c, LOW);
      delay(intervallo);
      digitalWrite(d, HIGH);
      delay(intervallo);
      digitalWrite(d, LOW);
      delay(intervallo);
      digitalWrite(e, HIGH);
      delay(intervallo);
      digitalWrite(e, LOW);
      delay(intervallo);
      digitalWrite(f, HIGH);
      delay(intervallo);
      digitalWrite(f, LOW);
      delay(intervallo);
  }
}

void LedAcceso(int n)
{
  switch (n)
  {
    case '0':
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, HIGH);
      digitalWrite(g, LOW);
      break;

    case '1':
      digitalWrite(a, LOW);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, LOW);
      break;

    case '2':
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, LOW);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, LOW);
      digitalWrite(g, HIGH);
      break;

    case '3':
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, HIGH);
      break;

    case '4':
      digitalWrite(a, LOW);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '5':
      digitalWrite(a, HIGH);
      digitalWrite(b, LOW);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, LOW);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '6':
      digitalWrite(a, HIGH);
      digitalWrite(b, LOW);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '7':
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, LOW);
      break;

    case '8':
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '9':
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, LOW);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    default:
      digitalWrite(a, LOW);
      digitalWrite(b, LOW);
      digitalWrite(c, LOW);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, LOW);
      roll();
  }
}

Esercitazione 5

  • Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9.
  • La scrittura avviene quando viene premuto l’invio della tastiera.
  • All’avvio del programma deve essere mostrato un gioco di luci con accensione e spegnimento veloce in sequenza dei led: a, b, c, d, e, f del display.
  • Alla pressione di un tasto diverso dai numeri da 0 a 9, gioco di luci e spegnimento del display.
  • Alla pressione di un numero da 0 a 9 prima della comparsa del numero mostrare gioco di luci.

Soluzione

// Prof. Michele Maffucci
// 14.04.2019
// Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9
// La scrittura avviena quando si preme invio.
// All'avvio del programma gioco di luci con accensione veloce dei led: a, b, c, d, e, f
// Alla pressione di un tasto diverso dai numeri da 0 a 9, gioco di luci e spegnimento del display.
// Alla pressione di un numero da 0 a 9 prima della comparsa del numero mostrare gioco di luci.

// definizione delle variabili a cui collegare ogni segmento del display
// la lettera rappresenta il segmento del display il numero il pin
// digitale di Arduino a cui è collegato il corrispondente pin del display

const int a = 12;
const int b = 11;
const int c = 10;
const int d = 9;
const int e = 8;
const int f = 7;
const int g = 6;

const int intervallo = 10;

void setup()
{
  // inizializzazione della seriale
  Serial.begin(9600);

  // inizializzazione dei pin ad OUTPUT
  for (int i = 6; i < 13; i++) {
    pinMode(i, OUTPUT);
  }
  roll();
}


void loop()
{
  if (Serial.available()) {
    int selettore = Serial.read();
    LedAcceso(selettore);
  }
}

void roll() {
  // spegnimento di tutti i led del display
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);

  // ciclo di sei accensioni e spegnimenti dei led a, b, c, d, e, f
  for (int i = 0; i < 6; i++) {
    digitalWrite(a, HIGH);
    delay(intervallo);
    digitalWrite(a, LOW);
    delay(intervallo);
    digitalWrite(b, HIGH);
    delay(intervallo);
    digitalWrite(b, LOW);
    delay(intervallo);
    digitalWrite(c, HIGH);
    delay(intervallo);
    digitalWrite(c, LOW);
    delay(intervallo);
    digitalWrite(d, HIGH);
    delay(intervallo);
    digitalWrite(d, LOW);
    delay(intervallo);
    digitalWrite(e, HIGH);
    delay(intervallo);
    digitalWrite(e, LOW);
    delay(intervallo);
    digitalWrite(f, HIGH);
    delay(intervallo);
    digitalWrite(f, LOW);
    delay(intervallo);
  }
}

void LedAcceso(int n)
{
  switch (n)
  {
    case '0':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, HIGH);
      digitalWrite(g, LOW);
      break;

    case '1':
      roll();
      digitalWrite(a, LOW);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, LOW);
      break;

    case '2':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, LOW);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, LOW);
      digitalWrite(g, HIGH);
      break;

    case '3':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, HIGH);
      break;

    case '4':
      roll();
      digitalWrite(a, LOW);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '5':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, LOW);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, LOW);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '6':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, LOW);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '7':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, LOW);
      break;

    case '8':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '9':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, LOW);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    default:
      roll();
  }
}

Esercitazione 6

Realizzare le stesse funzionalità dell’esercizio 5 ma ottimizzare la funzione roll() in modo che lo spegnimento iniziale dei LED sia costituito da un ciclo for e l’accensione e lo spegnimento sequenziale sia realizzato da due cicli for annidati.

Soluzione

// Prof. Michele Maffucci
// 14.04.2019
// Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9
// La scrittura avviena quando si preme invio.
// All'avvio del programma gioco di luci con accensione veloce dei led: a, b, c, d, e, f
// Alla pressione di un tasto diverso dai numeri da 0 a 9, gioco di luci e spegnimento del display.
// Alla pressione di un numero da 0 a 9 prima della comparsa del numero mostrare gioco di luci

// Versione in cui la funzione roll() è stata ottimizzata
// Lo spegnimento iniziale dei LED è costituito da un ciclo for e l'accensione e lo spegnimento sequenziale
// è realizzato da due cicli for annidati.

// definizione delle variabili a cui collegare ogni segmento del display
// la lettera rappresenta il segmento del display il numero il pin
// digitale di Arduino a cui è collegato il corrispondente pin del display

const int a = 12;
const int b = 11;
const int c = 10;
const int d = 9;
const int e = 8;
const int f = 7;
const int g = 6;

const int intervallo = 10;

void setup()
{
  // inizializzazione della seriale
  Serial.begin(9600);

  // inizializzazione dei pin ad OUTPUT
  for (int i = 6; i < 13; i++) {
    pinMode(i, OUTPUT);
  }
  roll();
}


void loop()
{
  if (Serial.available()) {
    int selettore = Serial.read();
    LedAcceso(selettore);
  }
}

// funzione per gioco di luci
void roll() {

  // spegnimento di tutti i led del display
  for (int i = 6; i < 13; i++) {
    digitalWrite(i, LOW);
  }

  // ciclo di sei accensioni e spegnimenti dei led a, b, c, d, e, f
  for (int m = 0; m < 6; m++) {
    for (int p = 12; p > 6; p--) {
      digitalWrite(p, HIGH);
      delay(intervallo);
      digitalWrite(p, LOW);
      delay(intervallo);
    }
  }
}

// la funzione LedAcceso prende come input il carattere numerico che deve essere mostrato su display
// prima che venga stampato il numero viene eseguita la funzione roll()
void LedAcceso(int n)
{
  switch (n)
  {
    case '0':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, HIGH);
      digitalWrite(g, LOW);
      break;

    case '1':
      roll();
      digitalWrite(a, LOW);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, LOW);
      break;

    case '2':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, LOW);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, LOW);
      digitalWrite(g, HIGH);
      break;

    case '3':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, HIGH);
      break;

    case '4':
      roll();
      digitalWrite(a, LOW);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '5':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, LOW);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, LOW);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '6':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, LOW);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '7':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, LOW);
      break;

    case '8':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '9':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, LOW);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    default:
      roll();
  }
}

Esercitazione 7

Realizzare le stesse funzionalità dell’esercizio 6 realizzando una libreria di gestione “LedAcceso.h” richiamata dallo sketch principale. Per l’esecuzione di questo esercizio seguire le indicazioni fornite al fondo del tutorial: Arduino – lezione 08: display a 7 segmenti e creazione di librerie

Soluzione

LedAcceso.cpp

/* display_sette_segmenti.cpp
libreria che consente il controllo di un display a 7 segmenti a catodo comune
del tipo HDSP 5503
*/

#include "Arduino.h"

const int a = 12;
const int b = 11;
const int c = 10;
const int d = 9;
const int e = 8;
const int f = 7;
const int g = 6;

const int intervallo = 10;

// funzione per gioco di luci
void roll() {

  // spegnimento di tutti i led del display
  for (int i = 6; i < 13; i++) {
    digitalWrite(i, LOW);
  }

  // ciclo di sei accensioni e spegnimenti dei led a, b, c, d, e, f
  for (int i = 0; i < 6; i++) {
    for (int j = 12; j > 6; j--) {
      digitalWrite(j, HIGH);
      delay(intervallo);
      digitalWrite(j, LOW);
      delay(intervallo);
    }
  }
}

// la funzione LedAcceso prende come input il carattere numerico che deve essere mostrato su display
// prima che venga stampato il numero viene eseguita la funzione roll()
void LedAcceso(int n)
{
  switch (n)
  {
    case '0':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, HIGH);
      digitalWrite(g, LOW);
      break;

    case '1':
      roll();
      digitalWrite(a, LOW);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, LOW);
      break;

    case '2':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, LOW);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, LOW);
      digitalWrite(g, HIGH);
      break;

    case '3':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, HIGH);
      break;

    case '4':
      roll();
      digitalWrite(a, LOW);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '5':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, LOW);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, LOW);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '6':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, LOW);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '7':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, LOW);
      break;

    case '8':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    case '9':
      roll();
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, LOW);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
      break;

    default:
      roll();
  }
}

LedAcceso.h

/* LedAcceso.h
   header file della libreria LedAcceso
*/

#include "Arduino.h"

void LedAcceso(int n);  // prototipo della funzione
void roll();            // prototipo della funzione

sketch

// Prof. Michele Maffucci
// 14.04.2019
// Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9
// La scrittura avviena quando si preme invio.
// All'avvio del programma gioco di luci con accensione veloce dei led: a, b, c, d, e, f
// Alla pressione di un tasto diverso dai numeri da 0 a 9, gioco di luci e spegnimento del display.
// Alla pressione di un numero da 0 a 9 prima della comparsa del numero mostrare gioco di luci

// Versione con inclusione della libreria di gestione dell'accensione del display

// definizione delle variabili a cui collegare ogni segmento del display
// la lettera rappresenta il segmento del display il numero il pin
// digitale di Arduino a cui è collegato il corrispondente pin del display

#include "LedAcceso.h"

const int a = 12;
const int b = 11;
const int c = 10;
const int d = 9;
const int e = 8;
const int f = 7;
const int g = 6;

const int intervallo = 10;

void setup()
{
  // inizializzazione della seriale
  Serial.begin(9600);

  // inizializzazione dei pin ad OUTPUT
  for (int i = 6; i < 13; i++) {
    pinMode(i, OUTPUT);
  }
  roll();
}

void loop()
{
  // verifica se sulla serial monitor è presente un carattere,
  // se la condizione è vera viene letto il carattere presente sulla serial monitor
  if (Serial.available()) {
    int selettore = Serial.read();
    LedAcceso(selettore);
  }
}

Buon Coding a tutti 🙂