Archivi tag: arduino

Programmare Raspberry Pi Pico con l’IDE di Arduino

Nel mio precedente post introduttivo sull’uso di Raspberry Pi Pico abbiamo iniziato a conoscere la scheda ed avevo mostrato come programmarla in MicroPython.
Vediamo in questo post come programmare la scheda con l’IDE di Arduino.
Ovviamente prima di iniziare è necessario installare l’IDE di Arduino.

Installare il pacchetto Raspberry pico nell’IDE di Arduino

E’ possibile procedere in due modi, seguendo l’installazione del pacchetto non ufficiale, oppure quello ufficiale di Arduino. Vedremo entrambe le installazioni.

Installazione del pacchetto non ufficiale

Il pacchetto non ufficiale è quello che preferisco perché ad oggi è quello che fornisce più opzioni di programmazione e gestioni di schede di diverso tipo con il medesimo microcontrollore RP2040.

1. Aprire l’Arduino IDE. Andate in File > Preferences

2. Copiare ed incollate il seguente link nel Gestore Schede

https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json

Click su ok per salvare le impostazioni

3. Aprire il Gestore schede. Andate in Strumenti > Scheda > Gestore schede. Si aprirà la finestra Gestore schede in questo modo verranno caricati i contenuti aggiunti con il link inserito al passo 2.

4. Cercare tramite il campo di ricerca “Pi Pico”. Troverete: “Raspberry Pi Pico/RP2040 by Earle F. Philhower”, selezionate l’ultima versione e fate clic su “Installa”

5. L’installazione del pacchetto non ufficiale è terminata, vedrete la voce: INSTALLED di fianco al nome del pacchetto.

Continua a leggere

Arduino: misuratore di distrazione dovute all’uso di uno smartphone

Uno dei progetti che ho assegnato ai miei studenti in questo anno scolastico che volge al termine, è stato quello di progettare e realizzare un sistema di automazione in grado di valutare il comportamento sedentario di una persona quando lavora a computer. Al sistema sono stati aggiunti  appositi segnali di allarme che hanno l’obiettivo di invogliare la persona ad effettuare esercizio fisico.
Gli allievi hanno progettare il dispositivo non solo da un punto di vista elettronico, ma anche dal punto di vista dell’usabilità e del design.
I progetti realizzati hanno avuto sviluppi molto interessanti, nelle foto in allegato trovare una versione addirittura dotata di caricatore per smartphone dotato inoltre di un doppio controllo: presenza persona (mediante sensore PIR) e rilevazione prelievo smartphone mediante sensore LDR. Come accade spesso i migliori progetti sviluppati durante il PCTO vengono utilizzati per sviluppare le future attività di laboratorio per l’anno scolastico successivo.

Una variante all’attività sopra segnalata è un misuratore di distrazione, l’idea nasce da una serie di necessità:

1. far percepire fisicamente la quantità di interruzioni e quindi distrazioni durante un’attività di studio dovute alle continue notifiche ricevute sugli smartphone;
2. usare concetti elettronici ed informatici non estremamente complessi ed adatti a chi inizia ad utilizzare un microcontrollore;
3. far si che nell’attività di laboratorio sia presente una componente di educazione civica.

Da ciò è nato il “misuratore di distrazioni” che proporrò per la realizzazione ad un gruppo di colleghi che stanno seguendo il mio corso: Le buone pratiche del Making e dell’Internet delle Cose (IOT avanzato) organizzato dal Liceo da Vinci – Floridia (SR), sarà il progetto della settimana.

Il sistema sarà dotato di pochi componenti:

  • Arduino
  • Ldr
  • Display 16×2
  • Pulsante

Il tutto si presenta come una semplice scatola su cui può essere poggiato il telefono, un LDR posto sulla base di appoggio rileverà la variazione di luce quando si solleva lo smartphone. Il display indicherà il numero di volte che il telefono è stato preso e quindi il numero di volte che la persona ha interrotto il suo lavoro o studio. Le distrazioni potranno essere ridotte inserendo un coperchio che nasconde il display dello smartphone.

