Archivi categoria: arduino

Arduino UNO R4 WiFi – Visualizzare il livello di una grandezza fisica mediante una barra incrementale sulla matrice LED di Arduino

Come anticipato nelle scorse lezioni vediamo in questo tutorial come visualizzare il livello di una grandezza fisica mediante una barra incrementale sulla matrice LED dell’Arduino UNO R4 WiFi.
Gli esempi mostrati possono essere adattati per qualsiasi tipologia di sensore, per semplicità e rapidità di realizzazione ho scelto di rilevare l’intensità luminosa mediante un LDR. Lascio a voi correzioni e miglioramenti a quanto ho scritto.

La matrice, come sapete è costituita da 8 righe di LED, Il numero di linee LED attive sarà proporzionale all’intensità luminosa rilevata:

  • Livello minimo di intensità = accensione della sola riga 7
  • Livello massimo di intensità = accensione di tutte le righe della matrice

I 6 sketch di esempio che seguono sono molto simili, tutti eseguono la calibrazione del sensore, basata sullo sketch standard che trovate all’interno degli esempi dell’IDE di Arduino. Il codice di calibrazione prevede 5 secondi di analisi che permettono di impostare il livello minimo e massimo della grandezza da misurare. Ho aggiunto per ognuno dei 6 esempi alternative diverse per mostrare sulla matrice di LED il timer di 5 secondi.

Il funzionamento di ogni parte del codice dei 6 sketch, è dettagliato mediante commenti, se avete necessità di chiarimenti non esitate a contattarmi.

Circuito

Il circuito prevede l’utilizzo di:

  • Arduino UNO R4 WiFi
  • LDR
  • Resitore da 10 KOhm

Esempio 01

Il trascorrere del tempo di calibrazione è mostrato dall’accensione sequenziale dei primi 5 LED posti sulla riga n. 7, terminata la fase di calibrazione, dopo 0,5 secondi l’array della matrice viene azzerato e viene poi avviata la rilevazione.

sketch01

1// Prof. Maffucci Michele
2// 31/07/23
3// Visualizzazione livello luminoso su matrice LED Uno R4 WiFi
4// con calibrazione sensore e visualizzazione timer di calibrazione
5// con l'accensione di 5 LED della matrice
6 
7// Esercizio 01
8 
9// inclusione della libreria per la gestione della matrice
10#include "Arduino_LED_Matrix.h"
11 
12// creazione dell’oggetto matrix
13ArduinoLEDMatrix matrix;
14 
15// inizializzazione dell'array per inizializzare lo stato della matrice
16uint8_t frame[8][12] = { 0 };
17 
18// pin a cui collegare il sensore
19int pinSensore = A0;
20 
21// variabile in cui memorizzare il valore letto dal sensore
22int valoreSensore = 0;
23 
24// variabili per calibrazione lovello minimo e massimo luce ambiente
25int sensoreMin = 1023;  // valore minimo sensore
26int sensoreMax = 0;     // valore massimo sensore
27 
28// contatore passi di calibrazione
29int contatore = 0;
30 
31// valore del millis al passo precedente
32unsigned long millisPrecedente = 0;
33// valore del millis attuale
34unsigned long millisCorrente = 0;
35 
36// intervallo in millisecondi per l'accensione di una riga di LED
37const long intervallo = 1000;
38 
39// riga LED precedentemente accesa
40int precedenteLivello = 0;
41 
42void setup() {
43  // inizializzazione della velocità della serial monitor
44  Serial.begin(115200);
45 
46  // avvio della matrice di LED
47  matrix.begin();
48 
49  // calibrazione del sensore nei primi 5 secondi di avvio di Arduino
50  while (millis() < 5000) {
51 
52    // memorizzazione dle valore attuale del millis
53    millisCorrente = millis();
54 
55    // lettura valore
56    valoreSensore = analogRead(pinSensore);
57 
58    // registra il valore massimo rilevato dal sensore
59    if (valoreSensore > sensoreMax) {
60      sensoreMax = valoreSensore;
61    }
62 
63    // registra il valore minimo rilevato dal sensore
64    if (valoreSensore < sensoreMin) {
65      sensoreMin = valoreSensore;
66    }
67 
68    // timer
69    if (millisCorrente - millisPrecedente >= intervallo) {
70      millisPrecedente = millisCorrente;
71      frame[7][contatore] = 1;
72      matrix.renderBitmap(frame, 8, 12);
73      contatore++;
74    }
75  }
76  // accensione dell'ultimo LED al 5' secondo
77  frame[7][4] = 1;
78  matrix.renderBitmap(frame, 8, 12);
79 
80  // attesa di 0,5 secondi prima di spegnere tutti i LED
81  delay(500);
82 
83  // spegnimento di tutti i LED della matrice
84  uint8_t frame[8][12] = { 0 };
85  matrix.renderBitmap(frame, 8, 12);
86}
87 
88// Accensione linee matrice (dalla riga 7)
89// maggiore e' il valore numeriico di "livello" (riga LED) più bassa sarà l'intensità luminosa
90// minore e' e' il valore numeriico di "livello" (riga LED) più alta sarà l'intensità luminosa
91 
92// Livello minimo di intensità = accensione della sola riga 7
93// Livello massimo di intensità = accensione di tutte le linee della matrice
94 
95void barra(int livello) {
96  // spegnimento della riga "livello"
97  if (livello > precedenteLivello) {
98    for (int y = livello; y >= precedenteLivello; y--) {
99      // spegnimento dei 12 LED della riga "livello"
100      for (int x = 0; x < 12; x++) {
101        frame[y][x] = 0;
102      }
103      matrix.renderBitmap(frame, 8, 12);
104      delay(1);
105    }
106    // accensione della riga "livello"
107  } else {
108    for (int y = 7; y >= precedenteLivello; y--) {
109      for (int x = 0; x < 12; x++) {
110        frame[y][x] = 1;
111      }
112      matrix.renderBitmap(frame, 8, 12);
113      delay(1);
114    }
115  }
116  precedenteLivello = livello;
117}
118 
119void loop() {
120 
121  // per evitare sprechi di memoria viene utilizzata usata una stessa variabile: valoreSensore
122  // per memorizzare ad ogni passo valori diversi
123 
124  // lettura del valore del sensore
125  valoreSensore = analogRead(pinSensore);
126 
127  // Forzare il valore all'interno del valore minimo e del massimo nel caso di errori di lettura.
128  // Nel caso non si aggiungesse il "constrain" nel caso di errore si blocca l'esecuzione
129  valoreSensore = constrain(valoreSensore, sensoreMin, sensoreMax);
130 
131  // Il valore minimo di lettura è associato all'accensione della riga 7
132  // quindi si rimappa tra 7 e 0
133  valoreSensore = map(valoreSensore, sensoreMin, sensoreMax, 7, 0);
134 
135  // barra(valoreSensore) è la funzione che gestisce l'accensione delle linee di LED
136  barra(valoreSensore);
137}

