Mais Pinos I/O para Arduino: PCF8575

Tempo de leitura: 5 minutes
  • Adicionando pinos IO ao Arduino UNO.
  • Apresentando o PCF8575.
  • Circuito com 16 relés de amostra.
 Um Arduino Uno (ou Genérico)
Um PCF8575
Um módulo de 16 relés

 

Mais Pinos IO para Arduino

Você não tem alfinetes no seu Arduino para esse projeto que você tem em mente? Bem, se assim for, você veio ao lugar certo. Continue lendo e verá que adicionar pinos aos nossos micro controladores é muito mais fácil do que você pensou.

Normalmente, os pinos que possuem um Arduino UNO ou um ESP32 disponível são suficientes para fazer tutoriais ou pequenas invenções, mas assim que você começa a aceitar pedidos de clientes o número de pinos disponíveis fica muito mais rápido do que você gostaria. Sim. Eu sei que o Arduino MEGA ou DUE, tem bastante mais alguns pinos disponíveis, mas, mesmo assim, no final eles podem não ser suficientes.

Aumentar o número de pinos de entrada ou saída acaba sendo uma necessidade inalienável e o sistema de adicionar mais Arduinos UNO para usar seus pinos acaba sendo muito impraticável para que alguma outra solução seja imposta.

E como eu costumo dizer a você, se lhe ocorreu que seria bom ter um chip que tivesse várias saídas adicionais que pudéssemos controlar confortavelmente com nossos Arduinos, já existem alguns prontos que desenvolveram chips com esses recursos para ver se eles são capazes de obter a pasta com eles e no final basta olhar para o que o mercado nos oferece, porque embora pareça uma mentira e você seja o mais inteligente do seu povo, não somos os únicos humanos inteligentes e há pessoas que já trabalharam no assunto para nós e é o suficiente para puxar a carteira (neste caso muito pouca massa)

É por isso que me pareceu sensato dedicar algumas sessões para ver como usar esses chips que resolvem a cédula quando o número de pinos disponíveis começa a crescer além do que normalmente precisamos em Arduino. Nesta sessão vamos falar sobre o chip integrado PCF8575, como conectá-lo aos nossos Arduinos e como programá-lo para adicionar 16 portas adicionais de saídas de entrada com um mínimo de complicações (Além de lançar 16 cabos adicionais)

 

O CI PCF8575

O PCF8575 é um expansor de porta de entrada/saída controlado por I2C que permite aumentar o número de pinos digitais disponíveis na maioria dos dois controladores de corrente adicionando 16 portas digitais bidirecionais.

Para os amigos do Arduino, normalmente vamos comprá-lo na forma de Breakout Board, para poder manuseá-lo confortavelmente, como é o caso do cartão que mostro acima e que incorpora o PCF8575 Integrado (cuja folha de dados você tem aqui ).

Suas principais características são:

  • Expansor I2C
  • Entrada/Saída de 16 bits
  • Barramento I2C de 400Khz
  • Endereço I2C através de 3 pinos de hardware (permite até 8 unidades no mesmo barramento I2C)
  • Saídas travadas.

Para que possamos usá-lo com Arduinos e similares, temos que começar como de costume, baixando a biblioteca correspondente que você pode encontrar aqui.

Clique no código e depois baixe o zip e você poderá instalar a biblioteca normalmente com seu Arduino (\\Program\Include Library\Add ZIP library).

 

ESQUEMA DE CONEXÃO

No meu caso e como exemplo vou usar um módulo de 16 relés, para ilustrar o manuseio de 16 saídas digitais usando apenas as duas linhas de controle do barramento I2C, e você vai ver que é bem fácil, embora jogar 16 cabos para o expansor é nojento, você pode usar os que quiser.

Na verdade, na imagem da conexão eu só vou pintar 8 linhas de conexão porque se eu colocar todo o resultado seria um desgosto de observação muito difícil então eu vou me permitir esta pequena licença (E para pura vagrancy, é claro)

