Il Fading Led è il degno esperimento che si contrappone al Blinking Led, stesso circuito ma diverso pin ed istruzione per Arduino. La digitalWrite diventa analogWrite e passiamo dal pin 13 classico al ~11 con capacità PWM.
Un segnale PWM (dall’inglese Pulse Width Modulation, ovvero modulazione a variazione della larghezza d’impulso) è un’onda quadra di duty cycle variabile, che permette di controllare l’assorbimento (la potenza assorbita) di un carico elettrico (un led o un motore), variando il duty cycle. Essendo Arduino un componente digitale, abbiamo fisicamente a che fare con onde quadre, quindi le grandezze che possono essere modulate sono: frequenza, durata, posizione.
Arduino ci viene incontro con i pin PWM contrassegnati dalla tilde, nel caso del mio test il numero 11. Tale modulazione accende e spegne il led a frequenze più o meno veloci tali da dare l’impressione, all’occhio umano, che in realtà non sia completamente accesso ma, opportunamente giostrata la modulazione, possa crearsi l’illusione che il led si accenda in modo progressivo.
Solitamente vengono fatti due esperimenti: uno di completa accensione/spegnimento progressivi tramite sketch in loop, l’altro “variando” la brillantezza del led tramite potenziometro sugli ingressi analogici. Sicuramente più avanti il secondo lo proverò fisicamente, ma oggi lo simulerò tramite Window Form.
Il tipo di dato che meglio di prestava allo sketch per renderlo leggero e performante era il byte, una scelta fondamentale che ha però creato qualche complicazione iniziale per farli interfacciare correttamente con tutte le strutture e cast evoluti di C#. Il problema di fondo era quello di trasmettere informazioni anche con frequenza di 5ms, senza perdere dati o farli processare in maniera scorretta. Ci sono volute un po’ di prove per arrivare ad una soluzione soddisfacente, sia per evitare che il Framework fosse troppo lento, sia per interfacciare completamente i tipi di dato complessi (gestiti in maniera strutturata dalla form) verso un tipo più semplice ma le esigenze e restrizioni precise del C/C++.
Alla fine sono arrivato al compromesso di un semplice ciclo if che gestisca il comando e successivamente il byte che sarà il parametro per la brillantezza del led. A livello Arduino infatti i pin PWM vengono gestiti in maniera direttamente proporzionale ai valori da 0 a 255, motivo eccellente per scegliere appunto il byte come variabile.
L’unica variazione sul circuito è data dal led verde che, con una tensione di giunzione più alta, facilità la visualizzazione dell’esperimento, in quanto ha un ciclo meno veloce di accensione rispetto a quello rosso. Già con un valore di 30 infatti, quello rosso era molto brillante, rendendo meno evidente la fase ascendente.
/* Author: Andrea Bonvissuto */ //Gestione PWM if (Command == 1) { led = Serial.read(); analogWrite(11, led); Serial.print("PWM = "); Serial.println(led, DEC); }
Nel lato C# l’applicazione è stata spurgata degli inutili tool di simulazione del led, mantenendo inalterati i gruppi ed aggiungendone due nuovi, più una form supplementare.
La nuova form ha il solo scopo di settare i parametri di connessione nel caso si volessero apportare variazioni o si verifichino problemi sulla porta seriale selezionata in automatico dal programma.
La Form, importazione di tools esclusa, è stata riscritta da capo così come la soluzione base. Attualmente esiste una classe specifica che estende SerialPort per gestire tutta la comunicazione seriale specifica agli standard Arduino, così da avere metodi sicuri per inviare dati formattati quasi come fosse un protocollo tra l’app e lo sketch. Ho implementato anche una classe specifica Led per avere la struttura perfetta di replicabilità, con tutte le funzioni utili ad interfacciarli con Arduino. Entrambe le classi cresceranno secondo necessità, anche se al momento sembra che sia stato gestito ogni particolare, tanto che c’è già un gruppo aggiuntivo disabilitato nella Form, ma servirà prossimamente.
Il primo nuovo raggruppamento è solo un gadget che calcola empiricamente la corrente nel circuito basandosi: sulla tensione di uscita dei pin Arduino, le tensioni di giunzione dei led secondo i colori e, ovviamente, il valore della resistenza in serie. Tutte le tensioni sono state inserite dopo la misurazione personale con il multimetro, implementando su breadboard i circuiti con i led dei cinque colori attualmente a mia disposizione.
Il secondo invece è la gestione PWM del pin 11, ovvero una trackbar che simula un potenziometro e la possibilità, invece, di vedere un ciclo di accensione/spegnimento variando il tempo di delay tra uno step di 5 punti su 255 ogni volta. Mediamente sui 20ms il risultato è apprezzabile.
Questa volta il grosso del lavoro è stato quello di realizzare, dopo diversi tentativi e prove di codice, un metodo per la classe led che passi dati in maniera corretta, e opportunamente convertita, per renderli velocemente ed inequivocabilmente interpretabili dallo sketch. Come per il vecchio blinking, anche in questo caso tutti gli step e tempi di fade sono comandati dal PC, dando modo di utilizzare solo il 7% di memoria di Arduino, ma avere tre funzioni ripetibili e interattive per i led collegati. Considerando che nel primo video, per due funzioni occupavo il 9%, direi che è un bel passo avanti.
Se siete interessati ad un buon kit di partenza, per qualche esperimento con Arduino, vi consiglio:
- Uno di questi Elegoo Starter Kit (testati e compatibili con l’IDE senza flashare il boot) con qualche sensore ed attuatore sfizioso
-
- Un kit 100 di led:
Se inoltre volete seguirmi in questa pazzia qui o su youtube, vi aspetto!!