Archivi categoria: arduino

Micro storie di attività di making scolastico

Il setting sul banco di lavoro è importante.

Spieghi come usare un qualsiasi componente elettronico, ma se questo è collocato al di fuori della breadboard comincia il disordine, quindi “pensa che ti ripensa” e nasce l’idea di qualcosa di molto più pratico, trasportabile adattabile ad ogni tipo di sperimentazione, ma che non posso realizzare in poco tempo… più avanti (un paio di settimane) ne condividerò il progetto che ho in testa.

Ho bisogno che venga risolto un piccolissimo problema per giovedì prossimo: evitare che i servomotori si rompano o si perdano durante le sperimentazioni in laboratorio.

Passo 1
5 minuti per trovare un supporto per micro servomotori su Thingiverse, metti in stampa durante il primo intervallo e disegni con illustrator delle basette su cui collocare il servo, (un rettangolo e 4 cerchi ed una L 🙂 )

Passo 2
Durante il secondo intervallo corri al Lab Territoriale per tagliare a laser il compensato su cui fissare i servomotori

Passo 3
Domani durante l’ultima ora della mattinata, quando il calo glicemico degli allievi è tale per cui risulta difficile ragionare, chiedi di assemblare il tutto.

Piccole cose che rendono la vita didattica un pochino più ordinata.

Grazie Pinin 🙂

Poiché mi è stato chiesto via mail, condivido link dei file.

Evitare il loop di messaggi inviati sulla Serial Monitor

Con questo post rispondo ad alcuni miei studenti su quesiti posti sull’uso di Arduino durante il ripasso condotto in questi giorni sulla modalità di stampa di messaggi sulla Serial Monitor.

L’esercizio assegnato consisteva nella tipica accensione e spegnimento di un LED mediante un pulsante con antirimbalzo software, nella seconda parte bisognava aggiungere un secondo pulsante che permetteva di accendere e spegnere un secondo LED e nella terza fase segnalare l’accensione e lo spegnimento sulla Serial Monitor mediante i messaggi:

“LED Rosso ON”
“LED Rosso OFF”
“LED Verde ON”
“LED Verde OFF”

Qundi per ciascun LED, alla prima pressione del pulsante accensione del LED e segnalazione ON sulla Serial, alla seconda pressione del pulsante segnalazione OFF sulla Serial e spegnimento del LED, ovviamente senza alcun limite sul numero di pressioni sui pulsanti.

Gli studenti sono riusciti a realizzare lo sketch ma con il solito problema di ripetizione in loop del testo di segnalazione sulla Serial.

Il problema può essere superato utilizzando un codice simile al seguente:

int stampaMessaggio = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  if(!stampaMessaggio)
  {
     Serial.println(“Qualsiasi testo da stampare una sola volta…“);
     stampaMessaggio = 1;
  }
}

Nel primo ciclo di loop la condizione dell’if risulterà vera e ciò permetterà l’esecuzione della stampa del testo,  successivamente impostata la variabile “stampaMessaggio” ad 1 non sarà più possibile stampare il testo al ciclo di loop successivo in quanto “!stampaMessaggio” risulterà uguale a 0.

Di seguito le due soluzioni, la prima con testo in loop sulla Serial, mentre la seconda con testo NON in loop.

Al fondo del post un esercizio aggiuntivo per i miei studenti.

All’interno del codice la spiegazione del funzionamento.

Soluzione con testo di output in loop

/*
   Prof. Michele Maffucci
   Accensione e spegnimento
   23.09.19

   Accensione e spegnimento di LED mediante pulsanti
   con antirimbalzo e messaggio ripetuto dello stato del LED
   sulla Serial Monitor

   Pulsante Rosso: accensione e spegnimento LED Rosso
   (prima pressione accende, seconda pressione spegne)

   Pulsante Verde: accensione e spegnimento LED Verde
   (prima pressione accende, seconda pressione spegne)

*/

// ledRosso variabile di tipo intero a cui viene assegnato
// il valore intero 5 che sarà associato al pin digitale 5

int ledRosso = 5;