Aqui está o esquema das conexões:

Observe, só usamos duas linhas Arduino que correspondem aos pinos I2C (A5 e A6), além de Vcc e GND para alimentar o circuito. Mas na imagem você vê que eu enviei 8 linhas de controle para o módulo de relé, que realmente controlam o estado deles a partir do expansão através das ordens enviadas por Arduino a partir do I2C.

A maneira de controlar as saídas do expansor PCF8575 é a mais simples se você estiver acostumado com a sintaxe Arduino. Temos que incluir a biblioteca que baixamos acima:////

#include "PCF8575.h"

Em seguida, definimos uma instância do expansor, onde você verá que incluímos seu endereço I2C padrão (0x20):

PCF8575 EXT(0x20);

E agora estamos prontos para usar os pinos extras. A biblioteca define uma série de constantes para seu uso, principalmente referentes aos pinos de saída ou entrada do expansor, da mesma forma que as do Arduino são numeradas do pino 0 ao pino 13, as do expansor são numeradas de P0 a P15 , para que possamos declarar o pino 12 como saída e 10 como entrada no setup, assim:

EXT.pinMode(12, OUTPUT);
EXT.pinMode(10, INPUT);

Para inicializar a instância:

EXT.begin();

E pronto, agora podemos usar os pinos como se fossem os pinos usuais do Arduino. Por exemplo, podemos ler o pino 10 para uma variável bool e atribuir a saída 12:

bool V10 = EXT.digitalRead(10);
EXT.digitalWrite(12, LOW);

Ou seja, exatamente igual a qualquer outro pino digital em seu Arduino, com exceção de preceder digitalRead ou digitalWrite pelo nome do objeto PCF8575 que você instancia, e isso é tudo.

 

Exemplo de Programa

Como exemplo prático vou utilizar um programa com um Arduino UNO, no qual faremos uma sequência de acionamento dos 16 relés de um módulo de 16 entradas, que controlaremos diretamente dos pinos de saída do PCF8575

Para isso vamos fazer um programa que passa por um ciclo de ativação dos relés 0 a 15, desativando o relé ao passar para o próximo.

Para isso vou fazer um pequeno truque que consiste, em vez de usar as descrições dos pinos, que indiquei acima como P0, P1, P2…. P15, vou usar a nomenclatura 0,1,2, …15 porque é muito mais apropriado o programa poder fazer um for que os rege.

O programa ficaria assim, mais ou menos:

#include "PCF8575.h"
PCF8575 EXT(0x20);

Começamos incluindo a biblioteca correspondente e então instanciamos um objeto do tipo PCF8575 (que é uma maneira distorcida de dizer que criamos um objeto desse tipo). Como vou governar um módulo externo de 16 relés com apenas os 2 pinos I2C do Arduino, minha intenção é fazer um loop onde eles sejam ativados e desativados em sequência com um tempo de pausa entre cada operação, portanto, vamos para definir o tempo dessa pausa:

int pause = 400;

Vamos ao Setup para fazer o usual e inicializar o objeto que acabamos de criar:

EXT.begin();

E agora temos que programar as 16 portas que vamos usar como saídas, e como sou muito preguiçoso não vou fazer uma a uma, mas vou usar um loop for (2 linhas, não 16):

for (int i=0; i<16; i++)
     EXT.pinMode(i, OUTPUT);

Com isso vamos fazer outro par de loops que ativam e desativam os 16 relés em ordem (Vamos lá, como um led piscando, mas com relés)

for (int i=0; i<16; i++)
   { Serial.println(i);
     EXT.digitalWrite(i, LOW);
     delay (pause);
     EXT.digitalWrite(i, HIGH);
     delay (pause);
   }

Lembre-se que as definições de P0 a P15 correspondem ao intervalo de 0 a 15, e nós o usamos para contar o for, isso é tudo. Aqui está o programa completo para download: (AQUI)