Archivi categoria: arduino

In arrivo una nuova versione di EduRobot MicroMoto!

Da tempo avevo “nel pennino” un progetto che ancora non ho avuto modo di sviluppare pienamente: la realizzazione di una valigetta STEAM pensata per attività di Making didattico da utilizzare in più discipline.
Ora, grazie all’evoluzione di EduRobot MicroMoto, il progetto sta prendendo forma concreta.

Sto lavorando alla progettazione di una nuova versione di MicroMoto, realizzata in compensato: una struttura più solida e resistente rispetto alla versione precedente in cartone.
Ogni faccia del parallelepipedo è preforata, permettendo un’elevata espandibilità: sarà possibile collegare facilmente componenti elettronici, sensori, attuatori, elementi meccanici e strutturali, trasformando il robot di base in molteplici configurazioni differenti.

Questa nuova versione non sarà un oggetto a sé stante, ma il primo modulo di un progetto più ampio: una valigetta modulare STEAM che raccoglierà componenti, strumenti ed esperimenti pensati per integrare varie discipline — dall’elettronica alla meccanica, dalla fisica alla programmazione.
L’idea è costruire un percorso laboratoriale completo, dove ogni elemento della valigetta diventa parte di un sistema didattico aperto, personalizzabile e progressivo.

La spinta a dare concretezza a questo progetto arriva anche dal nuovo corso di robotica che avvierò tra poche settimane, per il quale desideravo proporre ai partecipanti una piattaforma ancora più solida, versatile e stimolante.

Nei prossimi aggiornamenti, racconterò più nel dettaglio sia l’evoluzione di MicroMoto sia la progettazione della valigetta e dei primi kit di esperimenti!

Arduino UNO R4 WiFi – DAC – generazione di onde sinusoidali, quadre e a dente di sega

Una delle nuove caratteristiche presenti in entrambe le schede Arduino Uno R4, Minima e WiFi, è l’inclusione di un singolo DAC a 12 bit. Questo può generare tensioni di uscita discrete da 0 a 5 volt. Poiché questa funzionalità può essere di estremo interesse nelle attività di laboratorio di Elettronica ne indico di seguito il principio di funzionamento per sviluppare future esercitazioni.

Principio di funzionamento

Un DAC, o Convertitore Digitale-Analogico (in inglese: Digital-to-Analog Converter), è un dispositivo che converte un valore digitale (in binario) in un valore analogico (segnali continui che possono assumere un’infinità di valori all’interno di un intervallo).
Si tratta dell’operazione inversa di quella eseguita da un ADC, o Convertitore Analogico-Digitale, che converte un segnale analogico in una rappresentazione digitale.

Il processo di conversione avviene in tre fasi:

  1. lettura in input dei dati digitali,
  2. conversione in analogico
  3. output del segnale analogico

Il DAC riceve in input un segnale digitale, che è rappresentato da una serie di valori binari (0 e 1), l’elettronica del DAC consente successivamente di convertire i valori binari in un segnale di output analogico che può essere utilizzato per pilotare dispositivi analogici come altoparlanti, motori, o altre apparecchiature che necessitano di un ingresso analogico.

Dal punto di vista pratico un DAC può essere utilizzato per creare un’uscita analogica a partire da un valore digitale utile per molte applicazioni, ad esempio per generare forme d’onda audio, per pilotare dispositivi che richiedono un input analogico, o per creare segnali di tensione variabile. Ad esempio nei sistemi audio un DAC converte i segnali audio digitali (come quelli presenti nei file MP3 o nei CD) in segnali analogici che possono essere riprodotti attraverso altoparlanti o cuffie.

Per semplificare ulteriormente nell’utilizzo con Arduino UNO R4, immaginate di avere un valore digitale che varia da 0 a 4095 (rappresentando un range di 12 bit). Un DAC potrebbe convertire questo valore in una tensione che varia, ad esempio, da 0V a 5V. Quindi, se il valore digitale fosse 512 (circa metà del range), l’uscita del DAC potrebbe essere di circa 0,6V.

