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 | 0 | 20h |
0 | 0 | 1 | 21h |
0 | 1 | 0 | 22h |
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 | 0 | 38h |
0 | 0 | 1 | 39h |
0 | 1 | 0 | 3Ah |
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íno | ESP32 | ESP8266 |
GND | GND | GND | GND |
Vcc | 5V | 3,3V ou VIN | 3,3V ou VIN |
SDA | A4 | GPIO21 | GPIO4 |
SCL | A5 | GPIO22 | GPIO5 |
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:
PCF8574 – Texas Instruments – Datasheet 2,71MB 31 downloads
Datasheet detalhado feito pela Texas Instruments do Chip PCF8574 de Multiplexação…PCF8574A – Texas Instruments – Datasheet 2,38MB 11 downloads
Datasheet detalhado feito pela Texas Instruments do Chip PCF8574A de Multiplexação…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:
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.
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.
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:
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:
Cálculo do resistor de Pull-up de barramento I²C – Manual 157,29KB 28 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:
Fiz também uma representação no Fritzing:
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:
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:
Biblioteca PCF8574_library – ESP32 e Arduino 15.74 MB 49 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:
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/