Continua a leggere

Arduino UNO R4 WiFi – usare la matrice LED per esercitarsi con i cicli for

Come segnalato nei precedenti, post sto realizzando le prime lezioni sull’uso di Arduino UNO R4 WiFi per i miei studenti, ma ho pensato di mostrare su queste pagine gli sketch di base che poi utilizzerò per implementare esercitazioni più estese. Gli esempi che seguono hanno l’obiettivo di mostrare l’utilizzo ed il risultato di cicli for annidati che hanno come obiettivo la realizzazioni di semplici animazioni sulla matrice di LED di Arduino, strutture di codice che potranno essere sfruttate ad esempio per visualizzare lo stato di un sensore, il valore di una variabile e molto altro.

Utilizzerò per questi esercizi il “Modo 1” indicato nella lezione precedente in cui veniva creato un array bidimensionale che inizializza e rappresenta lo stato della matrice di LED, se ricordate la struttura da includere all’inizio del codice era la seguente:

1byte frame[8][12] = {
2  { 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 },
3  { 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0 },
4  { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
5  { 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
6  { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 },
7  { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 },
8  { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
9  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
10};

Per rendere leggibile e più snello il codice scriverò in altro modo la matrice sopra:

1uint8_t frame[8][12] = {0};

Esercizio 1

In questo esercizio vedremo come effettuare il blink della 7 linea di LED sulla matrice, per intenderci la base inferiore della matrice. Le inizializzazioni per l’utilizzo della matrice sono le medesime per tutti gli sketch che seguono.

Vengono definite due funzioni: barraOn() e barraOff() che si occupano di accendere e spegnere la linea 7 della matrice. Il ciclo for incluso nelle due funzioni itererà per 12 volte ponendo ad 1 il valore della linea 7, come potete notare viene vincolata a 7 la y della matrice: frame[7][x]. Nel loop verranno richiamate le due funzioni barraOn() e barraOff() con un delay di 1 secondo. Ricordate che è essenziale ad ogni modifica dello stato della matrice invocare la funzione: matrix.renderBitmap(frame, 8, 12); altrimenti non vedrete nulla sulla matrice

1// Prof. Maffucci Michele
2// 27/07/23
3// Blink striscia led (linea 7) su matrice
4// Esercizio 01
5 
6#include "Arduino_LED_Matrix.h"
7 
8ArduinoLEDMatrix matrix;
9 
10void setup() {
11  Serial.begin(115200);
12  matrix.begin();
13}
14 
15uint8_t frame[8][12] = {0};
16 
17// accensione linea 7 della matrice
18void barraOn() {
19  //barra
20  for (int x=0; x<12; x++){
21    frame[7][x] = 1;
22  }
23}
24 
25// spegnimento linea 7 della matrice
26void barraOff() {
27  //barra
28  for (int x=0; x<12; x++){
29    frame[7][x] = 0;
30  }
31}
32 
33void loop() {
34  barraOn();
35  matrix.renderBitmap(frame, 8, 12);
36 
37  delay(1000);
38  barraOff();
39 
40  matrix.renderBitmap(frame, 8, 12);
41  delay(1000);
42}

Esercizio 2

In questo secondo esercizio l’accensione dei LED dell’ultima line avviene in modo sequenziale da sinistra verso destra e successivamente questi saranno spenti sempre da sinistra verso destra dando l’impressione che il “serpente” esce dallo schermo da destra e rientri da sinistra.

Nell’esempio che segue sono state definite due funzioni: barraOn() e barraOff() in cui vincolata la linea 7 viene modificata in modo ciclico la coordinata x del LED. Per dare la sensazione di movimento l’accensione e lo spegnimento di ogni songolo LEd è stato posto a 100 millisecondi. Nel loop vengono richiamate ciclicamente le due funzioni.

1// Prof. Maffucci Michele
2// 27/07/23
3// Accensione/spegnimento in una direzione striscia led (linea 7) su matrice
4// Esercizio 02
5 
6#include "Arduino_LED_Matrix.h"
7 
8ArduinoLEDMatrix matrix;
9 
10void setup() {
11  Serial.begin(115200);
12  matrix.begin();
13}
14 
15uint8_t frame[8][12] = {0};
16 
17// accensione linea 7 della matrice
18void barraOn() {
19  for (int x=0; x<12; x++){
20    frame[7][x] = 1;
21    matrix.renderBitmap(frame, 8, 12);
22    delay(100);
23  }
24}
25 
26// spegnimento linea 7 della matrice
27void barraOff() {
28  //barra
29  for (int x=0; x<12; x++){
30    frame[7][x] = 0;
31    matrix.renderBitmap(frame, 8, 12);
32    delay(100);
33  }
34}
35 
36void loop() {
37  barraOn();
38  barraOff();
39}

Esercizio 3

In questo esempio la barra posta sulla linea 7 simula il comportamento di incremento o decremento di una variabile per cui la barra aumenta e diminuisce da un valore minimo ad un valore massimo in modo sequenziale, ma immaginate di modificare questo sketch collegandolo ad esempio alla variazione di un valore analogico. La differenza rispetto allo sketch precedente consiste solamente nel fatto che lo spegnimento dei LED avviene partendo dai LED maggiore.

1// Prof. Maffucci Michele
2// 27/07/23
3// Accensione/spegnimento in due direzioni striscia led (linea 7) su matrice
4// Esercizio 03
5 
6#include "Arduino_LED_Matrix.h"
7 
8ArduinoLEDMatrix matrix;
9 
10void setup() {
11  Serial.begin(115200);
12  matrix.begin();
13}
14 
15uint8_t frame[8][12] = {0};
16 
17// accensione linea 7 della matrice
18void barraOn() {
19  for (int x=0; x<12; x++){
20    frame[7][x] = 1;
21    matrix.renderBitmap(frame, 8, 12);
22    delay(100);
23  }
24}
25 
26// spegnimento linea 7 della matrice
27void barraOff() {
28  for (int x=11; x>=0; x--){
29    frame[7][x] = 0;
30    matrix.renderBitmap(frame, 8, 12);
31    delay(100);
32  }
33}
34 
35void loop() {
36  barraOn();
37  barraOff();
38}

Esercizio 4

L’idea di questo quarto sketch nasce dalla necessità di realizzare un indicatore per misurare ad esempio il livello di luminosità, sonoro o l’umidità presente nel terreno. Come potete notare le linee della matrice vengono attivate una alla volta dal basso verso l’alto e poi spente dall’alto verso il basso. Le due funzioni barraOn() e barraOff() includono due cicli for annidati, quello più esterno consente di fissare la linea della matrice, mentre quello più interno permette di accendere o spegnere i LED sulla stessa linea. Nel loop le due funzioni vengono richiamata ciclicamente.

1// Prof. Maffucci Michele
2// 27/07/23
3// Accensione/spegnimento in due direzioni (linea) BASSO>ALTO ALTO>BASSO matrice led
4// Esercizio 04
5 
6#include "Arduino_LED_Matrix.h"
7 
8ArduinoLEDMatrix matrix;
9 
10void setup() {
11  Serial.begin(115200);
12  matrix.begin();
13}
14 
15uint8_t frame[8][12] = {0};
16 
17// accensione linea BASSO>ALTO (dalla linea 7)
18void barraOn() {
19  for (int y = 8; y >= 0; y--) {
20    for (int x = 0; x < 12; x++) {
21      frame[y][x] = 1;
22    }
23    matrix.renderBitmap(frame, 8, 12);
24    delay(100);
25  }
26}
27 
28// spegnimento linea ALTO>BASSO (dalla linea 0)
29void barraOff() {
30  for (int y = 0; y <=8 ; y++) {
31    for (int x = 11; x >= 0; x--) {
32      frame[y][x] = 0;
33    }
34    matrix.renderBitmap(frame, 8, 12);
35    delay(100);
36  }
37}
38 
39void loop() {
40  barraOn();
41  barraOff();
42}

Esercizio 5

Lo sketch che segue ha il medesimo obiettivo del precedente, ma in questo caso l’accensione e lo spegnimento della matrice avviene per colonne, accensione da sinistra verso destra e spegnimento da destra verso sinistra. Le due funzioni barraOn() e barraOff(), costittuite entrambe da due cicli for annidati funzionano in modalità opposta allo sketch precedente, in questo caso il for più esterno vincola la colonna e quello più interno accende/spegne i LED della colonna.

1// Prof. Maffucci Michele
2// 27/07/23
3// Accensione/spegnimento in due direzioni SX>DX DX>SX (partenza colonna 0) matrice led
4// Esercizio 05
5 
6#include "Arduino_LED_Matrix.h"
7 
8ArduinoLEDMatrix matrix;
9 
10void setup() {
11  Serial.begin(115200);
12  matrix.begin();
13}
14 
15uint8_t frame[8][12] = {0};
16 
17// accensione colonna SX>DX (dalla colonna 0)
18void barraOn() {
19  for (int x = 0; x < 12; x++) {
20    for (int y = 0 ; y < 8; y++) {
21      frame[y][x] = 1;
22    }
23    matrix.renderBitmap(frame, 8, 12);
24    delay(100);
25  }
26}
27 
28// spegnimento colonna DX>SX (dalla colonna 11)
29void barraOff() {
30  for (int x = 11; x >= 0 ; x--) {
31    for (int y = 7 ; y >= 0; y--) {
32      frame[y][x] = 0;
33    }
34    matrix.renderBitmap(frame, 8, 12);
35    delay(100);
36  }
37}
38 
39void loop() {
40  barraOn();
41  barraOff();
42}

Esercizio 6

In questo esercizio si vuole mostrare come spostare, “far cadere”, un puntino dall’alto verso il basso eseguendo questa operazione per ogni colonna da sinistra verso destra. La funzione puntino() è costituita da due cicli for, il più esterno vincola la colonna su cui movimentare il LED, mentre quello più interno accende e spegne in modo sequenziale i LED della colonna selezionata dal for più esterno.

1// Prof. Maffucci Michele
2// 27/07/23
3// Accensione e spegnimento sequenziale dall'alto al basso - matrice led
4// Esercizio 06
5 
6#include "Arduino_LED_Matrix.h"
7 
8ArduinoLEDMatrix matrix;
9 
10void setup() {
11  Serial.begin(115200);
12  matrix.begin();
13}
14 
15uint8_t frame[8][12] = { 0 };
16 
17// puntino cadente
18void puntino() {
19  for (int x = 0; x < 12; x++) {
20    for (int y = 0; y < 8; y++) {
21      frame[y][x] = 1;
22      matrix.renderBitmap(frame, 8, 12);
23      delay(20);
24      frame[y][x] = 0;
25      matrix.renderBitmap(frame, 8, 12);
26      delay(20);
27    }
28  }
29}
30 
31void loop() {
32  puntino();
33}

Esercizio 7

Comportamento identico al precedente ma in questo caso lo spostamento del puntino avviene per righe dall’alto al basso ed accensione e spegnimento da destra verso sinistra. In questo vaso il for più esterno vincola la riga mentre quello più interno si occupa di accendere e spegnere i LED della riga selezionata.

1// Prof. Maffucci Michele
2// 27/07/23
3// Accensione e spegnimento sequenziale SX > DX dall'alto al basso - matrice led
4// Esercizio 07
5 
6#include "Arduino_LED_Matrix.h"
7 
8ArduinoLEDMatrix matrix;
9 
10void setup() {
11  Serial.begin(115200);
12  matrix.begin();
13}
14 
15uint8_t frame[8][12] = { 0 };
16 
17// puntino cadente
18void puntino() {
19  for (int y = 0; y < 8; y++) {
20    for (int x = 0; x < 12; x++) {
21      frame[y][x] = 1;
22      matrix.renderBitmap(frame, 8, 12);
23      delay(20);
24      frame[y][x] = 0;
25      matrix.renderBitmap(frame, 8, 12);
26      delay(20);
27    }
28  }
29}
30 
31void loop() {
32  puntino();
33}

Esercizio 8

In questo esercizio viene vincolato lo spostamento del puntino luminoso sulla riga quattro simulando uno spostamento sinistra/destra e destra/sinistra dando l’impressione di un rimbalzo sulle pareti. Per rendere più chiara la lettura da parte degli studenti ho realizzato due funzioni separate che si occupano dei due movimenti.

1// Prof. Maffucci Michele
2// 27/07/23
3// Puntino che rimbalza SX > DX - DX > SX - matrice led
4// Esercizio 08
5 
6#include "Arduino_LED_Matrix.h"
7 
8ArduinoLEDMatrix matrix;
9 
10void setup() {
11  Serial.begin(115200);
12  matrix.begin();
13}
14 
15uint8_t frame[8][12] = { 0 };
16 
17// puntino rimbalza su riga 4
18void puntinoSxDx() {
19  for (int x = 0; x < 12; x++) {
20    frame[4][x] = 1;
21    matrix.renderBitmap(frame, 8, 12);
22    delay(50);
23    frame[4][x] = 0;
24    matrix.renderBitmap(frame, 8, 12);
25    delay(50);
26  }
27}
28 
29void puntinoDxSx() {
30  for (int x = 11; x >= 0; x--) {
31    frame[4][x] = 1;
32    matrix.renderBitmap(frame, 8, 12);
33    delay(50);
34    frame[4][x] = 0;
35    matrix.renderBitmap(frame, 8, 12);
36    delay(50);
37  }
38}
39 
40void loop() {
41  puntinoSxDx();
42  puntinoDxSx();
43}

Buon Making a tutti 🙂

Usare la matrice LED di Arduino UNO R4 WiFi

L’elemento caratterizzante più evidente di Arduino R4 è senza alcun dubbio la matrice di LED, che potremo utilizzare come sistema di output immediato, ma anche per creare animazioni o giochi, o ancora mettere in evidenza lo stato di un sensore. La matrice LED è costituita da 12×8 LED.

La matrice e la sua API sono sviluppate per essere programmate in diversi modi, ciascuno adatto per diverse applicazioni. Questa breve lezione vi guiderà attraverso i concetti di base per gestire la matrice di LED aiutandovi a creare le vostre animazioni, mostrando tre diversi metodi di gestione dei LED che potrete scegliere in funzione del progetto che desiderate implementare.

Per lo svolgimento di questa lezione avete necessità solamente della scheda Arduino UNO R4 e di un cavo USB C.

Inizializzare la matrice

L’inizializzazione della matrice di LED avviene in 3 passi:

  1. inclusione nel vostro sketch della libreria:
1#include "Arduino_LED_Matrix.h"
  1. creazione dell’oggetto matrix aggiungendo la seguente riga:
1ArduinoLEDMatrix matrix;

L’oggetto ovviamente potrà avere un nome a vostro piacimento nell’esempio è stato scelto: “matrix”

  1. avviare la matrice aggiungendo nel setup():
1matrix.begin();

Il codice di avvio sarà il seguente:

1#include "Arduino_LED_Matrix.h"
2 
3ArduinoLEDMatrix matrix;
4 
5void setup() {
6  Serial.begin(115200);
7  matrix.begin();
8}

Come realizzare un frame

Il principio di funzionamento della libreria di gestione della matrice di LED è quello basato sulla creazione di un frame (fotogramma) memorizzato in un buffer di memoria e poi visualizzato.

Un frame è ciò che viene chiamato anche “immagine” visualizzata in un dato momento sulla matrice di LED. Un’animazione è costituita da una serie di immagini pertanto possiamo dire in altro modo che un’animazione è costituita da una sequenza di frame .

Per controllare la matrice LED 12×8 è indispensabile utilizzare uno spazio in memoria che sia di almeno 96 bit e la libreria fornisce due modi per farlo.

Modo n. 1

Il primo è quello di creare un array bidimensionale di byte nel modo che segue:

1byte frame[8][12] = {
2  { 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 },
3  { 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0 },
4  { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
5  { 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
6  { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 },
7  { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 },
8  { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
9  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
10};

La prima modalità è molto semplice da capire, la struttura frame rappresenta la matrice di LED e la serie di 1 indicherà quali LED saranno accesi, mentre quelli a 0 rappresentano i LED spenti. L’array sopra permetterà di visualizzare sulla matrice un cuore.

Suggerimento: Potete vedere il cuore più facilmente se evidenziate tutti gli “1” sulla pagina premendo CTRL/command + F e cercando “1”.

Per fare riferimento ad un pixel specifico ricordare che l’origine degli assi si trova in alto a sinistra ed avrà coordinate (0, 0) pertanto il codice che segue permette di porre ad 1 (on) il terzo pixel da sinistra e secondo dall’alto:

1frame[2][1] = 1;
2matrix.renderBitmap(frame, 8, 12);

Questo metodo però richiede più memoria di quella necessaria. Anche se ogni LED ha bisogno solo di un singolo bit per memorizzare il suo stato, vengono usati per ognuno di esse otto bit (un byte). Il metodo più efficiente, in termini di memoria per memorizzare un fotogramma è utilizzare un array di interi a 32 bit, descritto di seguito.

Vedremo ora come realizzare uno o più fotogrammi, realizzazione che può anche essere svolta con il LED Matrix tool messo a disposizione da Arduino, ma al fine di comprenderne a pieno il funzionamento, consiglio di seguire le indicazioni che trovate di seguito.

La parte di programma che utilizza codici esadecimali e rappresenta l’immagine del cuore indicata sopra è:

1unsigned long frame[] = {
2  0x3184a444,
3  0x42081100,
4  0xa0040000
5};

Una variabile long senza segno contiene 32 bit, quindi per gestire 92 LED (bit) avremo necessità di 96/32 che corrisponde a 3 variabili long in grado di rappresentare ogni immagine che appare sulla matrice di LED, pertanto un array di tre variabili long senza segno è un modo efficiente per contenere tutti i bit necessari per rappresentare un’immagine sulla matrice di LED.

Ma come sono relazionate la serie dei 3 valori esadecimali con la posizione di ogni songolo pixel?

Ciò dovrà essere fatto convertendo i valori esadecimali in binario utilizzando il codice che segue:

1for (int b = 0; b < 3; b++) {
2    Serial.println(frame[b], BIN);
3  }

Che permetterà di stampare tutti i valori dei bit dell’array. L’output sarà il seguente:

1110001100001001010010001000100
21000010000010000001000100000000
310100000000001000000000000000000

Questo metodo, però, non mostra tutti i bit. Ogni elemento dell’array deve avere 32 bit. Se completiamo correttamente, aggiungendo gli zeri mancanti alla fine avremo i 32 bit di ogni elemento:

100110001100001001010010001000100
201000010000010000001000100000000
310100000000001000000000000000000

Ora suddividiamo il blocco precedente in gruppi da 12 bit ed otterremo nuovamente l’immagine del cuore:

1001100011000
2010010100100
3010001000100
4001000001000
5000100010000
6000010100000
7000001000000
8000000000000

Se si hanno diversi fotogrammi, è possibile caricarli e visualizzarli in questo modo:

1const uint32_t felice[] = {
2    0x19819,
3    0x80000001,
4    0x81f8000
5};
6 
7const uint32_t cuore[] = {
8    0x3184a444,
9    0x44042081,
10    0x100a0040
11};
12 
13  matrix.loadFrame(felice);
14  delay(500);
15 
16  matrix.loadFrame(cuore);
17  delay(500);

Proviamo il codice

Applichiamo questi concetti con due sketch che visualizzano fotogrammi diversi sulla tua scheda.

Esempio 01

Creiamo prima 3 fotogrammi interi a 32 bit e carichiamoli sulla scheda uno alla volta.

1#include "Arduino_LED_Matrix.h"
2 
3ArduinoLEDMatrix matrix;
4 
5void setup() {
6  Serial.begin(115200);
7  matrix.begin();
8}
9 
10const uint32_t felice[] = {
11    0x19819,
12    0x80000001,
13    0x81f8000
14};
15const uint32_t cuore[] = {
16    0x3184a444,
17    0x44042081,
18    0x100a0040
19};
20   
21void loop(){
22  matrix.loadFrame(felice);
23  delay(500);
24 
25  matrix.loadFrame(cuore);
26  delay(500);
27}

Lo sketch è molto semplice è permette di mostrate due stati diversi.

Esempio 02

Cambiamo ora approccio è creiamo un’immagine che cambia durante l’esecuzione del programma. Il programma include diverse funzioni che concorrono alla costruzione del volto e modificano alcuni pixel che permettono di fare l’occhiolino dall’occhio sinistro.

1#include "Arduino_LED_Matrix.h"
2 
3ArduinoLEDMatrix matrix;
4 
5void setup() {
6  Serial.begin(115200);
7  matrix.begin();
8}
9 
10uint8_t frame[8][12] = {
11  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
12  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
13  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
14  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
15  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
16  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
17  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
18  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
19};
20 
21void occhioSinistro() {
22  //Occhio sinistro
23  frame[1][3] = 1;
24  frame[1][4] = 1;
25  frame[2][3] = 1;
26  frame[2][4] = 1;
27}
28 
29void occhiolino() {
30  //Fare un occhiolino con occhio sinistro
31  frame[1][3] = 0;
32  frame[1][4] = 0;
33  frame[2][3] = 1;
34  frame[2][4] = 1;
35}
36 
37void occhioDestro() {
38  //Occhio destro
39  frame[1][8] = 1;
40  frame[1][9] = 1;
41  frame[2][8] = 1;
42  frame[2][9] = 1;
43}
44 
45void bocca() {
46  //Bocca
47  frame[5][3] = 1;
48  frame[5][9] = 1;
49  frame[6][3] = 1;
50  frame[6][4] = 1;
51  frame[6][5] = 1;
52  frame[6][6] = 1;
53  frame[6][7] = 1;
54  frame[6][8] = 1;
55  frame[6][9] = 1;
56}
57 
58void loop() {
59  occhioSinistro();
60  occhioDestro();
61  bocca();
62 
63  matrix.renderBitmap(frame, 8, 12);
64 
65  delay(1000);
66  occhiolino();
67 
68  matrix.renderBitmap(frame, 8, 12);
69  delay(1000);
70}

Esempio 03

Vediamo ora come, usando il LED Matrix tool, possono essere realizzati due visi sorridenti di cui uno che fa l’occhiolino.
Lascio a voi capire come usare gli strumenti da disegno, essenziale però descrivervi come effettuare il download dei frame.
Costruire due immagini una che riporta un viso con sorriso e l’altra un viso con sorriso che fa l’occhiolino:

Esportare il codice:

aprire il file scaricato: animazione.h ed includerlo all’interno del codice:

1#include "Arduino_LED_Matrix.h"
2#include <stdint.h>
3 
4ArduinoLEDMatrix matrix;
5 
6const uint32_t animazione[][4] = {
7    // viso sorridente - frame n. 0
8  {
9        0x18c18,
10        0xc0000000,
11        0x1041fc,
12        66
13    },
14  // viso sorridente con occhiolino - frame n. 1
15    {
16        0xc18,
17        0xc0000000,
18        0x1041fc,
19        66
20    }
21};
22 
23void setup() {
24  // inizializzazione della seriale
25  Serial.begin(115200);
26  // avvio della matrice di LED
27  matrix.begin();
28}
29 
30void loop() {
31  // caricamento dalla prima animazione e visualizzazione su display
32  matrix.loadFrame(animazione[0]);
33  // attesa di 1 secondo
34  delay(1000);
35 
36  // caricamento dalla seconda animazione e visualizzazione su display
37  matrix.loadFrame(animazione[1]);
38  // attesa di 1 secondo
39  delay(1000);
40}

Esempio 04

Vediamo ora come sincronizzare la visualizzazione alternata delle due immagini con il lampeggio del LED L. Nel setup() bisognerà impostare il pin a cui è connesso il LED L ad output, dopo di che richiamare accensione e spegnimento eattamente nella stessa posizione in cui viene richiamata la funzione matrix.loadFrame():

1#include "Arduino_LED_Matrix.h"
2#include <stdint.h>
3 
4ArduinoLEDMatrix matrix;
5 
6const uint32_t animazione[][4] = {
7    // viso sorridente - frame n. 0
8  {
9        0x18c18,
10        0xc0000000,
11        0x1041fc,
12        66
13    },
14  // viso sorridente con occhiolino - frame n. 1
15    {
16        0xc18,
17        0xc0000000,
18        0x1041fc,
19        66
20    }
21};
22 
23void setup() {
24  // inizializzazione della seriale
25  Serial.begin(115200);
26  // avvio della matrice di LED
27  matrix.begin();
28  // pin a cui collegato il LED L (pin 13) impostato come output
29  pinMode(LED_BUILTIN, OUTPUT);
30}
31 
32void loop() {
33  // caricamento dalla prima animazione e visualizzazione su display
34  matrix.loadFrame(animazione[0]);
35  // accensione del LED L
36  digitalWrite(LED_BUILTIN, HIGH);
37  // attesa di 1 secondo
38  delay(1000);
39 
40  // caricamento dalla seconda animazione e visualizzazione su display
41  matrix.loadFrame(animazione[1]);
42  // spegnimento del LED L
43  digitalWrite(LED_BUILTIN, LOW);
44  // attesa di 1 secondo
45  delay(1000);
46}

Buon Making a tutti 🙂

Iniziare con Arduino UNO R4 WiFi

Per utilizzare Arduino UNO R4 WiFi è indispensabile prima di procedere con la programmazione, installare il pacchetto software per la gestione della scheda che fa parte del core Arduino Uno R4. Per l’installazione del del pacchetto software è necessario utilizzare l’Arduino IDE.

Il breve tutorial è tratto dal reference ufficiale di Arduino.cc a cui ho apportato alcune modifiche. L’installazione è stata eseguita utilizzando l’IDE 2.1.1.

Non dettaglierò la modalità di installazione dell’IDE che demando al tutorial ufficiale che potete leggere sul sito Arduino, vedremo in questo primo tutorial l’installazione del pacchetto software che consente l’utilizzo della scheda.

Installazione pacchetto software della scheda

Per l’installazione aprire il “Board Manager” dal menù di sinistra, nel campo di ricerca inserire UNO R4 ed installare l’ultima versione (o la versione che volete usare).



Collegate tramite il connettore USB C la scheda al computer e dall’IDE, dal menù a discesa come indicato dall’immagine selezionate la scheda Arduino UNO R4 WiFi.

Non appena avrete selezionato la scheda Arduino UNO R4 WiFi, dal menù File > Examples potrete selezionare una serie di esempi che non richiedono l’installazione di librerie esterne:

Dovreste aver notato che all’avvio che sull’Arduino UNO R4 WiFi verrà eseguito il programma Tetris la cui animazione termina con la visualizzazione di un cuore, se desiderate prelevare lo sketch seguite il link.

Se siete arrivati a questo punto siete pronti per iniziare le vostre sperimentazioni.

Per salutarci vi lascio in allegato lo sketch in cui viene mostrata sulla matrice di LED una faccina che ride che fa l’occhiolino, nella prossime lezione ve ne spiegherò il funzionamento e vedremo come sfruttare al meglio questa nuova caratteristica di Arduino UNO R4.

1#include "Arduino_LED_Matrix.h"
2#include <stdint.h>
3 
4ArduinoLEDMatrix matrix;
5 
6const uint32_t sorriso[] = {
7  0x19819,
8  0x80000000,
9  0x2041f8,
10};
11 
12const uint32_t sorriso_occhilino[] = {
13  0x19818,
14  0x0,
15  0x2041f8,
16};
17 
18void setup() {
19  Serial.begin(115200);
20  matrix.begin();
21  pinMode(LED_BUILTIN, OUTPUT);
22}
23 
24void loop() {
25  matrix.loadFrame(sorriso);
26  digitalWrite(LED_BUILTIN, HIGH);
27  delay(500);
28 
29  matrix.loadFrame(sorriso_occhilino);
30  digitalWrite(LED_BUILTIN, LOW);
31  delay(500);
32}

Buon Making a tutti 🙂

Arduino UNO R4 WiFi e Minima

Con l’introduzione della nuova release Arduino UNO R4 è stata compiuta senza alcun dubbio un’evoluzione tecnologica che non rappresenta solamente un avanzamento considerevole in termini di capacità di elaborazione e di connessione, ma inaugura anche una nuova era nel panorama dell’elettronica del fai da te.

Sono ormai passati 13 anni dal lancio di Arduino UNO R3, ora la versione R4 arriva per rivoluzionare il nostro approccio alla prototipazione, alla produzione, all’innovazione, ma soprattutto dal mio punto di vista una grande possibilità didattica.

Arduino UNO R4 innalza le potenzialità di prototipazione con un microcontrollore Renesas RA4M1 (Arm® Cortex®-M4) a 32 bit, ed un incremento della memoria 16 volte superiore al suo predecessore. UNO R4 viene proposto in due versioni: UNO R4 Minima e UNO R4 WiFi.

Arduino UNO R4 WiFi

(scheda tecnica ufficiale)

Il modello WiFi R4 conserva l’aspetto fisico di una classica Arduino UNO, così come la tensione operativa di 5 V prevista dalla maggioranza degli shields, ma su di essa troviamo il WiFi è integrato gestito da un coprocessore ESP32-S3, che permette anche connessioni Bluetooth/BLE.

Tra i vari miglioramenti troviamo una porta USB-C per la programmazione e le funzionalità HID (Human Interface Devices), permettendo quindi l’utilizzo di un Arduino UNO R4 come una tastiera o un mouse. Molto interessante la presenza di un connettore QWIIC per un collegamento I2C agevole a sensori e attuatori che rispettano questo standard di comunicazione senza la necessità di shields o breadboard.

Ben visibile nell’area sottostante della scheda una matrice di LED 12×8 che permette di disporre di un sistema di output integrato in grado di visualizzare in modo schematico (pixel) animazioni di caratteri alfanumerici e icone ed inoltre, grazie al software online LED Matrix Editor, messo a disposizione di Arduino è possibile realizzare la propria grafica pixel da includere nei propri sketch.

Di seguito elencate tutte le nuove caratteristiche della versione WiFi

  • Compatibilità hardware con il formato UNO: viene conservata la stessa struttura, l’organizzazione dei pin e la tensione operativa a 5 V della versione R3, assicurando così una totale compatibilità senza inconvenienti per le schede e i progetti preesistenti.

  • Memoria più ampia e clock più rapido: memoria ampliata (256 kB Flash, 32 kB RAM) e velocità di clock superiore (45MHz), permettendo elaborazioni più rapide e una gestione fluida di progetti anche sofisticati.

  • Alimentazione estesa fino a 24 V: la scheda supporta un intervallo più vasto di tensioni di alimentazioni d’ingresso, permettendo un’integrazione migliore con motori, strisce LED e altri attuatori mediante un’unica fonte di alimentazione.

  • Wi-Fi® e Bluetooth®: la scheda incorpora un modulo ESP32-S3, permettendo l’integrazione di connettività wireless nei propri progetti e la gestione remota attraverso Arduino IoT Cloud.

  • Periferiche aggiuntive incorporate: un DAC a 12 bit rende possibile la creazione di progetti audio complessi, CAN BUS e un OP AMP, fornendo una capacità di progettazione e una flessibilità accresciute.

  • Supporto HID: grazie al supporto HID incorporato, sarà possibile emulare un mouse o una tastiera quando è connesso a un computer via USB, agevolando l’invio di comandi da tastiera e movimenti del mouse.

  • Connettore QWIIC: un connettore Qwiic I2C, permette con estrema facilità l’interconnessione di sensori ed attuatori I2C in una modalità standard e sicura.

  • Supporto per RTC alimentato a batteria: sulla scheda sono incorporati pin supplementari, tra cui un pin “OFF” per spegnere la scheda e un pin “VRTC” per garantire l’alimentazione e il funzionamento dell’orologio in tempo reale integrato.

  • Matrice LED: matrice LED rossa 12×8, permette la visualizzazione di animazioni o visualizzazione di dati da sensori, evitando la necessità di hardware supplementare.

  • Diagnosi degli errori durante l’esecuzione: Arduino UNO R4 Wi-Fi dispone di un sistema di identificazione degli errori che rileva i crash durante l’esecuzione e fornisce descrizioni approfondite e consigli relativi alla riga di codice che ha provocato il crash.

Specifiche tecniche

Scheda Nome Arduino® UNO R4 WiFi
SKU ABX00087
Microcontrollore Renesas RA4M1 (Arm® Cortex®-M4)
Modulo radio ESP32-S3-MINI-1-N8
USB USB-C® Porta di programmazione
Pin I/O Digitali 14
Pin Analogici 6
DAC 1
pin PWM 6
Comunicazione UART 1
I2C 1
SPI 1
CAN 1
Tensione di funzionamento Tensione operativa 5 V (ESP32-S3 is 3.3 V)
Tensione di alimentazione (VIN) 6-24 V
Corrente continua per i pin I/O 8 mA
Velocità di clock RA4M1 48 MHz
ESP32-S3-MINI-1-N8 fino a 240 MHz
Memoria RA4M1 256 kB Flash, 32 kB RAM
ESP32-S3-MINI-1-N8 384 kB ROM, 512 kB SRAM
Dimensioni Larghezza 68.85 mm
Lunghezza 53.34 mm

IMPORTANTE

Connettore ESP: il modulo ESP32-S3 su questa scheda funziona a 3,3 V. Il connettore ESP, situato vicino al connettore USB-C®, supporta solo i 3,3 V e non deve essere collegato a 5 V. Ciò potrebbe danneggiare la tua scheda.

Connettore Qwiic: il connettore Qwiic è collegato a un bus I2C secondario: IIC0. Questo connettore supporta solo i 3,3 V, collegare tensioni superiori potrebbe danneggiare la scheda. Per inizializzare questo bus usare l’istruzione Wire1.begin().

Assorbimento massimo di corrente per pin: l’assorbimento massimo di corrente per ogni pin della GPIO della serie UNO R4 è di 8 mA, quindi inferiore rispetto alle versioni R3 precedente. Superare questo limite potrebbe danneggiare il pin o la scheda.

Arduino UNO R4 Minima

(scheda tecnica ufficiale)

Le caratteristiche tecniche differiscono per l’assenza rispetto alla versione WiFi:

  • della matrice di LED
  • porta QWIIC

però su questa scheda è dotata di un connettore SWD, assente nella versione WiFi che permette la connessione esterna di un debugger per controllare il funzionamento di uno sketch in condizioni controllate e rilevare quindi errori o più semplicemente verificare lo stato del programma in tempo reale (variabili, memoria usata, ecc…)

Specifiche tecniche

Scheda Nome Arduino® UNO R4 WiFi
SKU ABX00080
Microcontrollore Renesas RA4M1 (Arm® Cortex®-M4)
Modulo radio ESP32-S3-MINI-1-N8
USB USB-C® Porta di programmazione
Pin I/O Digitali 14
Pin Analogici 6
DAC 1
pin PWM 6
Comunicazione UART 1
I2C 1
SPI 1
CAN 1
Tensione di funzionamento Tensione operativa 5 V (ESP32-S3 is 3.3 V)
Tensione di alimentazione (VIN) 6-24 V
Corrente continua per i pin I/O 8 mA
Velocità di clock RA4M1 48 MHz
ESP32-S3-MINI-1-N8 fino a 240 MHz
Memoria RA4M1 256 kB Flash, 32 kB RAM
ESP32-S3-MINI-1-N8 384 kB ROM, 512 kB SRAM
Dimensioni Larghezza 68.85 mm
Lunghezza 53.34 mm

IMPORTANTE

Anche per la versione Minima l’assorbimento massimo di corrente per pin: l’assorbimento massimo di corrente per ogni pin della GPIO della serie UNO R4 è di 8 mA, quindi inferiore rispetto alle versioni R3 precedente. Superare questo limite potrebbe danneggiare il pin o la scheda.