### Progetto 2: Regolare la Luminosità del LED
#### **(1)Descrizione:**
Nella lezione precedente, abbiamo controllato l'accensione e lo spegnimento del LED facendolo lampeggiare.
In questo progetto, controlleremo la luminosità del LED tramite PWM simulando un effetto di respirazione. Allo stesso modo, è possibile modificare la lunghezza del passo e il tempo di ritardo nel codice per ottenere diversi effetti di respirazione.
Il PWM è un mezzo per controllare l'uscita analogica tramite metodi digitali. Il controllo digitale viene utilizzato per generare onde quadre con diversi cicli di lavoro (un segnale che passa costantemente tra livelli alti e bassi) per controllare l'uscita analogica.
In generale, le tensioni di ingresso delle porte sono 0V e 5V. Cosa succede se sono richiesti 3V? O una commutazione tra 1V, 3V e 3.5V? Non possiamo cambiare continuamente i resistori. Per questo motivo, ricorriamo al PWM.

Per le uscite di tensione delle porte digitali di Arduino, esistono solo livelli BASSO e ALTO, che corrispondono rispettivamente alle uscite di tensione di 0V e 5V. È possibile definire BASSO come "0" e ALTO come "1", e lasciare che Arduino emetta cinquecento "0" o "1" in 1 secondo. Se vengono emessi cinquecento "1", corrisponde a 5V; se tutti sono "0", corrisponde a 0V; se viene emesso il pattern 250 01, corrisponde a 2.5V.
Questo processo può essere paragonato alla visione di un film. I film che guardiamo non sono completamente continui. In realtà, vengono generate 25 immagini al secondo, che l'occhio umano non riesce a distinguere. Pertanto, lo interpretiamo come un processo continuo. Il PWM funziona allo stesso modo. Per emettere tensioni diverse, è necessario controllare il rapporto tra 0 e 1. Più "0" o "1" vengono emessi per unità di tempo, più il controllo è preciso.
#### **(2)Parametri:**

Interfaccia di controllo: Porta digitale 3
Tensione di lavoro: DC 3.3-5V
Passo tra i pin: 2.54mm
Colore del display LED: giallo
#### **(3)Schema di Collegamento:**
I pin PWM di Arduino sono collegati a 3, 5, 6, 9, 10 e 11. Mantenere invariato il pin 9

#### **(4)Codice di Test:**
(**Nota:** Non collegare il modulo Bluetooth prima di caricare il codice, poiché il caricamento del codice utilizza anche la comunicazione seriale e potrebbero verificarsi conflitti con la comunicazione seriale Bluetooth, causando il fallimento del caricamento.)
```C
/*
Keyestudio Mini Tank Robot V3 (Popular Edition)
lesson 2.1
pwm
http://www.keyestudio.com
*/
int LED = 9; // Definisce il pin del LED come 9
void setup ()
{
pinMode(LED, OUTPUT); // Imposta il pin del LED su OUTPUT
}
void loop ()
{
for (int value = 0; value < 255; value = value + 1)
{
analogWrite(LED, value); // LED acceso
delay(5); // ritardo di 5ms
}
for (int value = 255; value > 0; value = value - 1)
{
analogWrite(LED, value); // il LED si affievolisce
delay(5); // ritardo di 5ms
}
}
```
#### **(5)Risultati del Test:**
Dopo aver caricato correttamente il codice di test, il LED cambia gradualmente da luminoso a scuro, come il respiro umano, anziché accendersi e spegnersi immediatamente.
#### **(6)Spiegazione del Codice:**
Per ripetere alcune istruzioni specifiche, possiamo usare l'istruzione FOR. Il formato dell'istruzione FOR è mostrato di seguito:

Sequenza ciclica FOR:
Turno 1:1 → 2 → 3 → 4
Turno 2:2 → 3 → 4
…
Finché il numero 2 non è più verificato, il ciclo "for" termina.
Dopo aver compreso questo ordine, torniamo al codice:
**for (int value = 0; value \< 255; value=value+1){**
**...}**
**for (int value = 255; value \>0; value=value-1){**
**...}**
Le due istruzioni "for" fanno aumentare il valore da 0 a 255, poi diminuire da 255 a 0, poi aumentare di nuovo a 255,... in ciclo infinito.
Nel codice è presente una nuova funzione ----- analogWrite()
Sappiamo che la porta digitale ha solo due stati, 0 e 1. Come si invia quindi un valore analogico a un valore digitale? Qui è necessaria questa funzione. Osserviamo la scheda Arduino e troviamo 6 pin contrassegnati con "\~" che possono emettere segnali PWM.
Il formato della funzione è il seguente:
**analogWrite(pin,value)**
analogWrite() viene utilizzata per scrivere un valore analogico da 0 a 255 per la porta PWM, quindi il valore è nell'intervallo 0\~255. Attenzione: è possibile scrivere solo sui pin digitali con funzione PWM, come il pin 3, 5, 6, 9, 10, 11.
Il PWM è una tecnologia per ottenere quantità analogiche tramite metodi digitali. Il controllo digitale forma un'onda quadra, e il segnale dell'onda quadra ha solo due stati di accensione e spegnimento (ovvero livelli alti o bassi). Controllando il rapporto tra la durata dell'accensione e dello spegnimento, è possibile simulare una tensione variabile da 0 a 5V. Il tempo di accensione (accademicamente denominato livello alto) è chiamato larghezza di impulso, quindi il PWM è chiamato anche modulazione della larghezza di impulso.
Attraverso le seguenti cinque onde quadre, approfondiamo la conoscenza del PWM.

Nella figura sopra, la linea verde rappresenta un periodo, e il valore di analogWrite() corrisponde a una percentuale chiamata anche Ciclo di Lavoro (Duty Cycle).
Il ciclo di lavoro indica che la durata del livello alto è divisa per la durata del livello basso in un ciclo. Dall'alto verso il basso, il ciclo di lavoro della prima onda quadra è 0% e il suo valore corrispondente è 0. La luminosità del LED è minima, ovvero spento. Più a lungo dura il livello alto, più il LED è luminoso. Pertanto, l'ultimo ciclo di lavoro è 100%, che corrisponde a 255, e il LED è al massimo della luminosità. E il 25% significa più scuro.
Il PWM viene utilizzato principalmente per regolare la luminosità del LED o la velocità di rotazione dei motori.
Svolge un ruolo fondamentale nel controllo dei robot car intelligenti. Sono sicuro che non vedete l'ora di passare al prossimo progetto.
#### **(7)Esercitazione Avanzata:**
Modifichiamo il valore del ritardo mantenendo invariato il pin, quindi osserviamo come cambia il LED.
**Codice di Test**
(**Nota:** Non collegare il modulo Bluetooth prima di caricare il codice, poiché il caricamento del codice utilizza anche la comunicazione seriale e potrebbero verificarsi conflitti con la comunicazione seriale Bluetooth, causando il fallimento del caricamento.)
```C
/*
Keyestudio Mini Tank Robot V3 (Popular Edition)
lesson 2.2
pwm-slow
http://www.keyestudio.com
*/
int LED = 9; // Definisce il pin del LED come 9
void setup()
{
pinMode(LED, OUTPUT); // Imposta il pin del LED su OUTPUT
}
void loop ()
{
for (int value = 0; value < 255; value = value + 1)
{
analogWrite(LED, value); // LED acceso
delay(30); // ritardo di 30ms
}
for (int value = 255; value > 0; value = value - 1)
{
analogWrite(LED, value); // il LED si affievolisce
delay (30); // ritardo di 30ms
}
}
```
Dopo aver caricato il codice sulla scheda di sviluppo, il LED lampeggia più lentamente.