Vediamo un esempio pratico.

Lo sketch che segue genera una forma d’onda sinusoidale o, meglio, una forma d’onda sinusoidale “simulata”. La frequenza della forma d’onda sinusoidale viene controllata da potenziometro.

Utilizzeremo un oscilloscopio per visualizzare l’onda sinusoidale, il collegamento è piuttosto semplice, abbiamo bisogno di un potenziometro lineare con una resistenza di 5 KOhm o superiore, io ho utilizzato un potenziometro da 10 KOhm.

La sonda dell’oscilloscopio deve essere connessa al pin A0 che viene usata come uscita del DAC. Il potenziometro ha il pin centrale connesso ad A5 (ingresso del DAC), un pin laterale connesso a 5V sulla scheda e l’altro pin laterale connesso a GND sulla scheda.

Se non possedete un oscilloscopio potete inviare l’output ad un amplificatore audio in modo che possiate ascoltare la tonalità generata, ricordate però che se procedete in questo modo bisogna assicurarsi che il controllo del volume sull’amplificatore sia al minimo, dopo di che lentamente aumentate il volume.

Il codice indicato di seguito è tratto dall’esempio di riferimento sul sito Arduino e all’interno degli esempi dell’IDE su cui ho inserito i commenti tradotti in italiano e fatto una piccola correzione.

La spiegazione del funzionamento la trovate nei commenti.

1// Prof. Maffucci Michele
2// Arduino UNO R4 Digital-to-Analog Converter (DAC)
4 
5// libreria per la generazione di forme d'onda analogiche
6#include "analogWave.h"
7 
8// Crea un'istanza della classe analogWave, usando il pin DAC
9analogWave wave(DAC);
10 
11int frequenza = 10; // variabile intera che conterrà la frequenza rilevata
12 
13void setup() {
14Serial.begin(115200);
15// pinMode(A5, INPUT); // non necessaria perchè ingresso analogico
16wave.sine(frequenza);
17}
18 
19void loop() {
20// legge un valore analogico dal pin A5 e lo mappa nell'intervallo 0 - 10000 Hz
21frequenza = map(analogRead(A5), 0, 1024, 0, 10000);
22 
23// Stampa l'aggiornmento dell frequenza impostata sulla serial monitor
24Serial.println("La frequenza e' " + String(frequenza) + " hz");
25 
26// Imposta la frequenza del generatore di forma d'onda sul valore aggiornato
27wave.freq(frequenza);
28 
29// aspetta un secondo prima di ripetere la successiv rilevazione
30delay(1000);
31}

Volutamente ho lasciato commentata nel setup() la riga di codice in cui viene impostato il pinMode del pin A5 perché non è necessario inizializzare un pin Analogico, nell’esempio originale invece viene inizializzata.
A tal proposito per chi inizia con Arduino consiglio la lettura della guida: “Errori comuni nell’uso di Arduino – confondere pin analogici con pin digitali“.

Il risultato sarà il seguente:

E’ possibile quindi generare forme d’onda non solo sinusoidali, la funzione wave permette di impostare:

  • sine – onda sinusoidale
  • square – onda quadra
  • saw – onda a dente di sega

sarà sufficiente sostituire wave.sine(frequenza) presente nella sezione setup() rispettivamente con:

  • wave.square(frequenza);
  • wave.saw(frequenza);

Onda quadra:

Onda a dente di sega:

Buon Making a tutti 🙂

Guida all’uso di millis() – Lezione 1

Credo che una delle problematiche più ostiche da gestire soprattutto per i neofiti è l’utilizzo degli intervalli di tempo in cui eseguire operazioni con Arduino, mi riferisco all’uso e all’abuso improprio del delay(). Infatti gli studenti scoprono che, sebbene la funzione delay() sia facile da usare, ha degli effetti collaterali importanti; il principale è che ferma l’esecuzione dello sketch Arduino fino a quando non è trascorso il periodo di delay. Quando ciò accade, di solito chi spiega indirizza lo studente sull’esempio di defaut sulla temporizzazione non bloccante che troviamo nell’IDE di Arduino: BlinkWithoutDelay.