// ledVerde variabile di tipo intero a cui viene assegnato
// il valore intero 4 che sarà associato al pin digitale 4

int ledVerde = 4;


// pulsanteRosso variabile di tipo intero a cui viene assegnato
// il valore intero 7 che sarà associato al pin digitale 7
// a cui sarà collegato il pulsante che comanda il LED Rosso

int pulsanteRosso = 7;

// pulsanteVerde variabile di tipo intero a cui viene assegnato
// il valore intero 6 che sarà associato al pin digitale 6
// a cui sarà collegato il pulsante che comanda il LED Verde

int pulsanteVerde = 6;

// inizializzazione della variabili in cui verrà memorizzato il valore della
// digitalRead: 0 non premuto, 1 premuto

int valRosso = 0;
int valVerde = 0;

// inizializzazione della variabili in cui verrà memorizzato lo stato del pulsante
// All'avvio dello sketch i pulsanti non sono premuti

int statoRosso = 0;
int statoVerde = 0;

// inizializzazione della variabili in cui verrà memorizzato lo stato precedente del pulsante
// All'avvio dello sketch i pulsanti non sono premuti

int valRossoOld = 0;
int valVerdeOld = 0;

void setup() {
  pinMode(ledRosso, OUTPUT);           // imposta il pin digitale come output
  pinMode(ledVerde, OUTPUT);           // imposta il pin digitale come output
  pinMode(pulsanteRosso, INPUT);       // imposta il pin digitale come input
  pinMode(pulsanteVerde, INPUT);       // imposta il pin digitale come input

  Serial.begin(9600);                 // imposta la velocità di scrittura della serial monitor
}

void loop() {

  valRosso = digitalRead(pulsanteRosso);  // lettura dell'input (pulsante) e memorizzazione in valRosso
  valVerde = digitalRead(pulsanteVerde);  // lettura dell'input (pulsante) e memorizzazione in valVerde

  // ---------- Controllo pulsante LED Rosso ----------

  if ((valRosso == HIGH) && (valRossoOld == LOW)) {
    statoRosso = 1 - statoRosso;

    // antirimbalzo software - attesa di 15 ms per attendere che l'input si stabilizzi
    delay(15);
  }


  // memorizzazione del valore precedente restituito dalla digitalRead

  valRossoOld = valRosso;

  // ---------- Controllo pulsante LED Verde ----------

  // viene controllato che l'input sia HIGH (pulsante premuto) e cambia lo stato del LED

  if ((valVerde == HIGH) && (valVerdeOld == LOW)) {
    statoVerde = 1 - statoVerde;

    // antirimbalzo software - attesa di 15 ms per attendere che l'input si stabilizzi

    delay(15);

    // memorizzazione del valore precedente restituito dalla digitalRead
  }

  valVerdeOld = valVerde;

  // ---------- Stampa sulla Serial Monitor dello stato del LED Rosso ----------

  // Se il pulsante è stato premuto la condizione dell'if risulta vera ed il LED Rosso si accende

  if (statoRosso == 1) {
    digitalWrite(ledRosso, HIGH);
    Serial.println("LED Rosso ON");
  }

  // nel caso in cui il pulsante non sia premuto o nello stato precedente era stato premuto
  // allora il LED dovrà essere spento ed il messaggio sulla seriale dovrà essere "LED Rosso OFF"

  else {
    digitalWrite(ledRosso, LOW);
    Serial.println("LED Rosso OFF");
  }

  // ---------- Stampa sulla Serial Monitor dello stato del LED Verde ----------

  // Se il pulsante è stato premuto la condizione dell'if risulta vera ed il LED Verde si accende

  if (statoVerde == 1) {
    digitalWrite(ledVerde, HIGH);
    Serial.println("LED Verde ON");
  }

  // nel caso in cui il pulsante non sia premuto o nello stato precedente era stato premuto
  // allora il LED dovrà essere spento ed il messaggio sulla seriale dovrà essere "LED Verde OFF"

  else {
    digitalWrite(ledVerde, LOW);
    Serial.println("LED Verde OFF");
  }
}

Soluzione con testo di output NON in loop

