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!
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por
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)