|
Microcontrolador
Para este projeto, foi selecionado o microcontrolador ATmega328P, configurado para operar a uma frequência de 8 MHz.
Esta escolha deve-se ao facto de ser um dispositivo previamente familiar e de possuir os requisitos necessários para a implementação das funcionalidades pretendidas.
O microcontrolador é responsável por receber e processar os dados provenientes dos sensores de tensão e corrente, transmitindo-os posteriormente, através de um módulo I2C, para um LCD, onde serão exibidos.
Desta forma, é assegurado o funcionamento básico do sistema.
LCD16x2 e Módulo I2C
Para a exibição dos valores de energia (tensão, corrente e potência), foi utilizado o modelo LCD16x2-1602A, já disponível previamente, o que facilitou a implementação.
A comunicação entre o microcontrolador e o LCD é realizada por meio de um módulo I2C, também já disponível, que utiliza as entradas SDA e SCL, reduzindo significativamente o número de conexões em comparação com uma montagem direta de 8 bits.
O módulo I2C integra o chip PCF8574, cujo endereço depende da configuração dos pads de seleção, identificados como A0, A1 e A2.
No caso deste projeto, a configuração dos pads define o endereço do módulo como 0x20.
Sensor de tensão
Para a medição do nível de tensão, foi selecionado o módulo ZMPT101B, uma escolha fundamentada na sua utilização recorrente em projetos similares, o que sugere a sua fiabilidade.
Este sensor recebe a tensão alternada e, através do transformador que dá nome ao módulo, reduz os valores para a faixa de 0 a 5 V.
Além disso, o módulo adiciona um offset de 2,5 V, eliminando a possibilidade de leituras negativas.
A conversão dos valores obtidos para os correspondentes reais é realizada no código, um processo detalhado na secção de software.
Posteriormente, o valor calculado é exibido no LCD.
Sensor de corrente
Para a medição do nível de corrente, foi utilizado o módulo ACS712T ELC-20A, disponível previamente, o que contribuiu para a praticidade e a eficiência do desenvolvimento.
Este módulo utiliza um sensor de efeito Hall linear combinado com condutores de cobre, que geram um campo magnético proporcional à corrente que os atravessa.
O sensor de efeito Hall converte este campo magnético em uma tensão de saída proporcional, variando entre 0 e 5 V, permitindo a medição de correntes alternadas ou contínuas.
O módulo também adiciona um offset de 2,5 V, garantindo que valores negativos não sejam interpretados pelo microcontrolador.
A conversão da tensão lida para os valores reais de corrente é realizada no código, detalhado na secção de software.
O valor calculado é então exibido no LCD.
Emissor de som (buzzer)
Para implementação de sinais sonoros, foi utilizado o módulo buzzer passivo KY-006, disponível previamente, o que facilitou a sua inclusão no sistema.
Este módulo é responsável por emitir um aviso sonoro sempre que um dos valores de energia, seja tensão, corrente ou potência, ultrapassar um limite previamente definido pelo utilizador.
A configuração desses limites será detalhada na secção de software.
LEDs (RGB e Vermelho)
Para a implementação de sinais luminosos, foram utilizados dois LEDs: um RGB e um vermelho.
O LED RGB é responsável por alertar o utilizador sempre que os valores de energia ultrapassam os limites estabelecidos.
A cor emitida pelo LED RGB varia conforme o parâmetro excedido: vermelho para tensão, verde para corrente e azul para potência.
Caso múltiplos limites sejam ultrapassados simultaneamente, a cor exibida será a combinação das correspondentes.
Sempre que um limite for excedido, a iluminação do LED RGB será acompanhada por um sinal sonoro emitido pelo buzzer.
Quando todos os valores estiverem dentro dos limites definidos, o LED RGB permanecerá apagado.
Por fim, o LED vermelho piscará a uma frequência de 1 Hz para indicar que o circuito está a funcionar corretamente, cumprindo assim os requisitos mínimos do sistema implementado no projeto.
Switches
Para permitir a navegação pelo LCD, foi utilizado um módulo que incorpora quatro switches, disponível previamente, o que facilitou a sua integração no projeto.
As funções atribuídas a cada botão serão detalhadas na secção de software.
USBasp e AVRisp
Para programar o microcontrolador, foi utilizado o programador USBasp em conjunto com o conector AVRisp.
O USBasp foi escolhido por estar previamente disponível e por proporcionar maior controlo sobre o microcontrolador durante o processo de programação.
A utilização do ARVisp facilitou a conexão ao reduzir o número de pinos necessários.
No entanto, para projetos futuros que utilizem o ATmega328P, pode ser considerado o uso de um módulo USB-Serial (bootloader).
Neste caso, seria necessário instalar o bootloader no microcontrolador, permitindo uma programação mais simplificada e eficiente em projetos repetitivos.
Resistências
Para a proteção dos LEDs, foram utilizadas resistências da série E12 em configuração série.
O dimensionamento das resistências foi realizado considerando as diferentes cores dos LEDs, uma vez que apresentam características elétricas distintas.
Para dimensionar as resistências de cada LED, foi utilizada a seguinte fórmula:
Onde:
Assim, aplicando a equação do dimensionamento para cada LED, obtemos:
Optou-se pela utilização de resistências de 330 Ω, uma vez que já estavam disponíveis, facilitando a sua implementação no circuito.
Jumpers
Para a realização das conexões entre os diversos componentes do circuito, foram utilizados jumpers macho-macho e macho-fêmea.
A alimentação do sistema foi feita através de um cabo micro USB.
Placa de circuito impresso perfurada
Inicialmente, o projeto foi desenvolvido numa breadboard.
Posteriormente, o desenho da PCB foi elaborado no KiCad e encomendado através de um fornecedor na China.
No entanto, verificou-se um erro no dimensionamento dos pin sockets e pin headers, que apenas foi detetado após a receção da placa.
Após a correção do desenho, já não havia tempo suficiente para uma nova encomenda.
Como solução alternativa, o circuito foi implementado numa placa de circuito impresso perfurada, garantindo a funcionalidade pretendida.
Esquema elétrico
Esquema PCB
|
|
TIMER1
Para implementar o led picar a uma frequência de 1 Hz, configutamos o Timer1 da seguinte maneira:
Para calcular o valor de OCR1A, utiliza-se a seguinte fórmula no modo CTC (Clear Timer on Compare Match):
Isolando OCR1A e substituindo os valores para F_CPU =8 MHz e um prescaler N=256, obtemos:
Como o Timer1 é um temporizador de 16 bits, a escolha deste prescaler permite obter uma maior precisão para atingir a frequência esperada.
ADC
A frequência de operação do conversor analógico-digital (ADC) deve estar contida no intervalo:
Para garantir que o ADC opere dentro desse intervalo, o cálculo foi realizado considerando diferentes valores de prescaler, respeitando a seguinte equação:
Substituindo os valores para o microcontrolador ATmega328P com frequência de clock de 8 MHz:
Este valor está dentro da faixa recomendada, garantindo um funcionamento adequado do ADC.
Sensor de tensão
Para o cálculo da tensão RMS, utilizamos a seguinte função:
Primeiramente, é necessário ler o valor digital convertido pelo ADC0, correspondente ao sensor de tensão utilizado.
Esse valor deve ser multiplicado pela tensão de referência do ADC (neste caso, 5 V) e dividido pela resolução do conversor, que, sendo de 10 bits, é igual a 1024.
Além disso, é necessário remover a tensão de offset padrão do módulo ZMPT101B, que é de 2,5 V.
Para determinar o valor da tensão RMS, somamos o quadrado de 100 leituras e aplicamos a seguinte equação:
Posteriormente, é necessário converter o valor de V_RMS para a tensão real.
Para isso, aplicamos um fator de calibração, determinado da seguinte forma:
O fator de calibração foi determinado uma única vez e manteve-se constante ao longo do projeto.
Onde V_RMS é obtido pelo cálculo anterior e V_real foi medido diretamente nos terminais do módulo utilizando um multímetro.
Na amostra realizada, o valor obtido foi:
Sensor de corrente
Para o cálculo da corrente RMS, foi utilizada a seguinte função:
Inicialmente, é necessário obter o valor digital convertido pelo ADC1, correspondente ao sensor de corrente utilizado.
Assim como no sensor de tensão, esse valor deve ser multiplicado pela tensão de referência do ADC (5 V) e dividido pela resolução do conversor, que, sendo de 10 bits, é igual a 1024.
Após esse passo, é subtraído o valor de offset do módulo ACS712, que é de 2,5 V, semelhante ao módulo ZMPT101B.
Em seguida, o valor obtido é dividido pela sensibilidade do sensor, que, no módulo ACS712 ELC-20A, é de 0,1 V/A.
Posteriormente, somam-se os quadrados das amostras de corrente.
Por fim, a corrente RMS é calculada utilizando a mesma equação empregada no cálculo da tensão RMS:
No caso deste sensor, o valor de I_RMS já corresponde ao valor real da corrente.
I2C
Para que o microcontrolador possa comunicar com o LCD, utilizam-se as seguintes funções I2C:
Para estabelecer a comunicação I2C, é necessário calcular o valor do byte TWBR (Two-Wire Bit Rate Register), utilizando a seguinte equação:
Isolando TWBR e considerando F_CPU igual a 8 MHz e um prescaler de 1 (sem divisão adicional, configurado no byte TWSR), para uma frequência de comunicação f_SCL ideal de 100 kHz, obtemos:
Este valor é configurado na função i2c_init().
As funções i2c_start() e i2c_stop() são utilizadas para iniciar e finalizar a comunicação I2C, respetivamente.
Já a função i2c_write() é responsável pelo transferência de dados.
LCD
Para comunicar com o LCD, utilizam-se as seguintes funções LCD:
A função lcd_init() configura o LCD para operar no modo de 4 bits com duas linhas.
A função lcd_send() é responsável pelo envio de dados ou comandos, conforme definido pelo parâmetro mode.
A transmissão ocorre em duas etapas: primeiro, é enviada a parte alta do byte, seguida pela parte baixa.
A função lcd_write_string() permite escrever uma string no LCD, enquanto a função lcd_clear() limpa o display.
Já a função lcd_set_cursor() define a posição do cursor, especificando a linha e a coluna antes da exibição do texto.
Fluxogramas
|
|
Trabalhar em equipa pode ser um desafio, mas, desde o início, foi possível distribuir e equilibrar todas as tarefas e etapas do projeto de forma eficiente.
Relativamente aos problemas encontrados, surgiram alguns contratempos ao longo do desenvolvimento.
Na fase inicial, a gestão do tempo e a atribuição de tarefas revelaram-se desafiadoras, resultando numa utilização menos eficiente do tempo disponível para o projeto.
Além disso, tentámos implementar o circuito numa PCB, mas, ao encomendar a placa, verificou-se um erro no dimensionamento dos pin sockets e pin headers, que apenas foi detetado após a receção da PCB.
O erro foi corrigido e o desenho atualizado, no entanto, a nova versão já não chegaria a tempo da época de recurso para a apresentação do projeto.
Como alternativa, foi possível implementar o circuito numa placa perfurada, garantindo a funcionalidade pretendida.
Apesar dos desafios, conseguimos implementar praticamente tudo o que idealizámos desde o início, deixando espaço para futuras melhorias, como a integração de um site para armazenamento de valores e apresentação de gráficos de dados,
bem como a incorporação de uma base de dados e uma aplicação móvel.
Concluímos que, de forma geral, o projeto foi bem-sucedido, tendo sido uma experiência enriquecedora para ambos os membros do grupo.
|