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:
#include "Arduino_LED_Matrix.h"
  1. creazione dell’oggetto matrix aggiungendo la seguente riga:
ArduinoLEDMatrix matrix;

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

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

Il codice di avvio sarà il seguente:

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

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

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:

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 }
};

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:

frame[2][1] = 1;
matrix.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 è:

unsigned long frame[] = {
  0x3184a444,
  0x42081100,
  0xa0040000
};

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:

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

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

110001100001001010010001000100
1000010000010000001000100000000
10100000000001000000000000000000

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:

00110001100001001010010001000100
01000010000010000001000100000000
10100000000001000000000000000000

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

001100011000
010010100100
010001000100
001000001000
000100010000
000010100000
000001000000
000000000000

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

const uint32_t felice[] = {
    0x19819,
    0x80000001,
    0x81f8000
};

const uint32_t cuore[] = {
    0x3184a444,
    0x44042081,
    0x100a0040
};

  matrix.loadFrame(felice);
  delay(500);

  matrix.loadFrame(cuore);
  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.

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

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

const uint32_t felice[] = {
    0x19819,
    0x80000001,
    0x81f8000
};
const uint32_t cuore[] = {
    0x3184a444,
    0x44042081,
    0x100a0040
};
  
void loop(){
  matrix.loadFrame(felice);
  delay(500);

  matrix.loadFrame(cuore);
  delay(500);
}

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.

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

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

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

void occhioSinistro() {
  //Occhio sinistro
  frame[1][3] = 1;
  frame[1][4] = 1;
  frame[2][3] = 1;
  frame[2][4] = 1;
}

void occhiolino() {
  //Fare un occhiolino con occhio sinistro
  frame[1][3] = 0;
  frame[1][4] = 0;
  frame[2][3] = 1;
  frame[2][4] = 1;
}

void occhioDestro() {
  //Occhio destro
  frame[1][8] = 1;
  frame[1][9] = 1;
  frame[2][8] = 1;
  frame[2][9] = 1;
}

void bocca() {
  //Bocca
  frame[5][3] = 1;
  frame[5][9] = 1;
  frame[6][3] = 1;
  frame[6][4] = 1;
  frame[6][5] = 1;
  frame[6][6] = 1;
  frame[6][7] = 1;
  frame[6][8] = 1;
  frame[6][9] = 1;
}

void loop() {
  occhioSinistro();
  occhioDestro();
  bocca();

  matrix.renderBitmap(frame, 8, 12);

  delay(1000);
  occhiolino();

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

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:

#include "Arduino_LED_Matrix.h"
#include <stdint.h>

ArduinoLEDMatrix matrix;

const uint32_t animazione[][4] = {
	// viso sorridente - frame n. 0
  {
		0x18c18,
		0xc0000000,
		0x1041fc,
		66
	},
  // viso sorridente con occhiolino - frame n. 1
	{
		0xc18,
		0xc0000000,
		0x1041fc,
		66
	}
};

void setup() {
  // inizializzazione della seriale
  Serial.begin(115200);
  // avvio della matrice di LED
  matrix.begin();
}

void loop() {
  // caricamento dalla prima animazione e visualizzazione su display
  matrix.loadFrame(animazione[0]);
  // attesa di 1 secondo
  delay(1000);

  // caricamento dalla seconda animazione e visualizzazione su display
  matrix.loadFrame(animazione[1]);
  // attesa di 1 secondo
  delay(1000);
}

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():

#include "Arduino_LED_Matrix.h"
#include <stdint.h>

ArduinoLEDMatrix matrix;

const uint32_t animazione[][4] = {
	// viso sorridente - frame n. 0
  {
		0x18c18,
		0xc0000000,
		0x1041fc,
		66
	},
  // viso sorridente con occhiolino - frame n. 1
	{
		0xc18,
		0xc0000000,
		0x1041fc,
		66
	}
};

void setup() {
  // inizializzazione della seriale
  Serial.begin(115200);
  // avvio della matrice di LED
  matrix.begin();
  // pin a cui collegato il LED L (pin 13) impostato come output
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  // caricamento dalla prima animazione e visualizzazione su display
  matrix.loadFrame(animazione[0]);
  // accensione del LED L
  digitalWrite(LED_BUILTIN, HIGH);
  // attesa di 1 secondo
  delay(1000);

  // caricamento dalla seconda animazione e visualizzazione su display
  matrix.loadFrame(animazione[1]);
  // spegnimento del LED L
  digitalWrite(LED_BUILTIN, LOW);
  // attesa di 1 secondo
  delay(1000);
}

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.

#include "Arduino_LED_Matrix.h"
#include <stdint.h>

ArduinoLEDMatrix matrix;

const uint32_t sorriso[] = {
  0x19819,
  0x80000000,
  0x2041f8,
};

const uint32_t sorriso_occhilino[] = {
  0x19818,
  0x0,
  0x2041f8,
};

void setup() {
  Serial.begin(115200);
  matrix.begin();
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  matrix.loadFrame(sorriso);
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);

  matrix.loadFrame(sorriso_occhilino);
  digitalWrite(LED_BUILTIN, LOW);
  delay(500);
}