Ovviamente si potrà migliorare il sistema, ad esempio mostrando la quantità di minuti trascorsi dall’ultima distrazione, o ancora il numero di minuti totali si distrazione, il progetto potrà essere migliorata a piacimento. Poiché durante il corso dovrò parlare anche di IoT si aggiungerà la possibilità di invio messaggi di avvertimento via Telegram nel caso si raggiunga un limite fissato di distrazioni.

Per rendere la costruzione del dispositivo semplice e veloce ho utilizzato del foam core in modo che non ci sia l’obbligo di utilizzo di una stampante 3D o di una macchina a taglio laser per la realizzazione dell’oggetto.

Rendo quindi disponibile i sorgenti grafici in formato svg per stampare su foglio di carta adesiva le parti della scatola. I fogli adesivi verranno poi incollati sui pannelli foam ed ogni parte sarà tagliata a mano con un cutter e successivamente incollati con colla vinilica.

Buon making a tutti 🙂

Il mio articolo di presentazione del corso: Laboratori STEAM con Arduino sul sito Tecnica della scuola


On-line oggi il mio articolo sul sito Tecnica della Scuola che presenta il corso: Laboratori STEAM con Arduino. Potete raggiungerlo direttamente dalla home page del sito oppure seguendo il link allegato.
Per chi fosse interessato sono ancora aperte le iscrizioni, inoltre ai molti che mi hanno scritto chiedendomi se è dedicato ai soli insegnanti rispondo che:

il corso è di base ed è costruito pensando agli insegnanti che si approcciano all’uso di Arduino, quindi ne verrà introdotto l’uso in ambito didattico anche per i colleghi di materie non tecniche, ma è aperto a tutti, quindi anche ai non docenti.

Ricordo inoltre che durante il corso verranno svolte molte attività utilizzando dei simulatori, ma è preferibile dotarsi di un kit Arduino che vi permetterà di mettere in pratica immediatamente quanto appreso.

Tutti i consigli sui materiali e dove acquistarli verranno indicati durante il corso.

Per maggiori informazioni seguire il link.

Vi aspetto quindi al mio corso 🙂

Arduino: Sensore Piezoelettrico

Per effettuare una misura dinamica di pressione o allungamento o vibrazione di superfici è possibile utilizzare sensori che si basano su quello che viene comunemente chiamato “effetto piezoelettrico”, la parola “piezoelettrico” deriva dalla parola greca “piezein” che significa premere. La piezoelettricità è la proprietà di alcuni cristalli, che se sottoposti all’azione di una forza esterna esterna, provoca in essi una migrazione di cariche elettriche. Con l’utilizzo di un apposito circuito elettronico, la migrazione di cariche elettriche può essere tradotta una differenza di potenziale.

L’effetto piezoelettrico è un effetto reversibile, ciò vuol dire che una volta che abbiamo applicato una variazione meccanica sul cristallo si ottiene una variazione di cariche e in maniera analoga quando viene fornita una carica elettrica al sensore, questo si allungherà o si comprimerà.

Quando applichiamo al cristallo una forza meccanica le cariche elettriche si spostano accumulandosi sulle facce opposte del cristallo:

I materiali piezoelettrici utilizzati possono essere naturali o di sintesi dopo polarizzazione:

Materiali naturali

  • Quarzo cristallino (SiO2)
  • sale di Rochelle o sale di Seignette (tartrato di Sodio e Potassio)
  • Tormalina

Materiali di sintesi

  • Piezoceramici
    • Titanio Zirconato di Piombo (PZT)
    • Titanio di Bario (BaTiO3)

L’effetto piezoelettrico può essere sfruttato per:

  • generare energia elettrica
  • in campo medicale: ecografi
  • sensori di vibrazione per allarmi
  • sensori di impatto
  • sonar (in campo militare)
  • viene utilizzato negli accendini
  • per gli orologi
  • per rilevare variazioni meccaniche
  • produrre suoni, come nelle chitarre elettriche
  • messa a fuoco di strumenti ottici
  • sensori in capo ambientale per il radio tracking
  • ecc…