/*
   Prof. Michele Maffucci
   Data: 23.09.19

   Accensione e spegnimento di LED mediante pulsanti
   con antirimbalzo e messaggio NON ripetuto dello stato del LED
   sulla Serial Monitor

   Stampa 1 sola volta il messaggio dello stato del LED sulla Serial Monitor
   (non va in loop la stampa dello stato del LED)

   Pulsante Rosso: accensione e spegnimento LED Rosso
   (prima pressione accende, seconda pressione spegne)

   Pulsante Verde: accensione e spegnimento LED Verde
   (prima pressione accende, seconda pressione spegne)

*/

// ledRosso variabile di tipo intero a cui viene assegnato
// il valore intero 5 che sarà associato al pin digitale 5

int ledRosso = 5;

// ledVerde variabile di tipo intero a cui viene assegnato
// il valore intero 4 che sarà associato al pin digitale 4

int ledVerde = 4;


// pulsanteRosso variabile di tipo intero a cui viene assegnato
// il valore intero 7 che sarà associato al pin digitale 7
// a cui sarà collegato il pulsante che comanda il LED Rosso

int pulsanteRosso = 7;

// pulsanteVerde variabile di tipo intero a cui viene assegnato
// il valore intero 6 che sarà associato al pin digitale 6
// a cui sarà collegato il pulsante che comanda il LED Verde

int pulsanteVerde = 6;

// inizializzazione della variabili in cui verrà memorizzato il valore della
// digitalRead: 0 non premuto, 1 premuto

int valRosso = 0;
int valVerde = 0;

// inizializzazione della variabili in cui verrà memorizzato lo stato del pulsante
// All'avvio dello sketch i pulsanti non sono premuti

int statoRosso = 0;
int statoVerde = 0;

// inizializzazione della variabili in cui verrà memorizzato lo stato precedente del pulsante
// All'avvio dello sketch i pulsanti non sono premuti

int valRossoOld = 0;
int valVerdeOld = 0;

// inizializzazione delle variabili che consentono la stampa dello stato del LED

int stampoRossoON = 0;
int stampoRossoOFF = 0;

int stampoVerdeON = 0;
int stampoVerdeOFF = 0;

void setup() {
  pinMode(ledRosso, OUTPUT);           // imposta il pin digitale come output
  pinMode(ledVerde, OUTPUT);           // imposta il pin digitale come output
  pinMode(pulsanteRosso, INPUT);       // imposta il pin digitale come input
  pinMode(pulsanteVerde, INPUT);       // imposta il pin digitale come input

  Serial.begin(9600);                 // imposta la velocità di scrittura della serial monitor
  Serial.println("Avvio programma");  // stampa la stringa tra le " e va a campo
  Serial.println("---------------");  // stampa la stringa tra le " e va a campo
}

