Arduino + Keypad + 7segmentos ( com MM74C92 e PCF8574) Protocolo I2C

Olá, o objetivo desse experimento seria utilizar a comunicação I2C do Arduino, que é uma forma de otimizar e ampliar as possibilidades do mesmo. Enquanto antes conectava o display de sete segmentos e ocupava a maioria das portas do Arduino, poderia  ter o mesmo componente utilizando apenas duas portas (SDA e SCL) e um expansor de portas.

Outro objetivo é a utilização do teclado (Keypad), parecido com os de calculadora.

O projeto é bem simples, consiste em apertar um número no Keypad e mostrar o número apertado no display de sete segmentos. Se você quiser, pode evoluir o projeto e fazer como uma calculadora. 

Então vamos para a explicação de como foi feito!

Como não tinha os componentes, simulei no Proteus 8.2, que agora possui um pacote bem legal para Arduino.

KEYPAD

O MM74C92 é um encodificador de teclado, ele tem capacidade de atender um teclado 4X4 e dependendo da tecla apertada vai gerar um código em binário nas saídas A, B, C, D. Ou seja há 16 combinações de saída diferentes, correspondendo claramente à cada tecla tocada.

Outro ponto importante é o pino DA, cada vez que uma tecla é apertada, o mesmo vai para alto, sinalizando a ação.

O datasheet dele está aqui:http://www.datasheetspdf.com/PDF/MM74C922/455711/1

PCF3574

É um expansor de 8 portas. Nos pinos A0, A1 e A2 você conecta ao Terra ou Vcc dependendo do endereço que você quer que tenha. Pois é possível conectar mais de um expansor pelo I2C, o que vai diferenciar um o doutro é o endereço, então como o protocolo é baseado na relação de mestre-escravo, é possível ter vários periféricos-escravo.

É preciso verificar o tipo de expansor que está utilizando, pois a tabela pode ser diferente. Segue o datasheet do componente que usei: http://www.ti.com/lit/ds/symlink/pcf8574.pdf

A biblioteca para o I2C é a Wire.h e para transmitir comando para o escravo utiliza-se as seguintes linhas:

Wire.beginTransmission(expansor2);
Wire.write(B00000001);
Wire.endTransmission();

Quando eu envio o Byte 00000001, mando para o PCF8574 para para desligar a saída P0 e deixar os restantes desligados.

Abaixo segue o código utilizado:

#include span style="color: #cc6600;">Wire.h> // biblioteca para o I2C
#define expansor1 0x21 // definindo endereço do PCF8574
byte f=B00000000;


void setup()
{
Wire.begin(); // join i2c bus (address optional for master)
pinMode(4,INPUT);
pinMode(5,INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
pinMode(13,INPUT);// pin DA do PCF8574
}
//função para associar cógido recebido pelo teclado com o que será enviado para o PCF8574
void numero(byte e){
if(e==B00000000)f=B00000110;//1
if(e==B00001000)f=B01011011;//2
if(e==B00000100)f=B01001111;//3
if(e==B00000010)f=B01100110;//4
if(e==B00001010)f=B01101101;//5
if(e==B00000110)f=B01111101;//6
if(e==B00000001)f=B00000111;//7
if(e==B00001001)f=B11111111;//8
if(e==B00000101)f=B11101111;//9
if(e==B00001011)f=B00111111;//0
}
// void loop
void loop()
{
int a,b,c,d;
byte e=00000000;
if(digitalRead(13)==1)// Se uma tecla for apertada
{
a=digitalRead(7);
b=digitalRead(6);
c=digitalRead(5);
d=digitalRead(4);
e += d0;// acrescenta o valor lido em D na posição 0 do Byte
e += c1;// acrescenta o valor lido em C na posição 1 do Byte
e += b2;// acrescenta o valor lido em B na posição 2 do Byte
e += a3;// acrescenta o valor lido em A na posição 3 do Byte
numero(e);
}
Wire.beginTransmission(expansor1); // trasmite para o escravo do endereço especificado
Wire.write(f);// envia um Byte
Wire.endTransmission(); // finaliza a transmissão
}


Um aspecto interessante é a utilização do Shift , uma função para ser utilizado com Byte que facilita bastante trabalhar com esse tipo. No código acima não aparece, mas a sintaxe é a seguinte:


Qualquer dúvida ou sugestão, pode deixar no comentário. Espero que tenha sido útil!

Exibições: 2732

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço