Errori comuni nell’uso di Arduino – evitare lo stato flottante di un pin di Arduino

Uno degli errori tipici che riscontro durante le correzioni degli esercizi dei miei studenti alle prime esperienze nell’uso dei microcontrollori, è quello di ritenere che su un pin non collegato a nulla vi sia la presenza di uno stato logico LOW, questo non è corretto. Viene definito floating (flottante) un pin di ingresso a cui non è collegato nulla, in questa condizione sul pin potrebbe essere presente qualsiasi stato.

L’uso di un resistore collegato in modalità pull-up o pull-down costringerà il pin a uno stato noto, ma questa non è l’unica modalità.  E’ possibile fissare uno stato su un pin utilizzando un metodo, in parte già illustrato in un mio precedente post, che sfrutta l’utilizzo di un resistore di pull-up interno alla scheda. Per abilitare questa resistenza sarà sufficiente indicare all’interno del setup la funzione pinMode() con largomento “INPUT_PULLUP” oppure nella stessa maniera utilizzando le istruzioni:

pinMode(pin, INPUT);       // imposta 'pin' come input
digitalWrite(pin, HIGH);   // attiva la resistenza di pull-up,
                           //'pin' viene impostato HIGH

Per entrambe le modalità noterete che il LED è normalmente accesso, alla pressione del pulsante si spegnerà.

Circuito

 

Modalità 1

void setup() {
  pinMode(8, OUTPUT);       // Utilizzo del LED sul pin 8

  // Abilita la resistenza interna di Pull-Up
  pinMode(7, INPUT);        // Collegamento del pulsante al pin 7
  digitalWrite(7, HIGH);    // attiva la resistenza di pull-up, sul pin 7

}

void loop() {
  bool statoPulsante = digitalRead(7);   // memorizza lo stato corrente sul pin 7
  digitalWrite(8, statoPulsante);        // accende il LED se statoPulsante e 1, lo spegne se 0
}

Modalità 2

void setup() {
  pinMode(8, OUTPUT);              

  // INPUT_PULLUP abilita la resistenza interna di Pull-Up
  pinMode(7, INPUT_PULLUP);       // Collegamento del pulsante al pin 7
}

void loop() {
  bool statoPulsante = digitalRead(7);  // memorizza lo stato corrente sul pin 7
  digitalWrite(8, statoPulsante);       // accende il LED se statoPulsante e 1, lo spegne se 0
}

Nel caso abbiate la necessità di invertire lo stato e fare in modo che il LED sia normalmente spento e si accenda alla pressione del pulsante sarà sufficiente applicare l’operatore NOT, indicato con il simbolo “!”  alla funzione digitalRead(7):

bool statoPulsante = !digitalRead(7);

Lo sketch completo sarà:

void setup() {
  pinMode(8, OUTPUT);              

  // INPUT_PULLUP abilita la resistenza interna di Pull-Up
  pinMode(7, INPUT_PULLUP);       // Collegamento del pulsante al pin 7
}

void loop() {
  bool statoPulsante = !digitalRead(7);  // memorizza lo stato corrente sul pin 10
  digitalWrite(8, statoPulsante);        // accende il LED se statoPulsante e 1, lo spegne se 0
}

Potete trovare un ulteriore esempio di applicazione alla pagina 78 delle slide: Alfabeto di Arduino – lezione 2

Il Coding con il nuovo Scratch 3: per una didattica attiva – 2ª edizione

Innegabile, l’uso di Scratch interessa tantissimo, ne ho continuamente riscontro anche quando svolgo corsi in presenza. Appassionano tantissmo le nuove possibilità di connessione ai dispositi esterni: Lego Mindstorms Ev3, Lego WeDo 2.0, BBC micro:bit, MakeyMakey e molte delle domande che mi sono state fatte durante la passata edizione riguardavano l’interazione con questi kit didattici utilissimi per fare Coding e Robotica.
Ecco che la proposta di Tecnica della Scuola non si è fatta attendere e pertanto condurrò dalla prossima settimana un corso che ha i medesimi contenuti, però metterò ancor di più in evidenza le nuove caratteristiche di interattività con nuove proposte di sperimentazione.

Nel caso foste interessati si solgeranno 4 incontri in webinar di 2 ore ciascuno per un totale di 8 ore di formazione

  • 
Mercoledì 8 maggio 2019 – Ore 17.00/19.00
  • Mercoledì 15 maggio 2019 – Ore 17.00/19.00
  • Giovedì 30 maggio 2019 – Ore 17.00/19.00
  • Venerdì 31 maggio 2019 – Ore 17.00/19.00

Per i contenuti e per la la modalità di iscrizione vi rimando al sito di Tecnica della Scuola.

Arduino – Approfondimenti sulla modulazione di larghezza di impulso (PWM)

Scrivo questo post ad integrazione della lezione: Arduino – lezione 06: modulazione di larghezza di impulso (PWM) che sto utilizzando con i miei studenti di 4′ informatica per illustrare le modulazioni di tipo digitali. L’obiettivo è quello di mostrare sull’oscilloscopio come varia il  Duty Cycle di un’onda quadra su un pin di tipo PWM di Arduino utilizzato per impostare l’intensità luminosa di un LED mediante una regolazione applicata attraverso un trimmer connesso al pin A0 di Arduino.

Oltre alla visualizzazione sull’oscilloscopio si desidera, come riscontro, la stampa sulla Serial Monitor dei seguenti valori:

  • Tensione in input sul pin A0
  • Valore restituito dalla funzione analogRead() – (tra 0 e 1023)
  • Valore restituito dall’analogWrite – (tra 0 e 254)
  • Valore percentuale del Duty Cycle  (tra 0% e 100%)

Il circuito da realizzare con l’indicazione delle connessioni all’oscilloscopio è il seguente:

Sul canale X verrà visualizzata l’onda quadra in uscita dal pin 11 il cui Duty Cycle sarà regolato agendo sul trimmer.

Sul canale Y verrà visualizzata la tensione continua in input sul pin A0, che sarà convertita dal convertitore Analogico Digitale di Arduino in un valore compreso tra 0 e 1023  (risoluzione di 10 bit). Ricordo che tale conversione sarà fatta con l’istruzione analogRead(pin).

Poiché uno degli obiettivi è quello di visualizzare la tensione rilevata sul pin A0, ricordo che tale misurazione viene fatta utilizzando la funzione analogRead(pin) che legge il valore di tensione (compreso tra 0 e 5V) applicato sul piedino analogico ‘pin’ con una risoluzione di 10 bit e la converte in un valore numerico compreso tra 0 e 1023, corrispondente quindi ad un intervallo di 1024 valori, pertanto ogni intervallo corrisponde ad un valore di tensione Vu di:

Per sapere quindi il valore di tensione rilevato (nell’intervallo tra 0V e 5V) sarà sufficiente moltiplicare la tensione unitaria Vu per il valore restituito dalla funzione analogRead(pin), valore quantizzato indicato con Vq compreso tra 0 e 1023:

Sapendo che Vu corrisponde a 4,88 mV

possiamo anche scrivere che:

Questa formula sarà inserita all’interno dello sketch.

Di seguito la schermata dell’oscilloscopio che visualizza la situazione indicata dai dati stampati sulla Serial Monitor:

  • Vmax(2) indica la tensione in ingresso ad A0 (la piccola discrepanza tra valore indicato sull’oscilloscopio e la stampa sulla Serial Monitor dipende dalle approssimazioni di calcolo).
  • Vmax(1) indica il valore di picco della tensione sul pin 11.

La spiegazione del funzionamento dello sketch sono dettagliate nei commenti:

/* Prof. Michele Maffucci
   03.06.2019
 
   Regolazione luminosità LED mediante
   trimmer, si utilizza la funzione map

   Stampa sulla seriale:
   - del valore di tensione sul pin A0
   - del valore restituito dall'analogRead
   - del valore restituito dall'analogWrite
   - del valore del Duty Cycle %
 
   Questo codice è di dominio pubblico 
*/

// pin analogico su cui inviare la tensione analogica (pin A0)
int misura = 0;

// pin a cui è connesso il LED
int pinLed = 11;

// variabile in cui conservare il valore inserito su A0
long val = 0;

// variabile in cui memorizzare il Duty Cycle
int inputVal = 0;

const long VoltRiferimento = 5.0; // valore di riferimento


void setup(){
  Serial.begin(9600);      // inizializzazione della comunicazione seriale
  pinMode(pinLed, OUTPUT); // definizione di ledPin come output
}

void loop(){
  // analogRead leggerà il valore su A0 restituendo un valore tra 0 e 1023
  // per approfondimenti si consulti il link: http://wp.me/p4kwmk-1Qd
  val = analogRead(misura);

  // analogWrite() accetta come secondo parametro (PWM) valori tra 0 e 254
  // pertanto "rimappiamo" i valori letti da analogRead() nell'intervallo
  // tra 0 e 254 usando la funzione map
  // per approfondimenti si consulti il link: http://wp.me/p4kwmk-1Tu
  inputVal = map(val, 0, 1023, 0, 254);
  
  // accendiamo il LED con un valore del Duty Cycle pari a val
  analogWrite(pinLed,inputVal);

  // Tensione inviata sul pin analogico A0.
  // Valore in virgola mobile.

  float volt = (VoltRiferimento/1024.0)*val;

  // visualizzazione il valore della tensione su A0,
  // del valore restituito dalla analogRead,
  // del valore restituito dall'analogWrite
  // e del Duty Cycle %

  // per approfondimenti sull'uso di String si consulti il link: https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/
  
  Serial.println(String("Tensione su A0: ") + volt + "V" + String(";  ") + "analogRead: " + val + String(";  ") + String("Valore analogWrite: ") + inputVal + String("; ") + String("Duty Cycle %: ") + (inputVal/255.0)*100 + String("%;"));
  delay(500); // stampa una strina di valori ogni mezzo secondo
}

