PCF8574 – I²C para LCD

PCF8574 – I²C para LCD

Em alguns projetos a utilização de um display LCD é essencial para a integração e organização dos dados, e as vezes há necessidade de se utilizar vários sensores e/ou atuadores o que implica no máximo de pinos estejam disponíveis, neste caso uma solução para os display’s 16×2 e 20×4 é a utilização do módulo de I2C para conexão do LCD com o microcontrolador.

Existem diversos tipos de módulos, porém o que vamos abordar é o que utiliza o chip PCF8574 que é um multiplexador muito conhecido, alguns fabricantes já vendem seus LCDs com este módulo embutido, este é um módulo muito barato se comparado com outros e possui diversas bibliotecas disponíveis para a integração nos códigos e fazer seu máximo aproveitamento.

O protocolo I2C permite a conexão de até 256 dispositivos em seu barramento, cada um destes dispositivos deve ter um endereço específico, no PCF é possível configurar esse endereçamento, porém só é possível escolher 8 endereços devido a ter apenas 3 pinos dedicados ao endereçamento. O endereçamento muda do modelo PCF8574 para o PCF8574A.

O modelo PCF8574 da NXP segue os seguintes endereços em hexadecimal para as configurações de pinos, lembrando de que 1 é 5V e 0 é o GND:

Pinos (A2 | A1 | A0)Endereço
0 | 0 | 020h
0 | 0 | 121h
0 | 1 | 022h
0 | 1 | 1 23h
1 | 0 | 0 24h
1 | 0 | 1 25h
1 | 1 | 0 26h
1 | 1 | 1 27h

Para o modelo PCF8574A da NXP temos os seguintes endereços em hexadecimal:

Pinos (A2 | A1 | A0)Endereço
0 | 0 | 038h
0 | 0 | 139h
0 | 1 | 03Ah
0 | 1 | 1 3Bh
1 | 0 | 0 3Ch
1 | 0 | 1 3Dh
1 | 1 | 0 3Eh
1 | 1 | 1 3Fh

Para realizar a comunicação o PCF8574 transforma a transmissão de dados tipo serial do I2C para transmissão paralela que é a padrão utilizada para conectar o LCD com um microcontrolador.

Modulo PCF8574 ArduínoESP32ESP8266
GNDGNDGNDGND
Vcc5V3,3V ou VIN3,3V ou VIN
SDAA4GPIO21GPIO4
SCLA5GPIO22GPIO5

Você pode baixar os datasheets dos PCF8574 e PCF8574A, aqui no XProjetos.net, exite a versão da Texas Instruments e também da NXP:

ícone

PCF8574 – Texas Instruments – Datasheet 2,71MB 29 downloads

Datasheet detalhado feito pela Texas Instruments do Chip PCF8574 de Multiplexação…
ícone

PCF8574A – Texas Instruments – Datasheet 2,38MB 11 downloads

Datasheet detalhado feito pela Texas Instruments do Chip PCF8574A de Multiplexação…
ícone

PCF8574 / PCF8574A – NXP – Datasheet 794,81KB 16 downloads

Datasheet detalhado feito pela NXP do Chip PCF8574 e PCF8574 de Multiplexação I²C….

Aplicações

O uso mais comum do PCF8574 é para o LCD, a biblioteca mais utilizada no display LCD é a “LiquidCrystal_I2C” que pode ser baixada diretamente da interface do Arduino, do PlataformIO do Visual Studio Code ou do site do desenvolvedor.

Todas os comando que você utiliza na biblioteca LiquidCrystal comum você pode utilizá-lo no I2C, porem com uma função extra que é a função de controle de LED background:

lcd.setBacklight(LOW);
//ou
lcd.setBacklight(HIGH);

Outra aplicação é para teclado matricial onde você pode utilizá-lo para leitura de dados, recebendo os dados em diversos pinos e transmitindo para o I2C utilizando apenas dois pinos de dados e dois da alimentação. Existem diversos tipos de teclado matricial, um dos mais conhecidos é o keypad com membrana que é muito barato:

Dois tipos de teclados matriciais um 4×3 e outro 4×4.

Estes tipos de teclados devem ser utilizados com técnicas de varredura onde é feito através de multiplexação uma varredura de uma linha e coluna por vez em um frequência alta pra se verificar se algum botão foi pressionado.

