Friday 28 February 2020

(IT) MCP23017 I/O port expander - Come usarlo con Arduino


Il chip MCP23017 è un moltiplicatore di porte I/O che utilizza il protocollo di comunicazione I2C. Puoi collegarlo al tuo Arduino usando solo due pin (quelli necessari per la comunicazione I2C) e in cambio ottieni altre 16 porte di ingresso/uscita digitali.
Inoltre puoi collegare in serie fino a otto chip in serie e ottenere 128 porte digitali, sempre al solo costo di due pin.

Questo è un semplice circuito che spiega come connettere e usare l'MCP23017: collega un pulsante momentaneo a
una porta di espansione e un LED a un'altra; Arduino, attraverso il moltiplicatore di porte, legge lo stato del pulsante (premuto o non premuto) e accende il LED di conseguenza.


Per realizzare il circuito hai bisogno di un Arduino (in questo caso UNO R3), una breadboard, un led, un pulsante momentaneo (normalmente aperto), una resistenza da 220 Ohm e una resistenza da 10K Ohm. Collegali insieme come segue:


  • collega la porta VDD del chip a + 5V;
  • collega la porta VSS del chip al GND;
  • collega la porta SCL del chip alla porta SCL dell'Arduino (pin A5 nella scheda UNO);
  • collega la porta SDA del chip alla porta SDA dell'Arduino (pin A4 nella scheda UNO);
  • collega le porte A0, A1 e A2 del chip a GND;
  • collega la porta RESET del chip a + 5V usando la resistenza da 10 K Ohm;
  • collega un lato del pulsante momentaneo alla porta GPA0 del chip, quindi collega l'altro lato a GND;
  • collega l'anodo (+) del led alla porta GPA7 del chip usando la resistenza da 220 Ohm;
  • collega il catodo (-) del LED a GND;
  • infine dai corrente al circuito tramite i pin 5V e GND dell'Arduino.


I pin 15, 16 e 17 dell'MCP (ovvero le porte A0, A1 e A2) sono molto importanti perché impostano l'indirizzo I2C del chip in base al modo in cui sono collegati; in questo modo è possibile assegnare un indirizzo univoco a ciascun MPC in una catena.
Nella tabella seguente puoi trovare le combinazioni delle tre porte e gli indirizzi corrispondenti:


Port connection

MCP23017
address
(max 8 units)

A0

A1

A2

GND
GND
GND
0
GND
GND
5V
1
GND
5V
GND
2
GND
5V
5V
3
5V
GND
GND
4
5V
GND
5V
5
5V
5V
GND
6
5V
5V
5V
7
tab.1 - Assigning the MPC an address

Mentre in questa altra tabella è associato un numero di pin a ciascuna porta dell'MCP:

MCP23017
pin

Port Name

Pin number to use
in Arduino sketch

21
GPA0
0
22
GPA1
1
23
GPA2
2
24
GPA3
3
25
GPA4
4
26
GPA5
5
27
GPA6
6
28
GPA7
7
1
GPB0
8
2
GPB1
9
3
GPB2
10
4
GPB3
11
5
GPB4
12
6
GPB5
13
7
GPB6
14
8
GPB7
15
tab.2 - Pin numbers

Ora lo scketch di Arduino. Per utilizzare facilmente l'MCP23017 è necessario installare la "Libreria Arduino MCP23017 Adafruit" nell'IDE di Arduino. È possibile installare la libreria tramite l'IDE Arduino utilizzando il Library Manager (disponibile dall'IDE versione 1.6.2). Una guida dettagliata sull'installazione delle librerie Arduino è disponibile qui.

Una volta installata la libreria possiamo procedere con lo sketch:


  1. #include <Wire.h>
  2. #include "Adafruit_MCP23017.h"
  3. Adafruit_MCP23017 mcp1;
  4. void setup() {  
  5.   mcp1.begin(0);
  6.   mcp1.pinMode(0, INPUT);
  7.   mcp1.pullUp(0, HIGH);
  8.   mcp1.pinMode(7, OUTPUT);
  9. }
  10. void loop() {
  11.   mcp1.digitalWrite(7, mcp1.digitalRead(0));
  12. }

Analizziamo il codice blocco per blocco.

  1. #include <Wire.h>
  2. #include "Adafruit_MCP23017.h"
  3. Adafruit_MCP23017 mcp1;

Iniziamo includendo nello sketch la libreria "Wire", che è già contenuta nell'IDE ed è necessaria per la comunicazione I2C, e la libreria che abbiamo appena installato. Alla riga 3 creiamo l'istanza di expander e la chiamiamo "mcp1"; questo è il nome che ho scelto io, tu puoi dargli il nome che vuoi.

  1.   mcp1.begin(0);
  2.   mcp1.pinMode(0, INPUT);
  3.   mcp1.pullUp(0, HIGH);
  4.   mcp1.pinMode(7, OUTPUT);

Alla riga 6 il comando mcp1.begin () viene utilizzato per inizializzare il moltiplicatore e per comunicare il suo indirizzo I2C univoco ad Arduino; poiché nel circuito che abbiamo realizzato le porte A0, A1 e A2 sono tutte collegate a GND, l'indirizzo che metteremo tra le parentesi è 0 (vedi tab.1).
Quindi impostiamo la modalità del pin 0 (ossia GPA0, vedi tab.2) e 7 (ossia GPA7) ai quali sono collegati rispettivamente il pulsante (input) e il led (output). Sulla linea 8 attiviamo la resistenza pull-up interna per il pin 0; questa resistenza è presente in tutte e sedici le porte dell'MCP23017. Come puoi vedere, la libreria di Adafruit ci consente di impostare i pin di espansione come faremmo con i pin di Arduino.

  1.   mcp1.digitalWrite(7, mcp1.digitalRead(0));

Infine nel loop () ci sono le due funzioni che leggono lo stato del pulsante e comandano il LED di conseguneza; anche in questo caso i comandi sono simili a quelli normalmente utilizzati per Arduino.

Nota: il posizionamento dei pin Arduino SCL e SDA varia da scheda a scheda; fai riferimento al pinout della tua scheda Arduino per trovarli.

Divertiti con il tuo moltiplicatore MCP23017.

No comments:

Post a Comment