Buon Coding a tutti 🙂

Coding a scuola con BBC micro:bit – inviamo messaggi via radio

Condivido una scheda didattica che ho utilizzato durante i miei corsi, è una variante alle sperimentazioni proposte sul sito ufficiale di micro:bit. Alla fine di questa lezione propongo una serie di attività di approfondimento suddivise per scuola elementare e scuola media e superiore. Per rendere più agevolo lo svolgimento della sperimentazione in classe, al fondo di questo tutorial condivido il file in formato PDF.

OBIETTIVO

  • Alla pressione del pulsante A inviare un messaggio di testo utilizzando la funzione radio di micro:bit

REQUISITI

  • Per lo svolgimento dell’attività è indispensabile avere almeno due micro:bit

Usare la funzione radio di micro:bit

  • Il micro:bit può funzionare come una radio, può inviare e ricevere messaggi attraverso un segnale radio
  • Una radio che può inviare e ricevere informazioni è chiamata ricetrasmettitore
  • Attraverso il segnale radio di micro:bit è possibile inviare testo, numeri o anche informazioni dai sensori collegati al micro:bit

Configurazione della trasmissione radio

  • Così come accade per una trasmissione radio che deve essere selezionata per ascoltarla, così anche con micro:bit bisogna selezionare una stazione, nel caso di micro:bit viene chiamato canale o gruppo, in questo modo due o più micro:bit “sintonizzandosi” sul medesimo gruppo potranno ricevere ed inviare messaggi sul gruppo.
  • L’impostazione del gruppo avviene selezionando un numero da 0 a 255, per fare un’analogia con la radio con cui ascolti la musica e come se ci fossero 255 stazioni radio su cui però non puoi solo ascoltare, ma anche inviare i tuoi messaggi.

IMPOSTAZIONE DEL micro:bit CHE INVIA IL MESSAGGIO

PASSO 1

Cancellare l’istruzione forever trascinarla sulla sezioni istruzioni oppure click con tasto destro sull’istruzione e successivamente Delete Block

PASSO 2

Dalla sezione Radio trascinare l’istruzione radio set group 1 all’interno dell’istruzioneon start

PASSO 3

Il messaggio dovrà essere inviato quando viene premuto il pulsante A. Dalla sezione Input inserire nell’area di programmazione un’istruzione “on button A pressed

PASSO 4

Dalla sezione Radio trascinare l’istruzione radio  send string “ ”  ” all’interno dell’istruzioneon button A pressed

PASSO 5

All’interno dell’istruzione radio send string “ ”  ” all’interno delle virgolette, inserire il vostro messaggio, ad esempio: “Ciao”:

PASSO 6

Fate click su Download per trasferire il programma sul primo micro:bit


IMPOSTAZIONE DEL micro:bit CHE RICEVE IL MESSAGGIO

PASSO 7

Per visualizzare il messaggio ricevuto dalla sezione Radio trascinare l’istruzione
on radio received receivedString nell’area di programmazione:

PASSO 8

Dalla sezione Basic selezionare le istruzioni show string e trascinarla all’interno dell’istruzione on radio received receivedString

PASSO 9

Dalla sezione Variables trascinare la variabile receivedString all’interno del campo di testo dell’istruzione show string

PASSO 10

Fate click su Download per trasferire il programma sul secondo micro:bit

PASSO 11

Provate a premere il pulsante A sul primo micro:bit, il messaggio “Ciao” comparirà sul secondo micro:bit


Esercizi per gli studenti di scuola elementare

  1. Fate in modo che il primo micro:bit sia in grado di ricevere messaggi
  2. Fate in modo che il secondo micro:bit sia in grado di inviare messaggi
  3. Inviare messaggi diversi in funzione del pulsante premuto
  4. Inviare e ricevere valori numerici invece di testo
    (suggerimento: usare radio send number e on radioreceivedNumber)

