Sheet Arduino n.10 (RELAY)

[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 1.

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 2.

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ì:

_images/l293d_sx.svg

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:

_images/PIC_sh10.jpg

Video

Bene. Ecco il video del progetto:

Sketch

Lo sketch è il seguente

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/* Embedded Systems Architecture - hardware
 *  application on sheet 10
 *  
 *  open/close relay contact using button
 *  - push yellow button sets relay yellow output high
 *  - push green button sets relay green output high
 *
 *  relay datasheet: 
 *  http://datasheetcafe.databank.netdna-cdn.com/wp-content/uploads/2015/10/SRD-05VDC-SL-C-Datasheet.pdf
 */
 
#define GREEN_BUTTON  12
#define YELLOW_BUTTON  2
#define ENABLE_SX      9
#define INPUT1         6
#define GREEN          5
#define YELLOW         4
#define FOREVER        1

char status = 'G';

void setup() {
    pinMode(GREEN_BUTTON, INPUT);
    pinMode(YELLOW_BUTTON, INPUT);
    pinMode(ENABLE_SX, OUTPUT);
    pinMode(INPUT1, OUTPUT);
    pinMode(GREEN, INPUT);
    pinMode(YELLOW, INPUT);
    Serial.begin(9600);            // init the serial at 9600 baud
    digitalWrite(ENABLE_SX, HIGH);
    delay(10);
}

void loop() {
    int green;
    int yellow;
    if (digitalRead(GREEN_BUTTON)==HIGH)
        status = 'G';
    else if(digitalRead(YELLOW_BUTTON)==HIGH)
        status = 'Y';
    if (status=='G')
        digitalWrite(INPUT1, LOW);
    else if(status=='Y')
        digitalWrite(INPUT1, HIGH);
    delay(150);
    green = digitalRead(GREEN);
    delay(10);
    yellow = digitalRead(YELLOW);
    delay(10);
    Serial.print("drive: ");
    Serial.print(status);
    Serial.print(", green: ");
    Serial.print(green);
    Serial.print(", yellow: ");
    Serial.println(yellow);
    //while(FOREVER){}
    delay(5000);

}

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 3; 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.


1

In teoria. In pratica, senza carico, ho sentito (acusticamente) che il relay scatta quando sollecitato da un pin digitale di Arduino UNO in output.

2

Wikipedia ha una sintetica introduzione allla url: H-bridge.

3

Il bello è che Elegoo ne è cosciente. Nella loro documentazione è scritto di piegarlo per fare contatto. Peccato che non basti assolutamente: andrebbe saldato.