Esempio tipico è quello dei cicalini piezoelettrici, conosciuti anche come buzzer, che vengono utilizzate in molte delle sperimentazioni con Arduino, infatti sottoponendo a tensione elettrica e ad una determinata frequenza il materiale piezoelettrico all’interno del buzzer, viene posta in oscillazione e questo muovendo l’aria, dall’apposita apertura collocata sul buzzer, permette di percepire il suono.

Nelle sperimentazioni con Arduino è tipico usare sensori piezoelettrici economici che generalmente hanno forma circolare. Questi sensori non hanno gradi di precisioni elevati e sono utilizzati prevalentemente per rilevare vibrazioni. Per capire come sono realizzati questi sensori immaginate ad un sandwich in in cui l’elemento piezoelettrico, costituito da piombo-zirconato è inserito tra due piastre metalliche. Il loro utilizzo in circuito con microcontrollori è particolarmente semplice anche perché funzionano con le tensioni e le correnti che si hanno direttamente dai pin di uscita di questi circuiti elettronici.

Nel caso abbiate necessità di consultare i dati tecnici di diverse tipologie di dispositivi piezoelettrici vi rimando al questi due datasheet:

Realizziamo ora un circuito che ci permette, mediante il sensore piezoelettrico e Arduino, la rilevazione di vibrazioni e urti. Colleghiamo il sensore sulla breadboard e dalla breadboard ad Arduino, in questo modo eviteremo di far vibrare il sensore quando tocchiamo Arduino per effettuare i collegamenti.

Colleghiamo il filo rosso del sensore ad un ingresso analogico di Arduino, ad esempio A0 mentre il filo nero lo colleghiamo. In parallelo al sensore bisognerà inserire una resistore con resistenza da 1MOhm, ciò è necessario perché un piezo è un componente con caratteristiche capacitive e la resistenza in parallelo permette di assorbire le cariche che vengono accumulate sulla capacità.

Il circuito proposto è estremamente semplice ed è riportato di seguito:

Esempio 1

/*
 * Prof. Maffucci Michele
 * data: 22.01.2021
 * Lettura sensore piezoelettrico
 * 
 * Esempio 1: stampa dei valori sulla serial monitor
 * e visualizzazione del grafico sulla serial Plot
 * 
 * Si ricorda che la Serial Plotter e la Serial Monitor
 * non possono essere usati contemporaneamente
 * 
 */


void setup(){
   // Inizializzazione della serial monitor
  Serial.begin(9600);
}

void loop(){
  // val contiene il valore letto dal sensore  
  int val = analogRead(A0);
  Serial.println(val);
  delay(20);
}

Se si selezione Serial Plotter dal menù Tools:

si avrà la visualizzazione del grafico degli urti provocati sul sensore:

Come si può notare i valori sull’asse delle ordinate è compreso tra 0 e 1023.

Esempio 2

Arduino, come già spiegato nelle mie slide: Alfabeto di Arduino – Lezione 4, non è in grado di leggere direttamente valori di tensione, bisognerà utilizzare il convertitore analogico/digitale (ADC) integrato in esso per convertire una tensione elettrica in un valore numerico. L’ADC di Arduino è a 10 bit, quindi potrà mappare valori compresi tra 0V e 5V in valori numerici compresi tra 0 e 1023. (1024 valori), pertanto si avrà una risoluzione di 5/1024 = 4,88 mV.

Per ottenere la tensione elettrica partendo dai valori restituiti dall’ADC, sarà sufficiente prendere il valore restituito dall’analogRead() e moltiplicarlo per la tensione unitaria corrispondente ad una unità 5/1024 = 4,88 mV. Traduciamo questo in codice per visualizzare la tensione elettrica sulla Serial Plotter.