Varredura de um teclado fonte: https://electronics.stackexchange.com/

No Arduino ou outro microcontrolador estes teclados se utilizariam de 7 a 8 pinos de dados para o funcionamento, porem se utilizarmos um multiplexador podemos diminuir para 2 pinos utilizando o protocolo I2C.

Funcionamento

Como mencionado anteriormente é possível conectar vários dispositivos I²C em um barramento devido ao endereçamento é possível separa os dispositivos

O I2C trabalha com seus dois fios, o SDA (linha de dados) e o SCL (linha do relógio).

Ambas as linhas são de dreno aberto, mas pode fica com nivel lógico em alto usando resistores de pull-up.

Normalmente, há um mestre e um ou vários escravos na linha, embora possa haver vários mestres.

Exemplo de Funcionamento de dispositivos I2C. Fonte: www.mbeddedc.com

Os mestres e os escravos podem transmitir ou receber dados; portanto, um dispositivo pode estar em um destes quatro estados: transmissão mestre, recepção mestre, transmissão escrava, recepção escrava.

Calculo dos Resistores de Pull-up

Para calcular o resistor de Pull-up para o barramento I²C, ambos os cálculos usam como base a capacitância do barramento, essa capacitância muitas das vezes é fornecida nos datasheets dos componentes o valor normalmente empregado em uma comunicação entre dois dispositivos I²C é de 10pF e a capacitância máxima tolerada é de 400pF acima disto é necessário usar “repetidores” ou “hubs” para gerencia mais dispositivos. Quanto maior o numero de dispositivos e também a distancia entre eles maior será a capacitância, pois o comprimento do fio influencia na capacitância do barramento.

Uma observação muito importante caso você ache muito complicado o calculo dos resistores, normalmente é utilizado um resistor de 10KΩ para propósitos simples, também pode se adotar: 10KΩ  para frequência de 100KHz e 2KΩ para 400KHz até 1MHz,ou colocar um valor intermediário de 4,7KΩ.

Também deve se está atento a frequência, pois se você colocar um resistor muito grande você pode deformar o sinal digital, abaixo segue alguns exemplos de ondas com tipos de frequências e resistências adotadas:

Representação de resistência e frequência. Fonte: https://small-roar.com/

Um dos modos de cálculos é fornecido pela Texas Instruments que é um dos maiores fabricantes de chips dos EUA. Você pode ver na integra no PDF abaixo:

ícone

Cálculo do resistor de Pull-up de barramento I²C – Manual 157,29KB 27 downloads

Manual Inglês de Calculo para Resistor para o barramento I²C da Texas Instruments…

Neste documento é fornecido uma série de fórmulas para calculo, porem só duas irão nos interessar que é a do Rp(min) e Rp(max) que é o valor máximo e mínimo que pode ser adotado para o resistor de Pull-up, o resistor que você escolher deve estar entre estes dois valores. a seguir segue o Rp(min):

Onde:

  • Vcc é a tensão de alimentação dos sistema.
  • Vol(max) é a tensão máxima registrada como baixa pelos pinos I2C do disposítivo ou microcontrolador.
  • Iol é a corrente do sinal em nível baixo (bit 0)

Para o Rp(max) temos a seguinte formula:

Onde:

  • tr é o tempo de subida aceitável das linhas SDA e SCL para a taxa de transmissão desejada. Esta informação normalmente está nos datasheets dos dispositivos (normalmente 300ns para frequências acima de 100KHz e 1000ns para frequências abaixo de 100KHz)
  • Cb é a capacitância do barramento. Esse limite é de 400 pF. Caso deseje adicionar mais dispositivos é necessário um chip de buffer para I2C.

No documento da Texas Instruments também é fornecido um exemplo para utilizar o calculo, neste exemplo ele forneceu os seguintes dados Cb = 200pF, Vcc = 3,3V, Vol =0,4V, Iol = 3mA:

Sendo assim o valor dos resistores tanto do SDA quanto do SDL deve estar entre 966Ω e 1,77KΩ, adotanto um resistor no valor comercia de 1KΩ ; 1,2K Ω; ou 1,5KΩ.


Biblioteca e Circuito de Exemplo

