.. meta:: :language: it :description language=it: Embedded Systems Architecture: Esercitazione pilotare un Relay :description language=en: Embedded Systems Architecture: Practice drive RELAY :keywords: Embedded Systems Architecture, Drive RELAY :author: Luciano De Falco Alfano Sheet Arduino n.10 (RELAY) ================================= .. contents:: :local: [*Lezione del xx yyy 2019*] Premessa ------------------------- La `scheda della esercitazione n.10 `_, richiede di pilotare un relay tramite due pulsanti. In questo caso il prof.Morresi suggerisce di utilizzare un Grove Starter kit, che io non ho. Di conseguenza ho deciso di modificare il progetto utilizzando i componenti di un kit Elegoo. Questo però ha cambiato parecchio il progetto hardware. Progetto -------------- Infatti nel kit Elegoo è presente un relay "*puro*", e non una scheda relay. Qual'è la differenza? Usualmente per comandare un relay sono necessarie correnti relativamente sostenute. Nel ns caso il datasheet del `SRD-05VDC `_ richiede una corrente nominale a 5 V che va da circa 71 a 90 mA (per SRD high sensitivity). Arduino, in output può fornire al massimo 40 mA per ogni pin di I/O. Quindi non possiamo pilotare la commutazione del relay direttamente con i pin dell'Arduino [#]_. Questo ci constringe a dare una alimentazione separata al *coil* che comanda il relay, ed utilizzare Arduino per controllare questa alimentazione. Come? Ad esempio usando uno dei quattro switch che ci mette a disposizione un ponte H [#]_. L'integrato `L293D `_, presente in molti starter kit di Arduino, è proprio un ponte H. Il suo lato sinistro (piedini da 1 a 8) e l'ultimo piedino del lato destro (il 16), si presentano così: .. image:: ./exercises/l293d_sx.svg :align: center Quindi dovremo: * per il ponte H: * alimentare il piedino 16 (il primo in alto a dx) con la +5V da Arduino; * alimentare il piedino 8 (ultimo in basso lato sx) con una batteria; * comandare l'abilitazione del lato sx mandando in HIGH il piedino 1; * usare il piedino 2 per rovesciare la tensione del piedino 8 verso il *coil* del relay utilizzando il piedino 3; * i piedini 4 e 5 andranno a massa. * per il relay: * alimentare il centrale sx con la tensione +5V di Arduino; questa tensione andrà ad una delle uscite dx del relay a seconda: * a sx il relay sia alimentato a +9V => tensione a dx in basso; * a sx relay alimentato a 0V => tensione a dx in alto; * le uscite dx inviate in input ad Arduino sono con resistenza di pulldown. * due pulsanti: quello in alto per commutare il relay (uscita dx: colore verde) verso l'alto e quello in basso per commutarlo in basso (uscita dx: colore giallo). * infine le alimentazioni: * le rotaie a dx alimentate da una batteria da 9V; * le rotaie a sx alimentate dalla +5V dell'arduino; * le masse sono in comune (relative rotaie dx e sx collegate). Ecco una foto del circuito realizzato: .. image:: ./exercises/PIC_sh10.jpg :align: center Video ----------- Bene. Ecco il video del progetto: .. raw:: html Sketch ------------ Lo sketch è il seguente .. literalinclude:: ./exercises/sketch_sh10.ino :language: c :linenos: Sembra complesso, ma in realtà è solo un mucchio di definizioni :-) Nel setup imposto i diversi pin e la seriale per visualizzare verso il PC lo stato delle uscite del relay. Abbiamo due porte Arduino in output per pilotare una uscita del ponte H: sono le ln 15, per abilitare il lato sx del ponte, e 26 per pilotare l'output n.ro 1 del ponte. Nel loop leggo lo stato dei pulsanti (ln da 37 a 40) impostando la relativa variabile globale ``status``. Dopo di che, uso la variabile di stato per pilotare l'uscita del ponte H (ln da 41 a 44). Giochi fatti! Il resto è lettura dello stato delle uscite del relay (ln da 46 a 49) e relativo output verso il PC tramite la seriale. Alcune osservazioni --------------------- Sono soddisfatto perché il progetto finale è semplice, ma: * il fatto che lo stato delle uscite del relay dovessero essere controllate con le resistenze di pulldown è qualcosa che ho capito a fine progetto; se lo avessi focalizzato subito, probabilmente mi sarei risparmiato molti grattacapi e non avrei avuto necessità di utilizzare il ponte H; * la disposizione meccanica del piedino centrale sx del relay è un disastro: completamente fuori passo rispetto la breadboard [#]_; ho dovuto: * piegarlo con le pinze (con la paura di spezzarlo); * mettere un *ponticello* nella breadborad per facilitare il contatto (il piedino piegato era troppo corto per toccare con sicurezza il contatto del foro della breaboard); * e, nonostante gli aspetti predetti, a volte sono stato costretto a premere il relay con un dito per avere un contatto decente con la breadboard; * quando si preme un pulsante, attendere qualche secondo: il delay alla ln 57 è di 5 secondi; se si spinge e rilascia il pulsante dentro questo intervallo di tempo, non accade nulla. ------------------- .. [#] In teoria. In pratica, senza carico, ho sentito (acusticamente) che il relay scatta quando sollecitato da un pin digitale di Arduino UNO in output. .. [#] Wikipedia ha una sintetica introduzione allla url: `H-bridge `_. .. [#] Il bello è che Elegoo ne è cosciente. Nella loro documentazione è scritto di piegarlo per fare contatto. Peccato che non basti assolutamente: andrebbe saldato.