Archivi categoria: arduino

EduRobot 4WD – Bluetooth

Alcuni lettori hanno notato nella lezione in cui ho condiviso i sorgenti per la stampa 3D del robot, che la scheda motori utilizzata è una Adafruit Motor Shield V01 e mi è stato fatto notare che esiste la V02 della scheda, quindi perché ho usato la versione precedente? La risposta non è tecnica ma economica, ho acquistato ad un prezzo interessante, su uno store cinese, una grande quantità di queste schede che poi ho usato per i miei corsi. Ovviamente nulla vieta che voi possiate utilizzare una qualsiasi altra scheda, la logica di programmazione è la medesima, ma certamente varieranno il nome delle istruzioni che controllano il motore, se avete necessità contattatemi.

Lista componenti

  • N. 1 Arduino UNO R3
  • N. 1 Adafruit Motor Shield V01
  • Modulo Bluetooth HC05
  • N. 4 Motori DC 6V
  • N. 4 Ruote

Di seguito trovate i collegamenti elettrici effettuati e il primo sketch di esempio con cui parto per svolgere le successive esercitazioni. Per gli allievi e i docenti che si iscriveranno ai miei corsi darò ulteriori esempi e spiegazioni.

Lo shield per il controllo motori può gestire fino a 4 motori DC in entrambe le direzioni, ciò vuol dire che possono essere azionati sia in avanti che all’indietro. La velocità può anche essere variata con incrementi dello 0,5% utilizzando PWM integrato sulla scheda, ciò permetterà un movimento uniforme e non brusca del robot.

Il ponte H presente sulla scheda può pilotare carichi NON superiori ai 0,6A o che hanno picchi di richiesta corrente NON superiori a 1,2A, quindi utilizzate questa scheda per piccoli motori, i classici motori gialli da 6V vanno più che bene.

Collegamento motori allo shield Arduino Motor Driver

Come indicato nell’immagine che segue è molto semplice:
– saldate due cavi al motorino (in commercio trovate motori con fili saldati)
– collegate i motori ai morsetti: M1, M2, M3 o M4.

Collegamento scheda Bluetooth HC-05 allo shield Arduino Motor Driver

Come sicuramente saprete, il modulo Bluetooth HC-05 permette di convertire una porta seriale UART in una porta Bluetooth e la utilizzeremo per inviare su seriale i caratteri selezionati da una specifica app Android, per comandare direzione e velocità dei motori del robot.

I collegamenti sono:

HC05 <-> Arduino Motor Driver
RX - Pin 1
TX - Pin 0
G - GND
V - +5V

Orientamento ruote.

Collegamento motori M1 e M2.

Collegamento motori M3 e M4.

Modulo Bluetooth HC-05.

Connessione dei pin RX e TX del modulo Bluetooth HC-05 alla seriale di Arduino (pin 0 e pin 1).

Alimentazione del modulo Bluetooth HC-05 attraverso lo shield.

Alimentazione dello shield.

Continua a leggere

EduRobot 4WD – stampare e costruire il robot

Avevo promesso qualche mese fa che avrei rilasciato i sorgenti grafici di EduRobot 4WD e lo scorso giugno studenti di alcune scuole italiane mi hanno chiesto la cortesia di rendere disponibili i sorgenti per la stampa 3D. Gli impegni di fine anno non mi hanno permesso di essere celere nella pubblicazione e visto che domani è l’inizio di un nuovo anno scolastico rendo disponibile la semplice base robotica in modo che possa essere utilizzata e spero anche migliorata dagli allievi.

Ma qual è l’idea progettuale di base di EduRobot 4WD?

Come ribadito nel post di presentazione di EduRobot 4WD, durante le attività laboratoriali di robotica con studenti e docenti, spesso la costruzione della parte meccanica richiede molta attenzione e tempo. Per questo motivo, ho deciso di realizzare un design semplice, ma funzionale, su cui poter facilmente integrare qualsiasi sistema di controllo elettronico. Pertanto per rendere la programmazione più stimolante e varia, ho progettato un robot 4WD che può avere diverse funzionalità: può essere comandato via Bluetooth o WiFi, può operare autonomamente, seguire persone, reagire alla luce, rilevare gas, seguire una linea, o ancora rispondere ai comandi vocali.

In questa struttura le parti che necessitano di solidità sono vincolate da viti metalliche mentre i circuiti di controllo e le batterie di alimentazione sono fissate con velcro a forte tenuta. L’utilizzo del velcro è stata una soluzione che mi ha permesso di ridurre le fasi di assemblaggio e di modifica della struttura. Ovviamente una struttura di questo genere non è cosa nuova, potete ritrovare design simili realizzati in compensato o in plexiglass su cui ad esempio i motori sono vincolati con colla a caldo, ma ciò ovviamente non permette di riutilizzare velocemente i motori per altre esercitazioni; inoltre le forcelle che vincolano i motori possono essere riutilizzati anche in altri kit che ho sviluppato, si veda ad esempio EduRobot Black Panther.

In questo modello, gli elementi che richiedono maggiore robustezza sono assicurati con viti metalliche, mentre i circuiti di controllo e le batterie di alimentazione sono fissate con velcro a forte tenuta. La scelta del velcro ha notevolmente semplificato e velocizzato le fasi di assemblaggio e modifica. Ovviamente una struttura di questo genere non è cosa nuova, potete ritrovare design simili realizzati in compensato o del plexiglass in cui ad esempio i motori sono vincolati con colla a caldo, ma ciò ovviamente non permette di riutilizzare velocemente i motori per altre esercitazioni; inoltre le forcelle che vincolano i motori possono essere riutilizzati anche in altri kit che ho sviluppato, si veda ad esempio EduRobot Black Panther.

La sequenza di assemblaggio è estremamente semplice, bisogna porre attenzione solo all’orientamento dei motori, ma le foto che seguono mostrano tutti i dettagli che vi permetteranno di assemblare il robot in circa 15 minuti.

Nelle foto potete vedere le due versioni:

  • controllo remoto Bluetooth
  • segui linea

Non posso mostrarvi la versione WiFi e con telecamera in quanto in questo momento sono disassemblati.

Ovviamente se serve, con piccole modifiche, potrete realizzare una versione a più livelli in modo da aggiungere tutti i circuiti che vi servono.

Per prelevare i sorgenti grafici seguire il link su Thingiverse.

Versione Bluetooth

Complessivo.

Vista motori.

Dettaglio forcella motori.

Dettaglio sensore Bluetooth.

Continua a leggere

Realizziamo un orologio con l’RTC di Arduino UNO R4 WiFi

Arduino UNO R4 WiFi possiede un RTC interno facilmente programmabile che ci consentirà di mantenere costantemente traccia dell’ora e della data corrente.

Per chi ha iniziato da poco le sperimentazioni elettroniche ricordo che un Real-Time Clock (RTC), o Orologio in Tempo Reale, è un tipo di orologio costituito da un circuito elettronico utilizzato per tracciare il tempo in tempo reale. Questo significa che tiene traccia del giorno della settimana, della data e dell’ora corrente, dei minuti, dei secondi, proprio come un orologio normale, inoltre è possibile impostare un RTC per gestire l’ora legale e l’ora solare.

Nelle versione precedente di Arduino, UNO R3 non era presente un RTC pertanto bisognava utilizzare un apposito circuito elettronico esterno così come dettagliato nel post su questo sito: Utilizzare un orologio RTC con Arduino – Modulo Tiny RTC I2C, modulo RTC dotato di un integrato DS1307 cuore fondamentale della scheda.

L’utilizzo dell’RTC su Arduino UNO R4 WiFi avviene utilizzando la libreria RTC che consente di impostare oppure ottenere l’orario o ancora gestire allarmi per attivare interrupt.

Come accennato ad inizio post l’RTC integrato dispone di un pin VRTC, che viene utilizzato per mantenere in funzione l’RTC, anche quando l’alimentazione della scheda viene interrotta. Per utilizzare questa funzione è sufficiente fornire una tensione compresa tra 1,6 e 3,6 V al pin VRTC. In un post successivo mostrerò come utilizzare il pin VRTC.

Facendo riferimento agli esempi disponibili sul sito Arduino e nell’IDE analizziamo le fasi di configurazione dell’RTC.

Impostazione della data e dell’ora

RTCTime startTime(01, Month::AUGUST, 2023, 20, 49, 00, DayOfWeek::TUESDAY, SaveLight::SAVING_TIME_ACTIVE)

RTC.setTime(startTime)

Per impostare l’orario bisogna creare un oggetto RTCTime, in cui deve essere specificato il giorno, il mese, l’anno, l’ora, il minuto, il secondo, il giorno della settimana e l’attivazione dell’ora legale se prevista nella nazione in cui si sta utilizzando la scheda, quindi per impostare l’orario bisogna usare il metodo startTime.

Per chi incomincia con la programmazione il concetto di metodo appartiene alla programmazione ad orientata agli oggetti come ad esempio in C++, quando si programma in C è meglio parlare di funzione, ma spesso i due concetti vengono usati in modo alternativo.

Il primo sketch non fa altro che impostare l’ora corrente:

// inclusione della libreria RTC
#include "RTC.h"

void setup() {

  // impostazione della velocità della serial monitor
  Serial.begin(9600);

  // avvio dell'RTC
  RTC.begin();

  // creazione dell'oggetto RTCTime (possiamo assegnare un nome a piacimento)
  // data del giorno, mese, anno, ore, minuti, secondi, giorno della settimana, attivazione passaggio all'ora legale
  RTCTime startTime(2, Month::AUGUST, 2023, 9, 15, 00, DayOfWeek::WEDNESDAY, SaveLight::SAVING_TIME_ACTIVE);

  // impostazione dell'RTC con la data e lora configurate per RTCTime
  RTC.setTime(startTime);
}

// il loop non contiene nulla
void loop() {
}

Continua a leggere

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

// Prof. Maffucci Michele
// 31/07/23
// Visualizzazione livello luminoso su matrice LED Uno R4 WiFi
// con calibrazione sensore e visualizzazione timer di calibrazione
// con l'accensione di 5 LED della matrice

// Esercizio 01

// inclusione della libreria per la gestione della matrice
#include "Arduino_LED_Matrix.h"

// creazione dell’oggetto matrix
ArduinoLEDMatrix matrix;

// inizializzazione dell'array per inizializzare lo stato della matrice
uint8_t frame[8][12] = { 0 };

// pin a cui collegare il sensore
int pinSensore = A0;

// variabile in cui memorizzare il valore letto dal sensore
int valoreSensore = 0;

// variabili per calibrazione lovello minimo e massimo luce ambiente
int sensoreMin = 1023;  // valore minimo sensore
int sensoreMax = 0;     // valore massimo sensore

// contatore passi di calibrazione
int contatore = 0;

// valore del millis al passo precedente
unsigned long millisPrecedente = 0;
// valore del millis attuale
unsigned long millisCorrente = 0;

// intervallo in millisecondi per l'accensione di una riga di LED
const long intervallo = 1000;

// riga LED precedentemente accesa
int precedenteLivello = 0;

void setup() {
  // inizializzazione della velocità della serial monitor
  Serial.begin(115200);

  // avvio della matrice di LED
  matrix.begin();

  // calibrazione del sensore nei primi 5 secondi di avvio di Arduino
  while (millis() < 5000) {

    // memorizzazione dle valore attuale del millis
    millisCorrente = millis();

    // lettura valore
    valoreSensore = analogRead(pinSensore);

    // registra il valore massimo rilevato dal sensore
    if (valoreSensore > sensoreMax) {
      sensoreMax = valoreSensore;
    }

    // registra il valore minimo rilevato dal sensore
    if (valoreSensore < sensoreMin) {
      sensoreMin = valoreSensore;
    }

    // timer
    if (millisCorrente - millisPrecedente >= intervallo) {
      millisPrecedente = millisCorrente;
      frame[7][contatore] = 1;
      matrix.renderBitmap(frame, 8, 12);
      contatore++;
    }
  }
  // accensione dell'ultimo LED al 5' secondo
  frame[7][4] = 1;
  matrix.renderBitmap(frame, 8, 12);

  // attesa di 0,5 secondi prima di spegnere tutti i LED
  delay(500);

  // spegnimento di tutti i LED della matrice
  uint8_t frame[8][12] = { 0 };
  matrix.renderBitmap(frame, 8, 12);
}