Para testar o PCF8574 eu montei um simples circuito utilizando um ESP32 (também pode ser montado com um Arduíno) com dois LED’s nos pinos P0 e P1, um que fica piscado com o tempo e o outro que assim que o botão do pio P2 for pressionado ele alterna entre ligado e desligado:

Montagem do circuito de teste da programação do PCF8574

Fiz também uma representação no Fritzing:

Montagem em protoboard.

O esquema de ligação está abaixo, utilizei o Fritzing porem ele não é mais gratuito, agora é pago para poder baixa-lo, gosto dele por deixar mais organizado e intuitivo o circuito, mas por ele ficar pago eu irei utilizar o Kicad é gratuito mesmo ficando um circuito não muito intuitivo:

Esquemático do circuito do PCF8574

A biblioteca funcionou bem no ESP32, testei outras e não obtive o mesmo resultado que esta, baixe a biblioteca aqui pelo XProjetos ou se não pelo o Repositório do GitHub do desenvolvedor Xreef:

ícone

Biblioteca PCF8574_library – ESP32 e Arduino 15.74 MB 48 downloads

Esta é uma biblioteca para uso do PCF8574 como expansor de I/O, pode ser usado para…

A programação é simples sem nenhum comando complexo e pode ser entendida por iniciantes, comentei todas as linhas para auxiliar no entendimento:

/*
		Example of Programming for xreef's pcf8574 library, example available at http://XProjects.net
		The Library Repository is available at: https://github.com/xreef/PCF8574_library

		Programming By: JailsonBR 01-12-2019
		
		Programação de Exemplo para biblioteca pcf8574 do xreef, exemplo disponivel no site http://XProjetos.net
		O Repositório da biblioteca está disponível em: https://github.com/xreef/PCF8574_library

		Programação Por: JailsonBR 12-01-2019
*/

#include "Arduino.h"
#include "pcf8574.h"

PCF8574 pcf8574_XP(0x21);							//Determina o Endereço I²C do dispositivo
bool P2_Status; 									//Variável utilizada na mudança de estado do P2

void setup()
{
	Serial.begin(9600);								//Inicia a comunicação Serial

	pcf8574_XP.begin();								//Inicia o PCF8574 com endereço informado acima
	pcf8574_XP.pinMode(P0, OUTPUT);					//Configura o Pino P0 do PCF8574 como Saída
	pcf8574_XP.pinMode(P1, INPUT);					//Configura o Pino P1 do PCF8574 como Entrada
	pcf8574_XP.pinMode(P2, OUTPUT);					//Configura o Pino P2 do PCF8574 como Saída
}

void loop()
{
	pcf8574_XP.digitalWrite(P0, HIGH);				//Muda o Estado de P0 para desligado
	delay(1000);
	pcf8574_XP.digitalWrite(P0, LOW);   			//Muda o Estado de P0 para Ligado
	delay(1000);
	byte P1_Leitura = pcf8574_XP.digitalRead(P1); 	//Lê o pino P1 do PCF8574 e armazena em P1_Leitura

	if(P1_Leitura == HIGH) {						//Verifica se P1_Leitura está pressionado
		P2_Status =! P2_Status;						//Muda o estado da variável P2_Status entre 0 e 1
		pcf8574_XP.digitalWrite(P2, P2_Status);		//Muda o estado do pino P2 do PCF8574 apartir do valor da variável
		Serial.println("Botão Pressionado");		//Escreve na saída Serial
	}

}

A seguir algumas imagem com uma resolução melhor da Protoboard montada:

Montagem do Circuito em Proto Board

Fontes:
http://www.mbeddedc.com/2017/05/i2c-bus-communication-protocol-tutorial.html
https://github.com/xreef/PCF8574_library
https://www.mischianti.org/2019/01/02/pcf8574-i2c-digital-i-o-expander-fast-easy-usage/
http://www.ti.com/
https://small-roar.com/i2c-inter-integrated-circuit/

Licença CC 4.0

Creative Commons

O trabalho PCF8574 – I²C para LCD de JailsonBR está licenciado com uma Licença Creative Commons Atribuição 4.0 Internacional.

Jailson Oliveira

Sou Engenheiro Eletricista com Enfase em Eletrônica e Técnico em Eletrônica, gosto de estar praticando montagens de circuitos e também programar sistemas embarcados. Acredito que compartilhar informações gratuita gera mais informações novas por parte de outras pessoas.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *