Primi passi con Arduino e oscilloscopio

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.

Traccia del blink 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

analogWriteCiclo attesoCiclo misurato
00%
3212,5%12,62%
6425%25,24%
12850%50%
19175%74,51%
255100%

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
}
analogWrite 32
analogWrite 64
analogWrite 128
analogWrite 191
analogWrite 255