/*
 * Prof. Maffucci Michele
 * data: 22.01.2021
 * Lettura sensore piezoelettrico
 * 
 * Esempio 2: stampa dei valori della tensione elettrica
 * sulla Serial Monitor e Serial Plotter
 * resitituita dal sensore nell'intervallo 0V - 5V
 * 
 * Si ricorda che la Serial Plotter e la Serial Monitor
 * non possono essere usati contemporaneamente
 * 
 */

void setup(){
   // Inizializzazione della serial monitor
  Serial.begin(9600);
}

void loop(){
  // val contiene il valore letto dal sensore  
  int val = analogRead(A0);
  // tensione contiene il valore di tensione elettrica
  float tensione = val *(5.0/1024);
  Serial.println(tensione);
  delay(20);
}

Esercizio 1

Realizziamo un interruttore on/off, possiamo utilizzare gli esempi già disponibili all’interno dell’IDE di Arduino e che in altre occasioni ho utilizzato su questo sito.  L’idea è quella di realizzare un sistema antirimbalzo software (debounce) e attivare l’on o l’off su un LED se l’intensità della forza meccanica impressa è superiore ad un valore di soglia che impostiamo nel codice.

Esercizio 2

Collegare 10 LED ad Arduino ed utilizzare un sensore piezoelettrico per accendere una quantità di LED proporzionale alla forza impressa sul sensore.

Esercizio 3

Realizziamo un dimmer, un sistema in grado di regolare l’intensità luminosa di un LED. La regolazione dell’intensità luminosa sarà fatto toccando il sensore piezoelettrico. Il doppio tocco veloce (in un intervallo di tempo prestabilito da voi) inverte la modalità di variazione dell’intensità luminosa (aumentare/diminuire), nel caso non si riesca a realizzare lo sketch con il doppio tocco veloce, utilizzare un pulsante esterno per invertire la modalità intensità luminosa prodotta.

Esercizio 4

Utilizzando la stessa logica di funzionamento dell’esercizio 2, utilizzare ora una striscia LED per misurare l’intensità della forza meccanica con cui sollecitiamo il sensore piezoelettrico.

Buon Coding a tutti 🙂

Lezione 3 – Arduino GamePad – LCD1602 Keypad Shield della Keyestudio

Terza lezione in cui aggiungo alcuni esempi che suggeriscono alcune azioni di gioco che gli allievi del gruppo di lavoro dell’attività di PCTO: Arduino GamePad potranno sfruttare per la realizzazione del loro.

Esempio 1

Controllo dello spostamento del carattere:

  • destra/sinistra mediante i pulsanti: RIGHT e LEFT sul display
  • su/giù mediante i pulsanti UP/DOWN

Per realizzare queste azioni riprendiamo quanto realizzato nella lezione precedente aggiungendo all’ultimo sketch il controllo della pressione del pulsante UP o DOWN in cui viene controllato se l’analogRead sul A0 restituisce un valore comprese tra:

Controllo UP
(val >= 50 && val <= 150)

Controllo DOWN
(val >= 150 && val <= 300)

Lo spostamento del carattere dalla prima alla seconda riga deve essere fatta cancellando prima l’intero schermo, poi posizionando il carattere con il metodo setCursor() a cui si passa la variabile globale “contatorePosizioneColonna” che viene modificata di volta in volta alla pressione dei pulsanti RIGHT e LEFT. La selezione della riga avviene passando il valore 0 che identifica la prima riga e il valore 1 per la seconda riga.

/*
   Prof. Michele Maffucci
   Utilizzo dell'LCD Keypad Shield della Keystudio
   Data: 14.03.2021

   Controllo dello spostamento del carattere:
   - destra/sinistra mediante i pulsanti: RIGHT e LEFT sul display
   - su/giù mediante i pulsanti UP/DOWN
*/

// inclusione della libreria LiquidCrystal.h
#include <LiquidCrystal.h>