// Accensione linee matrice (dalla riga 7)
// maggiore e' il valore numeriico di "livello" (riga LED) più bassa sarà l'intensità luminosa
// minore e' e' il valore numeriico di "livello" (riga LED) più alta sarà l'intensità luminosa

// Livello minimo di intensità = accensione della sola riga 7
// Livello massimo di intensità = accensione di tutte le linee della matrice

void barra(int livello) {
  // spegnimento della riga "livello"
  if (livello > precedenteLivello) {
    for (int y = livello; y >= precedenteLivello; y--) {
      // spegnimento dei 12 LED della riga "livello"
      for (int x = 0; x < 12; x++) {
        frame[y][x] = 0;
      }
      matrix.renderBitmap(frame, 8, 12);
      delay(1);
    }
    // accensione della riga "livello"
  } else {
    for (int y = 7; y >= precedenteLivello; y--) {
      for (int x = 0; x < 12; x++) {
        frame[y][x] = 1;
      }
      matrix.renderBitmap(frame, 8, 12);
      delay(1);
    }
  }
  precedenteLivello = livello;
}

void loop() {

  // per evitare sprechi di memoria viene utilizzata usata una stessa variabile: valoreSensore
  // per memorizzare ad ogni passo valori diversi

  // lettura del valore del sensore
  valoreSensore = analogRead(pinSensore);

  // Forzare il valore all'interno del valore minimo e del massimo nel caso di errori di lettura.
  // Nel caso non si aggiungesse il "constrain" nel caso di errore si blocca l'esecuzione
  valoreSensore = constrain(valoreSensore, sensoreMin, sensoreMax);

  // Il valore minimo di lettura è associato all'accensione della riga 7
  // quindi si rimappa tra 7 e 0
  valoreSensore = map(valoreSensore, sensoreMin, sensoreMax, 7, 0);

  // barra(valoreSensore) è la funzione che gestisce l'accensione delle linee di LED
  barra(valoreSensore);
}

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:

byte frame[8][12] = {
  { 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 },
  { 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0 },
  { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
  { 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
  { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};

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

uint8_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

// Prof. Maffucci Michele
// 27/07/23
// Blink striscia led (linea 7) su matrice
// Esercizio 01

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
  Serial.begin(115200);
  matrix.begin();
}

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

// accensione linea 7 della matrice
void barraOn() {
  //barra
  for (int x=0; x<12; x++){
    frame[7][x] = 1;
  }
}

// spegnimento linea 7 della matrice
void barraOff() {
  //barra
  for (int x=0; x<12; x++){
    frame[7][x] = 0;
  }
}

void loop() {
  barraOn();
  matrix.renderBitmap(frame, 8, 12);

  delay(1000);
  barraOff();

  matrix.renderBitmap(frame, 8, 12);
  delay(1000);
}

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.

// Prof. Maffucci Michele
// 27/07/23
// Accensione/spegnimento in una direzione striscia led (linea 7) su matrice
// Esercizio 02

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
  Serial.begin(115200);
  matrix.begin();
}

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

// accensione linea 7 della matrice
void barraOn() {
  for (int x=0; x<12; x++){
    frame[7][x] = 1;
    matrix.renderBitmap(frame, 8, 12);
    delay(100);
  }
}

// spegnimento linea 7 della matrice
void barraOff() {
  //barra
  for (int x=0; x<12; x++){
    frame[7][x] = 0;
    matrix.renderBitmap(frame, 8, 12);
    delay(100);
  }
}

void loop() {
  barraOn();
  barraOff();
}

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.

// Prof. Maffucci Michele
// 27/07/23
// Accensione/spegnimento in due direzioni striscia led (linea 7) su matrice
// Esercizio 03

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
  Serial.begin(115200);
  matrix.begin();
}

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

// accensione linea 7 della matrice
void barraOn() {
  for (int x=0; x<12; x++){
    frame[7][x] = 1;
    matrix.renderBitmap(frame, 8, 12);
    delay(100);
  }
}

// spegnimento linea 7 della matrice
void barraOff() {
  for (int x=11; x>=0; x--){
    frame[7][x] = 0;
    matrix.renderBitmap(frame, 8, 12);
    delay(100);
  }
}

void loop() {
  barraOn();
  barraOff();
}

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.

// Prof. Maffucci Michele
// 27/07/23
// Accensione/spegnimento in due direzioni (linea) BASSO>ALTO ALTO>BASSO matrice led
// Esercizio 04

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
  Serial.begin(115200);
  matrix.begin();
}

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

// accensione linea BASSO>ALTO (dalla linea 7)
void barraOn() {
  for (int y = 8; y >= 0; y--) {
    for (int x = 0; x < 12; x++) {
      frame[y][x] = 1;
    }
    matrix.renderBitmap(frame, 8, 12);
    delay(100);
  }
}

// spegnimento linea ALTO>BASSO (dalla linea 0)
void barraOff() {
  for (int y = 0; y <=8 ; y++) {
    for (int x = 11; x >= 0; x--) {
      frame[y][x] = 0;
    }
    matrix.renderBitmap(frame, 8, 12);
    delay(100);
  }
}

void loop() {
  barraOn();
  barraOff();
}

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.

// Prof. Maffucci Michele
// 27/07/23
// Accensione/spegnimento in due direzioni SX>DX DX>SX (partenza colonna 0) matrice led
// Esercizio 05

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
  Serial.begin(115200);
  matrix.begin();
}

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

// accensione colonna SX>DX (dalla colonna 0)
void barraOn() {
  for (int x = 0; x < 12; x++) {
    for (int y = 0 ; y < 8; y++) {
      frame[y][x] = 1;
    }
    matrix.renderBitmap(frame, 8, 12);
    delay(100);
  }
}

// spegnimento colonna DX>SX (dalla colonna 11)
void barraOff() {
  for (int x = 11; x >= 0 ; x--) {
    for (int y = 7 ; y >= 0; y--) {
      frame[y][x] = 0;
    }
    matrix.renderBitmap(frame, 8, 12);
    delay(100);
  }
}

void loop() {
  barraOn();
  barraOff();
}

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.

// Prof. Maffucci Michele
// 27/07/23
// Accensione e spegnimento sequenziale dall'alto al basso - matrice led
// Esercizio 06

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
  Serial.begin(115200);
  matrix.begin();
}

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

// puntino cadente
void puntino() {
  for (int x = 0; x < 12; x++) {
    for (int y = 0; y < 8; y++) {
      frame[y][x] = 1;
      matrix.renderBitmap(frame, 8, 12);
      delay(20);
      frame[y][x] = 0;
      matrix.renderBitmap(frame, 8, 12);
      delay(20);
    }
  }
}

void loop() {
  puntino();
}

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.

// Prof. Maffucci Michele
// 27/07/23
// Accensione e spegnimento sequenziale SX > DX dall'alto al basso - matrice led
// Esercizio 07

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
  Serial.begin(115200);
  matrix.begin();
}

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

// puntino cadente
void puntino() {
  for (int y = 0; y < 8; y++) {
    for (int x = 0; x < 12; x++) {
      frame[y][x] = 1;
      matrix.renderBitmap(frame, 8, 12);
      delay(20);
      frame[y][x] = 0;
      matrix.renderBitmap(frame, 8, 12);
      delay(20);
    }
  }
}

void loop() {
  puntino();
}

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.

// Prof. Maffucci Michele
// 27/07/23
// Puntino che rimbalza SX > DX - DX > SX - matrice led
// Esercizio 08

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
  Serial.begin(115200);
  matrix.begin();
}

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

// puntino rimbalza su riga 4
void puntinoSxDx() {
  for (int x = 0; x < 12; x++) {
    frame[4][x] = 1;
    matrix.renderBitmap(frame, 8, 12);
    delay(50);
    frame[4][x] = 0;
    matrix.renderBitmap(frame, 8, 12);
    delay(50);
  }
}

void puntinoDxSx() {
  for (int x = 11; x >= 0; x--) {
    frame[4][x] = 1;
    matrix.renderBitmap(frame, 8, 12);
    delay(50);
    frame[4][x] = 0;
    matrix.renderBitmap(frame, 8, 12);
    delay(50);
  }
}

void loop() {
  puntinoSxDx();
  puntinoDxSx();
}

Buon Making a tutti 🙂