Já escrevi sobre multiplexação com 74HC595 nesse outro artigo, que certamente tem suas vantagens e pode ser mais apropriado por diversas questões. Mas é interessante testar a possibilidade com um PCF8574 e display de 7 segmentos para ver a velocidade do barramento I2C, utilizar bitwise e rever a multiplexação.
Table of Contents
Display de 7 segmentos
Peguei um display de 4 dígitos, dos quais o primeiro já está com o LED central queimado, infelizmente. Mas indiferente, o conceito está sendo testado em apenas 1 dígito, então fiz uso do segundo. Além disso, com o PCF8574 não seria possível alternar o dígito, exceto utilizasse um NE555, um flip-flop ou algo do tipo, porque dos 8 bits, 7 são utilizados para o display.
Também já escrevi um artigo com o MCP23017, nesse link, que possui 2 Bytes e, com ele sim seria possível manipular os 4 dígitos do display, com pinos de sobra.
Para identificar os pinos do display, simplesmente coloquei o multímetro em modo de continuidade e fui colocando pino a pino para identificar os dígitos, depois para identificar os segmentos. É um processo rápido, não há razão para procurar datasheet.
No código mais abaixo estão identificados os segmentos e as relações com os pinos do PCF8574.
PCF8574 e display de 7 segmentos
Já escrevi diversos artigos sobre esse expansor de IO, dos quais sempre recomendo esse.
Eu estava decidido a utilizar um PCF8574 soldado a uma placa de prototipagem, mas no final das contas ia ficar muito esparramado para o artigo porque não tinha onde colocar o display. De qualquer modo, vou deixar as dicas para você montar sua própria placa com o CI PCF8574.
Primeiro passo: Identificar os pinos ou, “pinout”
Comece sempre procurando pelo documento do CI que deseja utililzar. Esse documento é chamado “datasheet”, contendo mais especificações do que muitos de nós haveríamos de utilizar, mas essencial para diversos desenvolvedores de hardware por diversas questões.
Para montar nossa placa com o PCF8574 em casa, poucas informações são necessárias, dentre as quais, o pinout. Buscando no Google por “pcf8574 datasheet” já encontramos o arquivo .pdf. Logo nas primeiras páginas encontra-se os tipos de empacotamento do CI, com o respectivo pinout. No caso, utilizei esse:
Agora precisamos de um exemplo de aplicação típica, que normalmente se encontra no datasheet também. Lendo o documento, encontra-se uma informação dizendo que entre os pinos SDA, SCL e INT, deve-se utilizar um resistor de pull-up. Mas não diz o valor. Não é problema, porque no exemplo de aplicação típica está mostrando resistores de 10k.
Repare que os endereços estão indo ao GND. Se quiser, por optar por fazer sua placa endereçável, mas desse modo já teremos disponível o PCF8574 no endereço 0x20.
Agora resta buscar uma informação; quanto podemos (ou devemos) colocar de tensão no VCC?
Bem, nada é mais seguro do que o datasheet, porque tem tutoriais por ai que a galera coloca 5V em coisas com nível lógico 3V3. Buscando no datasheet, encontra-se 2 informações relacionadas, das quais apenas uma deve ser considerada: Recomended Operation Conditions.
Podemos usar em 3V3 ou em 5V. Ótimo!
A outra referência é a Absolute Maximum Rates, que é o uso sob condições extremas em ambiente controlado, nunca confunda esses dois tópicos.
Seguindo o datasheet, o resultado foi esse:
Wiring
Agora que já temo a placa, podemos partir para as conexões do PCF8574 e display de 7 segmentos. Ou se preferir, pode comprar um Arduino da MaxBlitz que já vem com o PCF8574. Como citei anteriormente, acabou sendo mais prático porque utilizei a área de prototipagem da própria placa para “slotar” o display. A placa é essa da imagem de destaque. Ela também está com endereçamento fixo em 0x20, o código a seguir será transparente para ambos os casos supracitados.
Código
No código disponibilizo um comentário relacionando os pinos do display e exemplificando com 3 funções diferentes o ligamento incremental, bit a bit e POV (Persistence Of Vision), que é o ligamento tão rápido quanto possível após o desligamento do bit anterior, causando a impressão de que todos os bits estão ligados ao mesmo tempo.
No código só escrevi os números de 0 à 2 para exemplificar, pratique criando os demais dígitos!
#include <Arduino.h> #include <Wire.h> /* display DIGITOS: baixo 1 - 1 2 - 2 3 - 6 8 - 4 baixo 7 - . 3 - baixo 5 - left down cima 1 - right top 2 - center 3 - top 4 - right down 6 - left up PCF 0 1 2 3 4 5 6 7 DSP DOWN 3 5 DSP UP 6 3 1 4 2 FORMAR NUMEROS COM POV, MULTIPLEXANDO: 0 = 0 + 1 + 2 + 3 + 4 + 5 ou 1+2+4+8+16+32 Ligando todos direto: 255&~(1<<0|1<<2|1<<3|1<<4|1<<5|1<<6) Multiplexando: ZERO = 1<<0|1<<1|1<<2|1<<3|1<<4|1<<5; E escrevendo para o display: 255^(6<<ZERO); */ uint8_t value = 255; uint8_t pos = 0; uint8_t speed = 1000; struct numbers{ uint8_t ZERO = 1<<0|1<<1|1<<2|1<<3|1<<4|1<<5; uint8_t UM = 1<<4|1<<5; uint8_t DOIS = 1<<3|1<<4|1<<6|1<<1|1<<0; } number; void setup() { Serial.begin(9600); Wire.begin(); Wire.beginTransmission(0x20); Wire.write(0xFF); Wire.endTransmission(); delay(2000); } void showNumber(uint8_t num){ uint8_t toWrite = num&(1<<pos); value = 255^toWrite; Wire.beginTransmission(0x20); Wire.write(value); Wire.endTransmission(); pos = pos+1 > 7 ? 0 : pos+1; if (toWrite > 0){ delay(1); } } void pov(){ value = 255^(1<<pos); Wire.beginTransmission(0x20); Wire.write(value); Wire.endTransmission(); pos = pos+1 > 7 ? 0 : pos+1; delay(speed); speed = speed > 2 ? speed-1 : 1; } void incremental(){ value = value^(1<<pos); Serial.println(value); Wire.beginTransmission(0x20); Wire.write(value); Wire.endTransmission(); pos = pos+1 > 7 ? 0 : pos+1; delay(1000); } void loop() { showNumber(number.DOIS); }
Vídeo
Vou subir um vídeo mostrando e explicando os conceitos utilizados. Se tiver dúvidas sobre o uso de bitwise, recomendo a leitura desse artigo. Se preferir um vídeo sobre bitwise, no meu curso de Raspberry Pi eu deixei aberta a aula completa sobre bitwise, acesse através desse link. Se quiser adquirir o curso, utilize o cupom DOBITAOBYTE para obter o curso por R$21,00.
O vídeo relacionado ao artigo estará disponível em nosso canal Dobitaobytebrasil no Youtube. Se não é inscrito, inscreva-se e clique no sininho para receber notificações. Ah, e não se esqueça de deixar um like no vídeo, ok?
Provavelmente no final da página aparecerão algumas sugestões de artigos relacionados que podem lhe ser útil, dê uma conferida.
Até a próxima!
2 thoughts on “Multiplexação e POV com PCF8574 e display de 7 segmentos”
Comments are closed.