Buon Making a tutti 🙂

Pensieri semplici – forse togliere lo smartwatch può aiutare

Sono arrivato in quel periodo dell’anno in cui uso togliere lo smartwatch e lo sostituisco in genere con un orologio analogico che mi indica solo data e ora. È un modo per distaccarmi dalla frenesia dell’informazione recapitata in tempo reale, del controllo della quantità di passi o del numero di battiti cardiaci. Necessità di vita slow. Questo atteggiamento è un’abitudine che in genere inizia con l’estate. In questi giorni riflettevo se non è il caso di togliere l’orologio in molte delle mie attività sia di lavoro che di studio o ancora di sport durante altri periodi dell’anno.

Il tempo e la sua gestione è qualcosa di cui discuto spesso con gli studenti: tempo dedicato allo studio, tempo per svolgere un progetto, tempo da dedicare allo sport, il tempo visto per giungere ad un risultato positivo per noi.

Ritengo che il successo di un qualsiasi tipo di allenamento sia esso fisico o mentale non si possa basare sul tempo che si trascorre ad allenarsi, ma piuttosto sul numero di esercitazioni di qualità e ripetizioni effettuate: in pratica, su quanti nuovi collegamenti mentali abbiamo sviluppato nel nostro cervello con l’allenamento.

Tutto ciò potrà sembrare un pensiero semplice ma scriverlo aiuta è ciò che ripeto ai ragazzi: “esplicita su carta l’idea, non vergognarti se qualcuno la riterrà semplice o infantile, la somma di mattoncini semplici di pensiero può far nascere soluzioni interessanti“.

Quindi esplicitiamo.
L’attività che voglio sperimentare su me stesso e successivamente con gli studenti, è quella di non misurare il tempo per svolgere l’attività, ma piuttosto impormi il numero di ripetizioni degli esercizi. Invece di pensare “Praticherò esercizi di apnea per 60 minuti”, dovrò dirmi “voglio eseguire almeno 5 percorsi da 50 metri di apnea in vasca“. Per un tennista potrei dire, invece di pianificare di colpire le palle per un’ora cercando di mantenerla in campo, puntare a realizzare venticinque colpi di alta qualità con la racchetta. Invece di studiare un libro di testo ed impormi di farlo in un’ora, forse è meglio creare delle flashcard e valutare gli sforzi fatti. Quindi forse meglio non farsi prendere dall’ansia del trascorrere del tempo. Per innescare questo atteggiamento di studio forse, come spesso uso dire, potrebbe servire: “praticare il più possibile il minimalismo mentale” ovvero concentrarsi sull’essenziale, anche se solo per pochi minuti e calcolare i progressi in termini di ciò che realmente conta: sforzi e ripetizioni.

Qualcuno potrebbe dirmi: “ma non sei tu che parli della Tecnica del Pomodoro per studiare e lavorare?

Certo che sì, ma la tecnica del pomodoro serve per:

  • comprendere quanto tempo mi necessita per concludere un’attività;
  • per avere percezione di quanto tempo impiego per svolgere un’attività.

L’alternanza di tempi di lavoro e pause imposti del metodo, serve per aumentare la concentrazione, ridurre distrazioni e stanchezza, non nasce solo per avere un timer che ci ricorda quanto tempo stiamo dedicando all’attività. Imparerò a prevedere tempi e sforzi per svolgere uno specifico lavoro, sarà quindi con l’esercizio che capirò, in anticipo, in una fase successiva, quanto tempo serve per svolgere una specifica attività.

Quindi:

  • orologio sì, per imparare a gestire tempi e sforzi e ridurre ansia e stanchezza;
  • orologio no, per imporci di svolgere l’attività entro un certo tempo.

Se poi a qualcuno gli venisse in mente di dirmi: “si però io potrei avere dei vincoli di tempo per svolgere l’attività

Io risponderei che ogni studente ha tempi e modi diversi per apprendere quindi non ha alcun senso imporre l’uso di un orologio per standardizzare la lunghezza delle fasi di studio.

Quindi togliere l’ansia dai tempi della prestazione di studio è necessario per costruire una vera competenza, col tempo si imparerà a prevedere tempi e sforzi.

Come strutturare tutto ciò a scuola… datemi tempo che devo pensarci 😉

P.S. Il post è dedicato ad alcuni docenti un po’ sprovveduti che usano adottare, sia nella valutazione che nella gestione del tempo, un atteggiamento da “ragionieri” nei confronti degli studenti.

Buon Making mentale 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.

Costruiamo EduRobot Black Panther – kit robotico didattico multipiattaforma

Un robot che costa meno di un libro.

Al fine di supportare i colleghi che seguono i miei corsi, ho realizzato una struttura robotica che deriva da un precedente progetto che ho sviluppato per i miei studenti, si tratta della versione n. 6 del kit robotico che ho chiamato EduRobot, nominata “Black Panther”.