// inizializza la libreria con i numeri dei pin dell'interfaccia
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Colonna in cui si trova il carattere
int contatorePosizioneColonna = 0;

// Valore restituito dall'analogRead su A0
int val;

// Velocità con cui viene stampato il carattere  
int velocita = 200;

void setup() {
  // impostazione del numero di colonne e righe del display
  lcd.begin(16, 2);

  // Carattere stampato nella prima colonna e prima riga (0,0)
  lcd.print("*");
}

void loop() {

  // Memorizza in val il valore presente su A
  int val = analogRead(A0);

  // Alla pressione del pulsante UP sul display il carattere si sposta sulla prima riga
   if (val >= 50 && val <= 150) {
    // Cancella il display
    lcd.clear();
    // Spostamento sulla prima riga nella colonna corrente
    lcd.setCursor(contatorePosizioneColonna, 0);
    // Stampa del carattere: *
    lcd.print("*");
    // Attesa di un'istante per percepire il movimento del carattere
    delay(velocita);
  }

  // Alla pressione del pulsante DOWN sul display il carattere si sposta sulla seconda riga
  if (val >= 150 && val <= 300) {
    // Cancella il display
    lcd.clear();
    // Spostamento sulla seconda riga nella colonna corrente
    lcd.setCursor(contatorePosizioneColonna, 1);
    // Stampa del carattere: *
    lcd.print("*");
    // Attesa di un'istante per percepire il movimento del carattere
    delay(velocita);
  }

  // Premendo il pulsante RIGHT sul display, il carattere si sposta di una posizione
  // a destra fino a quando non si raggiunge l'ultima colonna a destra.
  // Premendo ancora il pulsante RIGHT non si ha l'avanzamento del carattere.
  if ((val >= 0 && val <= 50) && contatorePosizioneColonna < 15) {
    lcd.scrollDisplayRight();
    delay(velocita);
    contatorePosizioneColonna++;
  }

  // Premendo il pulsante LEFT sul display, il carattere si sposta di una posizione
  // a sinistra fino a quando non si raggiunge l'ultima colonna a sinistra.
  // Premendo ancora il pulsante LEFT non si ha l'avanzamento del carattere.
  if ((val >= 300 && val <= 500) && contatorePosizioneColonna > 0) {
    lcd.scrollDisplayLeft();
    delay(velocita);
    contatorePosizioneColonna--;
  }
}

Esempio 2

In questo secondo esempio viene aggiunta una semplice matrice di cinque “X” che identificano degli ostacoli che devono essere superati. Nell’esempio esposto però gli ostacoli possono essere superati, lascio quindi a voi la realizzazione dello sketch che consente il blocco dell’avanzamento nel caso in cui ci si scontra con l’ostacolo.

/*
   Prof. Michele Maffucci
   Utilizzo dell'LCD Keypad Shield della Keystudio
   Data: 14.03.2021

   Controllo dello spostamento del carattere *:
   - destra/sinistra mediante i pulsanti: RIGHT e LEFT sul display
   - su/giù mediante i pulsanti UP/DOWN

   Stampa di una serie di X che rappresentano gli ostacoli
   
*/

// inclusione della libreria LiquidCrystal.h
#include <LiquidCrystal.h>

// inizializza la libreria con i numeri dei pin dell'interfaccia
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Colonna in cui si trova il carattere
int contatorePosizioneColonna = 0;

// Valore restituito dall'analogRead su A0
int val;

// Velocità con cui viene stampato il carattere
int velocita = 200;

// Riga in cui si trova il carattere *
int riga = 0;

void setup() {
  // impostazione del numero di colonne e righe del display
  lcd.begin(16, 2);

  // Carattere stampato nella prima colonna e prima riga (0,0)
  lcd.print("*");
}