Molto spesso però questo confonde ancora di più le idee perché in realtà non si vuole solo far lampeggiare un LED ma si vogliono eseguire più operazioni contemporaneamente, quindi è bene comprendere a fondo il principio di funzionamento del BlinkWithoutDelay prima di poterlo applicare alla propria situazione.

Ho pensato quindi di realizzare qualche post tematico sull’uso di millis(), prendendo spunto dalle spiegazioni che realizzo per gli studenti.

Per usare millis() per la temporizzazione è necessario registrare il momento in cui un’azione si è verificata (ad esempio accensione di un LED ritardata alla pressione di un pulsante) affinché possiate iniziare a contare il tempo trascorso da tale evento, dovrete quindi controllare ad intervalli regolari se il periodo richiesto è trascorso.
Se tale intervallo di tempo non è trascorso allora il vostro programma potrà fare altro fino al prossimo controllo.

Nei programmi che seguono userò i commenti all’interno dello sketch per spiegare l’utilizzo delle varie parti del programma.

Ma cos’è millis()?

La funzione millis() restituisce il numero di millisecondi trascorsi dall’avvio del programma corrente su una scheda Arduino. Questo valore è restituito come un numero di tipo unsigned long.

Come Funziona

  • Incremento Automatico: il conteggio inizia automaticamente quando il microcontrollore sulla scheda Arduino viene alimentato o resettato. Il conteggio continua ad aumentare fino a che la scheda rimane alimentata.
  • Overflow: poiché millis() utilizza una variabile di tipo unsigned long, che ha una dimensione di 32 bit su Arduino, il valore massimo che può raggiungere è 4,294,967,295, dopo aver raggiunto questo valore, si andrà in overflow (ovvero Arduino non è in grado di memorizzare un numero più grande) e il valore restituito da millis() ripartirà da zero. Questo avviene dopo circa 49 giorni e 17 ore dall’ultimo reset della scheda.

Utilizzi di millis()

Di seguito una lista non esaustiva di alcuni utilizzi della funzione millis():

  • Temporizzazione non bloccante: a differenza di delay(), che ferma l’esecuzione del programma per un periodo specificato, millis() può essere utilizzato per realizzare pause o attese senza bloccare altre operazioni. Questo è particolarmente utile in applicazioni multitasking dove altre attività devono continuare ad essere eseguite.
  • Debounce: viene spesso usata per implementare il debounce di pulsanti o switch, riducendo gli effetti dei rimbalzi meccanici che possono causare letture multiple per una singola pressione.
  • Esecuzione di azioni a intervalli regolari: può essere utilizzata per eseguire specifiche azioni a intervalli regolari, come leggere sensori, aggiornare display, o inviare dati.

Pratica di utilizzo

Per utilizzare millis() per la temporizzazione, il vostro sketch deve conoscere il valore attuale del tempo (valore restituito da millis()) e questa rilevazione può essere fatto quando volete, in più punti dello sketch ovviamente dovrebbe essere fatta quando serve, ma vediamo cosa vuol dire.

Tipicamente il valore di millis() conviene registrarlo in una variabile ad inizio loop() o all’interno del setup() in questo modo:

millisCorrente = millis();

Regola di utilizzo:

  1. La variabile millisCorrente deve essere stata precedentemente dichiarata.
  2. Deve essere di tipo unsigned long perché millis() restituisce un intero long senza segno.

Regole generali che valgono per tutti i programmi che realizzerete, lo scrivo perchè puntualmente durante le correzioni qualcuno dimentica questa due regolette:

  1. Il nome della variabile, così come accade per tutte le variabili dovrebbe essere autoesplicativa, quindi il suo nome deve dare informazioni: “a cosa serve”
  2. Inoltre è buona regola utilizzare la notazione Camel Case per gestire nomi di variabili composte da più parole, ciò vale anche per le funzioni.

