mercoledì 21 gennaio 2015

MCP23017 - Moltiplicatore di porte per Arduino



Il chip MCP23017 è un'expander di ingressi/uscite che sfrutta il protocollo di comunicazione I2C. Potete collegarlo al vostro Arduino utilizzando solo due pin (quelli necessari alla comunicazione I2C) e in cambio ottenere 16 porte di I/O digitali.
Inoltre potete concatenare fino a otto expander in serie e ottenere 128 porte digitali, sempre al solo costo di due pin.

Qui di seguito vi propongo un semplice circuito per spiegarvi come collegare e usare l'MCP23017: collegate ad una porta dell'expander un pulsante e ad un'altra un led; Arduino, attraverso il moltiplicatore di porte, legge l'input del pulsante e accende il led di conseguenza.



Per realizzare il circuito avete bisogno di un Arduino (in questo caso una scheda UNO R3), una breadboard,
un led, un pulsante momentaneo (normalmente aperto) e una resistenza da 10K Ohm e collegarli assieme come segue :
  • collegate la porta VDD dell'expander a +5V
  • collegate la porta VSS dell'expander al GND (Ground)
  • collegate la porta SCL dell'expander al pin analogico 5 di Arduino
  • collegate la porta SDA dell'expander al pin analogico 4 di Arduino
  • collegate le porte A0, A1 e A2 dell'expander al GND (Ground)
  • collegate la porta RESET dell'expander a +5V tramite una resistenza da 10K
  • collegate a porta GPA0 dell'expander a un pulsante momentaneo e collegate quest'ultimo al GND (Ground)
  • collegate la porta GPA7 dell'expander al catoto (-) del led e l'anodo(+) del led a +5V
  • infine alimentate il circuito tramite i pin 5V e GND di Arduino.

I piedini 15, 16 e 17 dell'integrato MCP (ossia le porte A0, A1 e A2) sono molto importanti perché il modo in cui queste vengono collegate imposta l'indirizzo I2C dell'expander; in questo modo, se ne collegate più di uno in catena, potete assegnare ad ognuno un indirizzo univoco.
In questa tabella riporto le combinazioni di collegamento delle tre porte e gli indirizzi corrispondenti:

Collegamento porte

Indirizzo
MCP23017
(max 8 unità)

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 - Assegnare un ID all'expander

Mentre in quest'altra tabella viene associato un numero di pin ad ogni porta dell'expander:

Piedino
MCP23017

Nome porta

Numero pin

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 - Numerazione dei pin

Passiamo allo sketch di Arduino. Per usare in maniera facile l'MCP23017 è necessario scaricare e installare nell'IDE una libreria creata dal team di Adafruit e che potete scaricare dal loro GitHub.

Per installarla dovete cliccare sul tasto "Download zip" a destra e salvare il file in una qualunque posizione del vostro hard disk; seguite poi questa guida ufficiale del sito di Arduino per finalizzare l'installazione. La guida è in inglese ma Google Translate può risolvere qualsiasi problema di lingua.

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;

Nella parte iniziale si includono nello sketch la libreria "Wire", che è già contenuta nell'IDE ed è necessaria alla comunicazione I2C, e la libreria che abbiamo appena installato. Alla riga 3 c'è la creazione dell'istanza dell'expander che è stata chiamata "mcp1".

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

Alla riga 1 il comando mcp1.begin() serve ad inizializzare l'expander e a comunicare il suo indirizzo I2C univoco ad Arduino; poiché nel circuito che abbiamo realizzato le porte A0, A1 e A2 sono tutte collegate a massa, l'indirizzo da inserire tra le parentesi è 0 (vedi tab.2).
Poi ci sono le indicazioni della modalità dei pin 0 (ossia GPA0, vedi tab.2) e 7 (ossia GPA7), ai quali sono collegati rispettivamente il pulsante (input) e il led (output). Alla riga tre viene attivata, per il pin 0, la resistenza di pullup interna al chip e presente su tutte le porte. Come potete osservare, la libreria Adafruit ci permette di impostare il setup dei pin dell'expander in maniera del tutto simile a quello che usiamo per i pin di Arduino.

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

Infine nel loop() ci sono le due funzioni che permettono di leggere lo stato del pulsante e comandare contestualmente il led; anche in questo caso i comandi sono simili a quelli che si utilizzano normalmente per Arduino.
Nota bene: le porte dell'expander, quando attive, sono normalmente a 5V. Quando il pulsante momentaneo è premuto la porta alla quale è collegato va a 0. Quindi il led è stato cablato in maniera da accendersi quando la porta alla quale è collegato, mimando il pin 0, va a 0, mentre si spegne quando questa è a 5V.
Nota bene bis: il posizionamento dei pin SCL e SDA di Arduino variano da scheda a scheda; fate riferimento alle caratteristiche del modello che volete usare per individuarli.

Buon divertimento con il vostro expander.