void loop() {

  valRosso = digitalRead(pulsanteRosso);  // lettura dell'input (pulsante) e memorizzazione in valRosso
  valVerde = digitalRead(pulsanteVerde);  // lettura dell'input (pulsante) e memorizzazione in valVerde

// ---------- Controllo pulsante LED Rosso ----------

  // viene controllato che l'input sia HIGH (pulsante premuto) e cambia lo stato del LED

  if ((valRosso == HIGH) && (valRossoOld == LOW)) {
    statoRosso = 1 - statoRosso;

    // antirimbalzo software - attesa di 15 ms per attendere che l'input si stabilizzi
    delay(15);

    // poichè il pulsante è stato premuto la variabile stampoRossoON viene posta a 0
    // per consentire la stampa del messaggio "LED Rosso ON"

    stampoRossoON = 0;
  }

  // memorizzazione del valore precedente restituito dalla digitalRead

  valRossoOld = valRosso;

// ---------- Controllo pulsante LED Verde ----------

  // viene controllato che l'input sia HIGH (pulsante premuto) e cambia lo stato del LED

  if ((valVerde == HIGH) && (valVerdeOld == LOW)) {
    statoVerde = 1 - statoVerde;

    // antirimbalzo software - attesa di 15 ms per attendere che l'input si stabilizzi

    delay(15);

    // poichè il pulsante è stato premuto la variabile stampoVerdeON viene posta a 0
    // per consentire la stampa del messaggio "LED Verde ON"

    stampoVerdeON = 0;
  }

  // memorizzazione del valore precedente restituito dalla digitalRead

  valVerdeOld = valVerde;

// ---------- Stampa sulla Serial Monitor dello stato del LED Rosso ----------

// Se il pulsante è stato premuto la condizione dell'if risulta vera ed il LED Rosso si accende

  if (statoRosso == 1) {
    digitalWrite(ledRosso, HIGH);

    // Se la variabile stampoRossoON è 0 allora !stampoRossoON vale 1
    // ciò consente la stampa del messaggio "LED Rosso ON"

    if (!stampoRossoON) {
      Serial.println("LED Rosso ON");

      // Per evitare una stampa continua del messaggio viene posto ad 1 stampoRossoON
      // in modo che nel ciclo di loop successivo non venga più stampato il messaggio
      // "LED Rosso ON". Viene posto a 0 stampoRossoOFF per consentire la stampa "LED Rosso OFF"
      // nel caso si prema nuovamente il pulsante che controlla il LED Rosso.

      stampoRossoON = 1;
      stampoRossoOFF = 0;
    }
  }

  // nel caso in cui il pulsante non sia premuto o nello stato precedente era stato premuto
  // allora il LED dovrà essere spento ed il messaggio sulla seriale dovrà essere "LED Rosso OFF"

  else {
    digitalWrite(ledRosso, LOW);

    if (!stampoRossoOFF) {
      Serial.println("LED Rosso OFF");

      // Per evitare una stampa continua del messaggio viene posto ad 0 stampoRossoON
      // in modo che nel ciclo di loop successivo non venga più stampato il messaggio
      // "LED Rosso OFF". Viene posto a 1 stampoRossoOFF per consentire la stampa "LED Rosso OFF"
      // nel caso si prema nuovamente il pulsante che controlla il LED Rosso.

      stampoRossoON = 0;
      stampoRossoOFF = 1;
    }
  }

// ---------- Stampa sulla Serial Monitor dello stato del LED Verde ----------

// Se il pulsante è stato premuto la condizione dell'if risulta vera ed il LED Verde si accende

  if (statoVerde == 1) {
    digitalWrite(ledVerde, HIGH);

    // Se la variabile stampoVerdeON è 0 allora !stampoVerdeoON vale 1
    // ciò consente la stampa del messaggio "LED verde ON"

    if (!stampoVerdeON) {
      Serial.println("LED Verde ON");

      // Per evitare una stampa continua del messaggio viene posto ad 1 stampoVerdeON
      // in modo che nel ciclo di loop successivo non venga più stampato il messaggio
      // "LED Verde ON". Viene posto a 0 stampoVerdeOFF per consentire la stampa "LED Verde OFF"
      // nel caso si prema nuovamente il pulsante che controlla il LED Rosso.

      stampoVerdeON = 1;
      stampoVerdeOFF = 0;
    }
  }

  // nel caso in cui il pulsante non sia premuto o nello stato precedente era stato premuto
  // allora il LED dovrà essere spento ed il messaggio sulla seriale dovrà essere "LED Verde OFF"

  else {
    digitalWrite(ledVerde, LOW);

    if (!stampoVerdeOFF) {
      Serial.println("LED Verde OFF");

      // Per evitare una stampa continua del messaggio viene posto ad 0 stampoVerdeON
      // in modo che nel ciclo di loop successivo non venga più stampato il messaggio
      // "LED Verde OFF". Viene posto a 1 stampoVerdeOFF per consentire la stampa "LED Verde OFF"
      // nel caso si prema nuovamente il pulsante che controlla il LED Verde.

      stampoVerdeON = 0;
      stampoVerdeOFF = 1;
    }
  }
}

Esercizio: implementare il controllo della marci e dell’arresto di un motore

Realizzare un circuito in cui con tre pulsanti vengono identificate le tre situazioni:

  1. Marcia
  2. Arresto
  3. Anomalia

