Manual
do
Maker
.
com
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.
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.
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.
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:
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.
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);
}
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.
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.
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.