Usiamo un oscilloscopio per studiare le uscite di Arduino usando le funzioni digitalWrite()
e analogWrite()
.
Lo sketch blink
Carichiamo sull’Arduino il classico sketch del LED lampeggiante:
void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); delay(1000); }
Il LED sarà acceso per 1 secondo (quando l’uscita è a 5 volt rispetto a GND) e spento per 1 secondo (quando l’uscita è a 0 volt rispetto a GND), avrà quindi un periodo di 2 secondi, che equivale a una frequenza di 0,5 Hz (500 mHz, dove mHz sta per millihertz) e un ciclo di lavoro (duty cycle) del 50%.
Questo è solo un programma di esempio perché l’attesa attiva con la funzione delay()
non permette di eseguire altre istruzioni, questo programma non può fare altro.
Verifica con l’oscilloscopio
Su Arduino Uno e Mega il LED è collegato sul pin 13 quindi la sonda dell’oscilloscopio deve essere collegata con il morsetto a coccodrillo su GND e il puntale di misura sul pin 13.
Nell’immagine precedente la scala verticale del canale 1 dell’oscilloscopio è 5 volt e quella orizzontale è 1 secondo, cioè l’altezza di un quadrato della griglia rappresenta 5 volt e la larghezza rappresenta 1 secondo di tempo.
Confrontando la traccia con la griglia possiamo confermare che l’uscita sulla quale è collegata la sonda dell’oscilloscopio presenta un segnale che ciclicamente è alto per 1 secondo e basso per 1 secondo. L’oscilloscopio in uso ha anche funzioni di misura di diversi parametri che si possono attivare sia come tabella nella parte alta dello schermo, sia su una riga singola nella parte bassa dello schermo), per cui è possibile leggere direttamente i valori del periodo 2 secondi (etichetta “Peri” nella tabella in alto) e del ciclo di lavoro 50% (etichette “+Duty” e “-Duty”).
Lo sketch PWM
La funzionalità di modulazione di larghezza d’impulso (PWM, Pulse Width Modulation) è disponibile su pin diversi secondo il tipo di Arduino; per questo esercizio usiamo il pin 13 sul Mega così non dobbiamo spostare la sonda del’oscilloscopio, sull’Uno possiamo usare i pin 5 o 6, per gli altri arduini vedere la guida in linea. Sul pin 13 del Mega e sui pin 5 e 6 dell’Uno la frequenza nominale di lavoro del PWM è 980 Hz.
Carichiamo sull’Arduino lo sketch seguente, dopo aver modificato la variabile pin_number
se non si sta usando Arduino Mega:
/* Demo per PWM Gruppo Utenti Linux Livorno 2022 */ #define ARRAY_SIZE(x) (sizeof x / sizeof *x) int pin_number = LED_BUILTIN; int pwm_values[] = {0, 32, 64, 128, 191, 255}; int pwm_value_index = 3; void set_output(int pwm_value) { analogWrite(pin_number, pwm_value); Serial.print("Valore attuale "); Serial.println(pwm_value); } void setup() { Serial.begin(9600); Serial.println("Inviare + per aumentare e - per diminuire"); set_output(pwm_values[pwm_value_index]); } void loop() { if (Serial.available()) { char c = Serial.read(); if (c == '+' && pwm_value_index < ARRAY_SIZE(pwm_values) - 1) { pwm_value_index++; } else if (c == '-' && pwm_value_index > 0) { pwm_value_index--; } else if (c == '\n' || c == '\r') { return; } set_output(pwm_values[pwm_value_index]); } }
Verifica con l’oscilloscopio
analogWrite | Ciclo atteso | Ciclo misurato |
0 | 0% | – |
32 | 12,5% | 12,62% |
64 | 25% | 25,24% |
128 | 50% | 50% |
191 | 75% | 74,51% |
255 | 100% | – |
La prima colonna della tabella precedente si può ricavare con una calcolatrice o con una riga di Python:
$ python3 -c "print([round(x / 100 * 255) for x in [0, 12.5, 25, 50, 75, 100]])"
[0, 32, 64, 128, 191, 255]
Una volta trovato il valore adatto, l’impostazione del PWM si riduce ad una singola chiamata di funzione eseguita una sola volta, come nell’esempio seguente:
int pin_number = LED_BUILTIN; int pwm_value = 64; void setup() { analogWrite(pin_number, pwm_value); } void loop() { // vuoto }