void loop() {

  // Memorizza in val il valore presente su A
  int val = analogRead(A0);

  stampaOstacoli();

  // Alla pressione del pulsante UP sul display il carattere si sposta sulla prima riga
  if (val >= 50 && val <= 150) {
    // Cancella il display
    lcd.clear();
    stampaOstacoli();
    // Spostamento sulla prima riga nella colonna corrente
    lcd.setCursor(contatorePosizioneColonna, 0);
    riga = 0;
    // Stampa del carattere: *
    lcd.print("*");
    // Attesa di un'istante per percepire il movimento del carattere
    delay(velocita);
  }

  // Alla pressione del pulsante DOWN sul display il carattere si sposta sulla seconda riga
  if (val >= 150 && val <= 300) {
    // Cancella il display
    lcd.clear();
    stampaOstacoli();
    // Spostamento sulla seconda riga nella colonna corrente
    lcd.setCursor(contatorePosizioneColonna, 1);
    riga = 1;
    // Stampa del carattere: *
    lcd.print("*");
    // Attesa di un'istante per percepire il movimento del carattere
    delay(velocita);
  }

  // Premendo il pulsante RIGHT sul display, il carattere si sposta di una posizione
  // a destra fino a quando non si raggiunge l'ultima colonna a destra.
  // Premendo ancora il pulsante RIGHT non si ha l'avanzamento del carattere.
  if ((val >= 0 && val <= 50) && contatorePosizioneColonna < 15) {
    // Cancella il display
    lcd.clear();
    contatorePosizioneColonna++;
    // Spostamento di una posizione verso destra del cursore
    lcd.setCursor(contatorePosizioneColonna, riga);
    // Stampa del carattere: *
    lcd.print("*");
    // Attesa di un'istante per percepire il movimento del carattere
    delay(velocita);
  }

  // Premendo il pulsante LEFT sul display, il carattere si sposta di una posizione
  // a sinistra fino a quando non si raggiunge l'ultima colonna a sinistra.
  // Premendo ancora il pulsante LEFT non si ha l'avanzamento del carattere.
  if ((val >= 300 && val <= 500) && contatorePosizioneColonna > 0) {
    // Cancella il display
    lcd.clear();
    contatorePosizioneColonna--;
    lcd.setCursor(contatorePosizioneColonna, riga);
    // Stampa del carattere: *
    lcd.print("*");
    // Attesa di un'istante per percepire il movimento del carattere
    delay(velocita);
  }
}

void stampaOstacoli() {
  lcd.setCursor(2, 0);
  lcd.print("X");
  lcd.setCursor(5, 1);
  lcd.print("X");
  lcd.setCursor(7, 1);
  lcd.print("X");
  lcd.setCursor(9, 0);
  lcd.print("X");
  lcd.setCursor(12, 0);
  lcd.print("X");
}

Esercizio 1

Utilizzando l’esempio 2 esposto sopra, aggiungere la funzionalità che blocca l’avanzamento del carattere “*” nel caso in cui ci si scontra con l’ostacolo.

Esercizio 2

Definire tre matrici di ostacoli diversi e fare in modo che ad ogni avvio di Arduino la scelta della matrice venga fatta in modo casuale.

Esercizio 3

Aggiungere la funzionalità che permette di modificare la matrice degli ostacoli se si raggiunge l’ultima colonna a destra.

Esercizio 4

Definire tre scenari diversi costituiti da tre matrici ostacoli diversi. La navigazione può avvenire solamente all’interno di questi tre scenari. La partenza del carattere “*” avviene dalla colonna 0 del secondo scenario, il movimento dovrà essere il seguente:

  • partendo dalla colonna 0 del secondo scenario, la pressione del pulsante LEFT porta allo scenario 1 e il carattere “*” viene posizionato nella colonna 15 del display;
  • se si è nel secondo scenario in colonna 15, la pressione del pulsante RIGHT conduce alla colonna 0 del  3′ scenario;
  • la pressione del pulsante LEFT in colonna 0 del primo scenario non permette nessun cambiamento di scenario
  • la pressione del pulsante RIGHT in colonna 15 del terzo scenario non permette nessun cambiamento di scenario

Buon Coding a tutti 🙂