Associare ad ogni situazione il colore del LED:

  1. Rosso: marcia
  2. Verde: arresto
  3. Giallo: anomalia

Alla pressione del corrispondente pulsante mostrare sulla Serial Monitor :

  1. Motore in marcia
  2. Motore fermo
  3. Anomalia motore

Buon lavoro 🙂

Nuova famiglia Arduino Nano

Ricevo e volentieri pubblico la rassegna stampa di Arduino.cc in cui viene presentata la nuova famiglia di Arduino Nano.

New Arduino Nano family

Small, iconic, powerful. An affordable, robust, compact and easy to program board’s family, with Arduino ‘signature’ quality.

Maker Faire Bay Area, May 17th 2019, Arduino announces the new Nano family.
Designed with makers in mind, the new Nano family offers affordable boards for everyday projects. Retaining  Arduino quality and reliability they make it easier than ever to turn your project ideas into a reality. They are  compatible with classic Arduino boards, have low energy consumption and more powerful processors.

New Nano family is composed by 4 boards:

  • Arduino Nano Every – perfect ​for everyday projects.
  • Arduino Nano 33 IoT – small, secure and IoT connected.
  • Arduino Nano 33 BLE – small, low-power, and Bluetooth connected.
  • Arduino Nano BLE Sense – small, low-power, and Bluetooth connected with a wide range of on-board sensors.

For makers who want to prototype compact projects, the Arduino Nano offer a small and powerful solution,  affordable for everyone, but with the Arduino quality our users deserve. Because every project counts.

Massimo Banzi – co-founder of Arduino – commented: ​“The new Nano’s are for those millions of makers who  love using the Arduino IDE for it’s simplicity and open source aspect, but just want a great value, small and powerful board they can trust for their compact projects. With prices from as low as $9.90 for the Nano Every,  this family fills that gap in the Arduino range, providing makers with the Arduino quality they deserve for those  everyday projects”.

A focus on new boards

Arduino Nano Every
The Arduino Nano Every is a miniature sized module based on the Microchip ATMega4809 microcontroller. The  board can be used in a breadboard when mounting pin headers, or as a SMT module directly soldered on a PCB  thanks to its castellated pads. It’s a compact workshorse, that can replace the classic Arduino Nano in all  projects where users need more capabilities. An ATSAMD11 (with Arm Cortex M0+ processor) acts as a high  performance USB to serial converter that could re-programmed by skilled users to achieve even more.

Arduino Nano 33 IoT
The Arduino Nano 33 IoT is a miniature sized module containing an Arm Cortex-M0+ processor based ATSAMD21  microcontroller, a WiFi+BT module based on Espressif ESP32, a 6-axis IMU, and a crypto chip which can securely  store certificates and pre shared keys. The board can either be used in a breadboard, or as a SMT module,  directly soldering it via the castellated pads. An ATSAMD11 Arm Cortex-M0+ processor acts as a high  performance USB to serial converter that could re-programmed by skilled users to achieve even more. The board is compatible with Arduino IoT Cloud.

Arduino Nano 33 BLE
The Arduino Nano 33 BLE is a miniature sized module containing a ublox NINA B306 module, based on Nordic  nRF52480 and containing an Arm Cortex-M4F and a 9-axis IMU. The module can either be mounted as a DIP  component, or as a SMT component, directly soldering it via the castellated pads.

Arduino Nano BLE Sense
The Arduino Nano 33 BLE Sense is a miniature sized module containing a ublox NINA B306 module, based on  Nordic nRF52480 and containing a powerful Arm Cortex-M4F and a large set of sensors. The module can either  be mounted as a DIP component, or as a SMT component, directly soldering it via the castellated pads. Built for low power consumption, Nano 33 BLE Sense is designed for environmental sensing (barometer, humidity,  temperature, light) and human interface applications thanks to the embedded microphone and proximity/gesture sensor.

The Arduino Nano family is available in pre-order. Arduino Nano Every and Arduino Nano 33 IoT are available from  mid June. Arduino Nano 33 BLE and Arduino Nano BLE Sense are available from mid July.

[press release]

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

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 🙂