Esercizi per gli studenti di scuola media e superiore

  1. Predisporre i due micro:bit un di fianco all’altro come indicato nella figura.
    Quando viene premuto il pulsante B del micro:bit 1 compare sul suo display una freccia che scorre da sinistra verso destra puntando in direzione del micro:bit 2. Una volta che la freccia scompare dal display del micro:bit 1 comparirà scorrendo da sinistra verso destra sul display del micro:bit 2 e scorrendo uscirà dal display del micro:bit 2.
    Allo stesso modo quando viene premuto il pulsante A del micro:bit 2 compare sul suo display una freccia che scorre da destra verso sinistra puntando in direzione del micro:bit 1. Una volta che la freccia scompare dal display del micro:bit 2 comparirà scorrendo da destra verso sinistra sul display del micro:bit 1 e scorrendo uscirà dal display del micro:bit 1.
  2. Premendo il pulsante A sul display viene visualizzato il numero casuale e premendo il pulsante B il numero casuale viene inviato al secondo micro:bit
  3. Quando su entrambi i micro:bit viene premuto un pulsante, su entrambi viene visualizzato un conto alla rovescia da 5 a 0 e successivamente viene visualizzata la stessa immagine su entrambi i micro:bit tra tre scelte possibili: carta, sasso o forbice

Per rendere più agevole l’utilizzo in classe, allego questa scheda di lavoro impaginata in formato PDF.

scheda di lavoro – inviamo messaggi via radio (PDF)

Buon Coding a tutti 🙂

M5Stack FIRE

Da qualche giorno utilizzo l’M5stack Fire development kit, si tratta di un un kit di prototipazione basato su un chip ESP32 che permette di realizzare in tempi rapidissimi, applicazioni IoT con la possibilità di utilizzare una serie di schede di espansione di diverso tipo, oppure potete costruirne di vostre. Le schede di espansione si aggiungono impilandole, al di sotto del cuore del kit (la parte in rosso nell’immagine) una sull’altra e sono tra esse vincolate con dei magneti.


Perché ho acquistato M5Stack? Ho la necessità di sviluppare un prototipo di un robot per un progetto didattico in tempi brevi, il progetto necessita di display touch con connessione WiFi, Bluetooth. Ho l’esigenza di costruire rapidamente un’interfaccia grafica su un display da cui gestire il comportamento del robot, inoltre ho bisogno di avere anche degli output sonori e luminosi, quindi leggendo le specifiche dell’M5stack e guardando alcuni video dimostrativi, ho pensato di sperimentarne l’uso. Ovviamente non nego la curiosità nell’utilizzare l’oggetto 🙂

M5Stack Fire è costituito da tre unità separabili. Nell’unità superiore è alloggia tutta l’elettronica principale, l’ESP32, l’antenna 2.4G, l’elettronica per la gestione dell’alimentazione, schermo LCD touch. La parte centrale è chiamata base M5GO, all’interno trova posto una batteria al litio, una presa M-BUS, due strisce LED RGB e altre due porte GROVE. La parte inferiore è adibita alla ricarica, può essere collegata alla base M5GO tramite pin POGO. All’interno dell’M5Stack si trova anche una IMU in grado di fornire la posizione nello spazio del dispositivo.
I moduli disponibili sono moltissimi ed un elenco completo può essere visto seguendo il link, si va dai moduli GSM, moduli PLC, LORA, telecamere e sensoristica di ogni genere, gestione motori, interfacce per Lego Mindstorms e molto altro.

Caratteristiche

  • 5V DC power supply
  • USB Type-C
  • ESP32-based
  • 16 MB Flash
  • 4 MB PSRAM
  • MPU9250
  • Speaker, 3 Pulsanti, LCD(320*240), 1 Reset
  • 2.4G Antenna: Proant 440
  • TF card slot (Dimensione massima 16G)
  • Battery Socket & 1Batteria Lipo da 50 mAh 
  • Connessioni Pins & Holes per l’espansione
  • Grove Port
  • M-Bus Socket & Pins
  • Piattaforme di sviluppo UIFlow, MicroPython, Arduino

Caratteristice ESP32

  • 240 MHz dual core Tensilica LX6 microcontroller con 600 DMIPS
  • Memoria integrata: 520 KB SRAM
  • Integrata sulla scheda: 802.11b/g/n HT40 Wi-Fi transceiver, baseband, stack e LWIP
  • Integrata sulla scheda: dual mode Bluetooth (classic and BLE)
  • Hall sensor
  • Interfaccia capacitiva touch 10x 
  • 32 kHz crystal oscillator
  • PWM/timer input/output available per ogni pin GPIO 
  • SDIO master/salve 50MHz
  • Supporto SD-card

Per maggiori informazioni

  • Sito di riferimento: https://m5stack.com
    da cui accedere alla documentazione, esempi di utilizzo ed accesso all’interfaccia di programmazione a blocchi.
  • Caratteristiche tecniche dettagliate seguendo il link.
  • Canale YouTube da cui potete vedere diverse sperimentazioni

Ho acquistato M5Stack FIRE su Amazon, ma trovate il dispositivo e schede di espansione anche su diversi store cinesi (sul sito di riferimento trovate tutti i link).

Nel breve pubblicherò alcuni risultati sulle sperimentazioni condotte con M5Stack FIRE.

Buon making a tutti 🙂