Come spesso accade durante le attività di laboratorio, lascio come semplicissimo esercizio per lo studente il desumere i componenti utilizzati e connessioni dagli sketch di esempio, quindi fate riferimento a quanto indicato in ogni singolo programma, si tratterà semplicemente di connettere dei LED con in serie un resistore da 220 Ohm. Per quanto riguarda l’ultimo esempio fate riferimento al link indicato che rimanda ad un altro post su questo sito.

Siete ora pronti per seguire le spiegazioni successive.

Continua a leggere

Errori comuni nell’uso di Arduino – utilizzo dell’operatore ++

Nella “Lezione 2 – Corso di Elettronica Creativa con Arduino Sensor Kit” ho promesso che avrei fornito alcuni esempi pratici sull’utilizzo dell’operatore “++” come prefisso e come suffisso nell’incremento di una variabile. Durante la correzione delle esercitazioni dei miei studenti noto che la posizione del “++” crea qualche confusione, quindi ho pensato di inserire questa spiegazione nella sezione “Errori comuni nell’uso di Arduino”.

Esempio 1: “++variabile” (incremento come prefisso)

Questo sketch dimostra come il valore della variabile viene incrementato prima di essere stampato sulla Serial Monitor.

1// Prof. Maffucci Michele
2// utilizzo del ++ come prefisso
3 
4void setup() {
5  Serial.begin(9600);  // Avvia la comunicazione seriale a 9600 bps
6}
7 
8void loop() {
9  int conteggio = 0;
10  Serial.println("Incremento come prefisso:");
11  for(int i = 0; i < 5; i++) {
12    Serial.print("Valore attuale di conteggio: ");
13    Serial.println(++conteggio);  // Stampa il valore di conteggio dopo essere stato incrementato
14    delay(1000);                  // Attendi un secondo tra ogni iterazione
15  }
16  Serial.println("Fine del ciclo");
17  while(true);  // Termina il loop per evitare ulteriori incrementi
18}

Nell’Esempio 1, vedrete che i valori stampati iniziano da 1 e arrivano fino a 5, perché l’incremento avviene prima della stampa del valore di conteggio.

Esempio 2: “variabile++” (Incremento come suffisso)

Questo sketch illustra come il valore della variabile sia stampato prima di essere incrementato.

1// Prof. Maffucci Michele
2// utilizzo del ++ come suffisso
3 
4void setup() {
5  Serial.begin(9600);  // Avvia la comunicazione seriale a 9600 bps
6}
7 
8void loop() {
9  int conteggio = 0;
10  Serial.println("Incremento come suffisso:");
11  for(int i = 0; i < 5; i++) {
12    Serial.print("Valore attuale di conteggio: ");
13    Serial.println(conteggio++);  // Stampa il valore corrente di conteggio, poi lo incrementa
14    delay(1000);                  // Attendi un secondo tra ogni iterazione
15  }
16  Serial.println("Fine del ciclo");
17  while(true);  // Termina il loop per evitare ulteriori incrementi
18}

Nell’Esempio 2, i valori stampati iniziano da 0 e arrivano a 4, poiché l’incremento avviene dopo la stampa del valore.

Esempio 3: alternanza tra incremento come prefisso e suffisso

L’esempio che segue utilizza un contatore che aumenta ogni secondo e un messaggio che mostra sulla Serial Monitor il valore del contatore prima e dopo l’incremento, alternando tra incremento come prefisso e suffisso.