Ho pensato ad una struttura estremamente economica in cui, ad esclusione delle viti di serraggio delle varie parti, il resto dei materiali è costituito da schede di controllo, motori e sensori.

La struttura minima richiede almeno 3 livelli, ma è possibile innalzarla per aggiungere tutta l’elettronica necessaria per espandere le funzionalità del robot.

Tutti gli elementi sono stati stampati in 3D ed il materiale scelto è il PLA.

I costi complessivi di stampa, viti di serraggio e dadi, non supera i 10€.

Per prelevare i sorgenti per la stampa 3D seguire il link sulla mia pagina su Thingiverse.

Le funzioni che possono essere programmate sono le medesime dei più blasonati kit robotici in commercio, pertanto se la vostra scuola ha acquistato una stampante 3D, sarà sufficiente una manciata di elettronica a basso costo per realizzerete robot assolutamente inclusivo, sia per il portafoglio delle famiglie degli allievi che di quelle del docente.

Il cilindro di occupazione del robot ha un diametro di 135 mm e i motori sono esattamente centrati rispetto alla base del cilindro.

Per evitare spese aggiuntive al posto delle caster ball ho preferito utilizzare un elemento dotato di superficie curva, ovviamente tale elemento se lo desidera può essere sostituito da una caster ball metallica.

Sul terzo livello del robot sono stati già inseriti fori per fissare i microcontrollori: Arduino UNO R3 e BBC micro:bit e computer Raspberry Pi 3 o 4.

Sempre sul terzo livello nel caso si desidera utilizzare un BBC micro:bit, è possibile fissare una scheda motorbit.

Nel caso il controllo avvenisse con Arduino UNO R3 la scheda di controllo motori è costituita da un L298N che andrà impilato sulla scheda Arduino, secondo quanto indicato nel tutorial che segue.

Nei kit di base sul 3’ livello viene utilizzata una minibreadboard per facilitare la connessione tra i vari dispositivi elettronici.

Per entrambe le versioni il robot è dotato di un sensore ad ultrasuoni HC-SR04 fissato alla struttura. Per la valutazione della distanza dell’ostacolo si è preferito evitare l’utilizzo di un servomotore che facesse ruotare il sensore ad ultrasuoni al fine di ridurre i costi. La rotazione che valuta la distanza dell’ostacolo più vicino verrà svolta ruotando l’intero robot rispetto al suo baricentro.

Il robot è dotato di due sensori ad infrarossi da impiegare per la realizzazione di un robot segui linea.

Nella versione con scheda Arduino UNO R3 sarà possibile effettuare un controllo mediante scheda Bluetooth HC-05, il cui supporto potrà essere fissato sul terzo piano del robot.

Di seguito la lista dei materiali e le relative fotografie che ne dettagliano la costruzione delle parti meccaniche e delle schede, non viene dettagliata la connessione elettrica tra le parti e la programmazione, per ora riservato ai colleghi che frequentano o frequenteranno i miei corsi, ma molto probabilmente nel prossimo futuro, con un po’ di calma lavorativa estenderò a tutti la parte di spiegazione elettronica e programmazione.

Sto sviluppando corsi in cui mostro come, usando la medesima struttura robotica, sarà possibile controllare il robot mediante un Raspberry Pi oppure un Raspberry Pi Pico.

Per i colleghi insegnanti svolgerò nel prossimo futuro ulteriori corsi gratuiti a cui potrete iscrivervi attraverso la piattaforma ScuolaFutura, corsi che saranno svolti i diverse modalità: in presenza, MOOC e blended.

Per essere aggiornati sui progetti e sui corsi che svolgerò nel prossimo futuro vi invito ad iscrivervi al mio sito inserendo la vostra e-mail nel campo: “Iscriviti al blog tramite email” nella colonna destra in alto, in questo modo potrete essere aggiornati tempestivamente.

La sequenza di montaggio indicata di seguito è quella che secondo il mio parere vi consente di montare l’intera struttura in non più di 60 minuti, è essenziale però munirsi di cacciaviti a stella e pinza a becco lungo, ottimo sarebbe utilizzare un piccolo avvitatore.

In generale non è richiesta nessuna saldatura a stagno in quanto i motori (gialli) a 6V utilizzati possono essere acquistati anche con cavi già saldati, attenzione però che la connessione tra motore e cavi elettrici potrebbe essere delicata, pertanto si consiglia di serrare i cavi mediante una fascetta stringicavi, come dettagliato di seguito.

Se è necessario prolungare la lunghezza dei cavi è possibile adottare diversi metodi, quello che preferisco è l’utilizzo di connettori wago che possono essere acquistati con diverso numero di fori, nel caso di questo kit robot sono sufficienti wago da 3 fori.

Ovviamente, nel caso di rotture o disconnessione dei cavi dai poli del robot bisognerà per forza ricorrere alla saldatura a stagno. 

La fotografia che segue mostra tutti gli elementi da stampare in 3D per le due versioni di robot.

Di seguito elenco materiali e sequenza di montaggio.

Continua a leggere