1// Prof. Maffucci Michele
2// utilizzo del ++ come suffisso
3 
4int contatore = 0;
5bool usaPrefisso = true// Flag per alternare tra incremento prefisso e suffisso
6 
7void setup() {
8  Serial.begin(9600);  // Inizia la comunicazione seriale a 9600 bps
9}
10 
11void loop() {
12  Serial.println("Inizio del ciclo");
13  if (usaPrefisso) {
14    Serial.print("Incremento come prefisso - Valore prima dell'incremento: ");
15    Serial.println(contatore);
16    Serial.print("Valore dopo l'incremento: ");
17    Serial.println(++contatore);  // Incremento prima della stampa
18  } else {
19    Serial.print("Incremento come suffisso - Valore prima dell'incremento: ");
20    Serial.println(contatore);
21    Serial.print("Valore dopo l'incremento: ");
22    Serial.println(contatore++);  // Stampa prima dell'incremento
23  }
24 
25// Alterna tra prefisso e suffisso
26  usaPrefisso = !usaPrefisso;
27 
28Serial.println("Fine del ciclo\n");
29  delay(2000);  // Attendere 2 secondi prima del prossimo ciclo
30}

Si noti che nel loop() a ogni iterazione, si decide se usare l’incremento come prefisso o come suffisso, basandosi sul valore del flag “usaPrefisso”. Dopo ogni ciclo, il metodo di incremento viene alternato in questo modo vengono mostrati come i due metodi di incremento influenzano il valore della variabile contatore il cui valore viene stampato sulla Serial Monitor.

Buon Coding a tutti 🙂

EduRobot MicroMoto – Versione Arduino

Qualche mese fa durante un corso per docenti avevo realizzato EduRobot MicroMoto un piccolo kit robotico nato dalla necessità di realizzare attività di Coding e Robotica che potessero essere sperimentate da un numero elevato di allievi, inclusivo dal punto di vista economico, facile da assemblare e personalizzare.

MicroMoto nasce per essere essenziale, sia nella costruzione che nell’uso quotidiano, con  una forma compatta per essere utilizzato comodamente a scuola, sia aula che in laboratorio o a casa.

Il piccolo MicroMoto è stato adottato da diverse classi 🙂 e ringrazio i colleghi che hanno seguito i miei corsi per aver usato questo progetto. In questi mesi mi sono giunte richieste per la realizzazione di una versione Arduino, nello specifico della versione R4 che permette comunicazione Bluetooth e WiFi con un display per mostrare gli stati del sistema e possibilità di essere programmato in C ed in MicroPython e questa versione la utilizzerò da domani per un corso di robotica indirizzato a docenti.

La modalità costruttiva per questa versione Arduino è la medesima di quella realizzata per la versione BBC micro:bit con scheda motori :MOVE, sono presenti però alcune piccole differenze nella faccia superiore, nel taglio delle palline da Ping Pong utilizzate come Caster Ball e nell’uso di un pacco batteria posto nella parte interna del robot, fate riferimento a questo breve tutorial ed utilizzate il PDF allegato effettuare i tagli.

Ricordo che la modalità per vincolare i motori alla struttura avviene sempre con elastici.

Come già segnalato nel post di presentazione, il design del kit è stato pensato per essere minimale e simmetrico, misurando solamente 10×10 cm. Assomiglia a una piccola scatola, assemblata con colla a caldo, un metodo che non solo garantisce maggiore sicurezza durante il montaggio, ma accelera anche significativamente il processo rispetto alle precedenti versioni che utilizzavano viti, facilitando così tutto il lavoro di costruzione.

Utilizzando cartone come materiale base, il kit permette una grande flessibilità per l’espansione e la personalizzazione. L’uso è quello di un cartone di 4 mm di spessore, ricoperto da un foglio bianco adesivo su cui sono stampati i contorni per il taglio. Questo permette agli studenti di esprimere la loro creatività, colorando e personalizzando le superfici bianche. MicroMoto può essere ulteriormente arricchito incollando pezzi Lego sulle sue superfici, offrendo così una versatile adattabilità a diverse esigenze educative.

Nel corso che sto realizzando verranno aggiunte altre funzionalità:

  • evita ostacoli
  • segui linea
  • segui luce

Allego il file PDF con i profili ritaglio in colore rosso. Nel video allegato ho usato un foglio A4 adesivo bianco, ma è possibile utilizzare anche un comune foglio di carta che potrà essere incollato al cartone.

Di seguito le istruzioni per la costruzione.

Continua a leggere