Fala galera tudo beleza? Hoje vamos aprender a desenvolver uma fonte simétrica com Arduino Nano! A fonte simétrica é muito utilizada quando se necessita de tensões positivas e negativas como na alimentação de circuitos com amplificadores operacionais, amplificadores de áudio de potência, comparadores de tensão e conversores Analógicos/Digitais, etc.
A fonte de alimentação simétrica pode ser, basicamente, composta por duas fontes de alimentação ligadas
entre si, sendo que um dos terminais de uma fonte é conectado ao terminal complementar da outra fonte. O terminal em comum na fonte de alimentação simétrica é conectado ao GND do sistema que formará a referência. Com esse arranjo da fonte de alimentação simétrica, obtêmse duas fontes com polaridades invertidas. Nesse caso, a tensão de alimentação precisar ser sempre maior que o dobro da tensão simétrica.
Projetando uma fonte com Arduino
Agora, vamos projetar uma fonte simétrica com nosso famoso Arduino Nano para fazer todo o
controle, nossa fonte terá:
• SAÍDA DE +5 e -5 VOLTS / 2.7A
• SAÍDA DE +12 e -12 VOLTS / 2.7A
• SAÍDA AJUSTÁVEL DE ATÉ 17.7 VOLTS / 3ª
• VENTILAÇÃO AUTOMÁTICA
• PROTEÇÃO CONTRA CORRENTE ELEVADA
Iniciamos o nosso projeto com utilização de 3 fontes, uma dica: utilize fonte de carregador de
notebooks, são fáceis de encontrar em sucata e tem uma excelente corrente além do tamanho
compacto, como mostra a figura 01.

Para obtermos tensões simétricas, vamos utilizar duas fontes, no nosso caso, duas fontes de
12V, de forma que teremos a conexão como visto na figura 02, para a simetria.

A terceira fonte, poderá ser de qualquer tensão, respeitando o limite dos componentes, no nosso caso, iremos utilizar uma fonte de 19V para a saída ajustável. Para o controle inicial da nossa fonte, todas as saídas contarão com um relé para o acionamento e desligamento, na fonte simétrica iremos utilizar um relé duplo e um relé comum para a saída ajustável.
Como temos duas fontes de 12V, já temos a nossa disposição a primeira saída de +12V |-12V, a próxima etapa consiste em usar reguladores da família 7805(5V positivos) e 7905(5V negativos), aplicando transistores darlington TIP121 e TIP127, como visto no datasheet dos componentes, chegamos a montagem da figura 03, esse é o exemplo para o regulador 7805.

Circuito final
Para monitorar a corrente das nossas saídas, vamos utilizar o ACS712, um sensor de corrente
por efeito hall, para as saídas simétricas. Para a saída ajustável, iremos utilizar um resistor shunt. Agora,
o que precisamos fazer e finalizar toda a montagem do nosso circuito, na figura 04, temos o circuito final
no simulador.

Mergulhando no código
Nosso código faz o uso de uma biblioteca excelente para resolver o grande problema das entradas analógicas do Arduino: ruídos! Iremos utiliza a biblioteca ResponsiveAnalogRead, desenvolvida por Damien Clarke. Com ela, vamos evitar as oscilações e variações bruscas de leituras.
No código, também desenvolvemos a ventilação automática baseada da temperatura lida pelo lm35, além de controle para corrente elevadas, na qual, irá desabilitar as saídas caso isso ocorra, além dos botões para o usuário habilitar o desligar as saídas.
Este tutorial é uma parceira entre a Arduino Ômega e o Canal Engenharia Entendida, confira o tutorial completo no vídeo abaixo:
A seguir, temos o código completo:
//===========================================================Configurações iniciais====================================================//
#include <LiquidCrystal.h> //Biblioteca do display
#include <ResponsiveAnalogRead.h> //Biblioteca para leituras analógicas
LiquidCrystal lcd(3,2,9,10,11,12); //Configura os pinos do display
#define Read5V_Positivo A5 //Leitura corrente +5V
#define Read5V_Negativo A3 //Leitura corrente -5V
#define Read12V_Positivo A6 //Leitura corrente +12V
#define Read12V_Negativo A4 //Leitura corrente -12V
#define ReadAdj A2 //Leitura corrente da saída ajustável
#define ReadAdjVolt A1 //Leitura tensão da saída ajustável
#define Lm35 A7 //Pino do Lm35
#define Control0 7 //Relé para saídas ajustável
#define Control1 8 //Relé para saídas fixas
#define Fan 4 //Pino que aciona a ventilação
#define AdjON 6 //Botão para saída ajustável
#define FixedON 5 //Botão para saídas fixas
String AdjONStatus="OFF"; //Status do botão ADJ
String FixedONStatus="OFF"; //Status do botão Fixed
String FanStatus="OFF"; //Status do fan
float Current5V_Positivo=0; //Corrente em +5V
float Current5V_Negativo=0; //Corrente em -5V
float Current12V_Positivo=0; //Corrente em +12V
float Current12V_Negativo=0; //Corrente em -12V
float Current5V=0; //Corrente total nas saídas +5V e -5V
float Current12V=0; //Corrente total da saída de +12V e -12V
float CurrentAdj=0; //Corrente na saída ajustável
float VoltAdj=0; //Tensão na saída ajustáve
float Temp=0; //Variável para a temperatura interna
int CaseStatus = 0; //Variável para status do Switch adj
int g=0;
int CaseStatus1 = 0; //Variável para status do Switch fixed
ResponsiveAnalogRead analog0(Read5V_Positivo, true); //Objeto para +5V
ResponsiveAnalogRead analog1(Read5V_Negativo, true); //Objeto para -5V
ResponsiveAnalogRead analog3(Read12V_Positivo, true); //Objeto para +12V
ResponsiveAnalogRead analog2(Read12V_Negativo, true); //Objeto para -12V
ResponsiveAnalogRead analog4(ReadAdj, true); //Objeto para Adj current
ResponsiveAnalogRead analog5(ReadAdjVolt, true); //Objeto para Adj Volt
ResponsiveAnalogRead analog6(Lm35, true); //Objeto para lm35
byte SimboloOut[8]={0b00100,0b00100,0b11111,0b00100,0b00100,0b00000,0b11111,0b00000}; //Cria o cunjunto de byte que formará o caracter ±
byte TempSimb0[8]={0b01100,0b10010,0b10010,0b01100,0b00000,0b00000,0b00000,0b00000}; //Cria o cunjunto de byte que formará o caracter °
//===============================================================Setup==================================================================//
void setup() {
lcd.begin(20,4); //Inicia o display
lcd.createChar(1,SimboloOut); //Passa o parâmetro SimboloOut para 1.
lcd.createChar(2,TempSimb0); //Passa o parâmetro TempSimb0 para 2.
pinMode(Control0,OUTPUT); //Controle do relé para saídas ajustáveis
pinMode(Control1,OUTPUT); //Controle do relé para saídas fixas
pinMode(Fan,OUTPUT); //Controle do fan
pinMode(AdjON,INPUT_PULLUP); //Botão que libera a saída ajustável
pinMode(FixedON,INPUT_PULLUP); //Botão que libera as saídas fixas
digitalWrite(Control1,LOW); //Matém o relé da saída ajustável desativado
digitalWrite(Control0,LOW); //Matém o relé das saídas fixas desativado
digitalWrite(Fan,LOW); //Matém o fan desligado
delay(500); //Tempo de acomodação de 500mS
}
//===========================================================Loop principal=============================================================//
void loop() {
analog0.update(); //Inicia o cálculo de leitura analógica A0
analog1.update(); //Inicia o cálculo de leitura analógica A1
analog2.update(); //Inicia o cálculo de leitura analógica A2
analog3.update(); //Inicia o cálculo de leitura analógica A3
analog4.update(); //Inicia o cálculo de leitura analógica A4
analog5.update(); //Inicia o cálculo de leitura analógica A5
analog6.update(); //Inicia o cálculo de leitura analógica A6
//===========================================================Saída fixas================================================================//
if(digitalRead(FixedON)==LOW && FixedONStatus=="OFF"){ //Verifica se o botão foi pressionado e se as saídas fixas estão desligadas
CaseStatus1 = 1; //Variável para controle do switch case
delay(420); //Espera 100mS para amenizar o efeito bouncing
digitalWrite(Control0,HIGH); //Liga as saídas fixas
FixedONStatus="ON"; //Altera o status para ON
}
if(digitalRead(FixedON)==LOW && FixedONStatus=="ON"){ //Verifica se o botão foi pressionado e se as saídas fixas estão ligadas
CaseStatus1 = 0; //Variável para controle do switch case
delay(200); //Espera 100mS para amenizar o efeito bouncing
digitalWrite(Control0,LOW); //Desliga as saídas fixas
FixedONStatus="OFF"; //Altera o status para OFF
}
//===========================================================Saída ajustável============================================================//
if(digitalRead(AdjON)==LOW && AdjONStatus=="OFF"){ //Verifica se o botão foi pressionado e se a saída ajustável está desligada
CaseStatus = 1; //Variável para controle do switch case
delay(420); //Espera 100mS para amenizar o efeito bouncing
digitalWrite(Control1,HIGH); //Liga a saída
AdjONStatus="ON"; //Altera o status para ON
}
if(digitalRead(AdjON)==LOW && AdjONStatus=="ON"){ //Verifica se o botão foi pressionado e se a saída ajustável está ligada
CaseStatus = 0; //Variável para controle do switch case
delay(200); //Espera 100mS para amenizar o efeito bouncing
digitalWrite(Control1,LOW); //Desliga a saída
AdjONStatus="OFF"; //Altera o status para OFF
}
//===========================================================Análise de status Adj======================================================//
switch (CaseStatus){ //Variável a ser analisada
case 1: //Caso seja 1...
//===============================================================Adj tensão=============================================================//
VoltAdj=analog5.getValue(); //Faz a leitura analógica já estável tensão Adj
VoltAdj=map(VoltAdj,30.0,489,1.26,17.75); //Mapeia o valor de tensão ADJ
//===============================================================Adj corrente===========================================================//
CurrentAdj=analog4.getValue(); //Faz a leitura analógica já estável current Adj
CurrentAdj=map(CurrentAdj,0.000,300.0,0.000,3); //Mapeia o valor do ADC para os valores de corrente
if(CurrentAdj<0){ //Se a corrente for <0...
CurrentAdj=0; //Zera a corrent
}
VoltAdj=VoltAdj-(CurrentAdj*0.8); //Subtrai o valor de tensão no Shunt
break; //Para
case 0: //Caso seja 0...
VoltAdj=0; //Tensão será 0
CurrentAdj=0; //Corrente será 0
break; //Para
}
//===========================================================Análise de status fixas===================================================//
switch (CaseStatus1){ //Variável a ser analisada
case 1: //Caso seja 1...
Current5V_Positivo=analog0.getValue(); //Faz a leitura analógica já estável +5
Current5V_Negativo=analog1.getValue(); //Faz a leitura analógica já estável -5
Current12V_Positivo=analog3.getValue(); //Faz a leitura analógica já estável +12
Current12V_Negativo=analog2.getValue(); //Faz a leitura analógica já estável -12
Current5V_Positivo=map(Current5V_Positivo,510.0,413.0,0.0,2.5); //Mapeia o valor do ADC para os valores de corrente +5V
Current5V_Negativo=map(Current5V_Negativo,510.0,407.0,0.0,2.5); //Mapeia o valor do ADC para os valores de corrente -5V
Current12V_Positivo=map(Current12V_Positivo,513.0,420.0,0.0,2.5); //Mapeia o valor do ADC para os valores de corrente +12V
Current12V_Negativo=map(Current12V_Negativo,509.0,408.0,0.0,2.5); //Mapeia o valor do ADC para os valores de corrente -12V
//===========================================================Evitar valores < 0========================================================//
if(Current5V_Positivo<0.05){ //Se tensão < 0, zera...
Current5V_Positivo=0; //Zera a tensão
}
if(Current12V_Positivo<0.05){ //Se tensão < 0, zera...
Current12V_Positivo=0; //Zera a tensão
}
if(Current5V_Negativo<0.05){ //Se tensão < 0, zera...
Current5V_Negativo=0; //Zera a tensão
}
if(Current12V_Negativo<0.05){ //Se tensão < 0, zera...
Current12V_Negativo=0; //Zera a tensão
}
Current5V=Current5V_Positivo+Current5V_Negativo; //Imprime a corrente total ±5V
Current12V=Current12V_Positivo+Current12V_Negativo; //Imprime a corrente total ±12V
break; //Para
case 0: //Caso seja 0...
Current5V=0; //Corrente será 0
Current12V=0; //Corrente será 0
break; //Para
}
//=================================================================Proteção==========================================================//
if(Current5V>2.7||Current12V>2.7||CurrentAdj>3.2){ //Se alguma corrente estiver acima de 3A...
digitalWrite(Control0,LOW); //Desliga as saídas fixas
digitalWrite(Control1,LOW); //Desliga a saída ajustável
lcd.clear(); //Limpa o display
lcd.setCursor(5,0); //Seta o cursor
lcd.print("OUTPUT OFF"); //Printa o status
AdjONStatus="OFF"; //Altera o status para OFF
FixedONStatus="OFF"; //Status OFF
lcd.setCursor(2,2); //Seta o cursor
lcd.print("Corrente elevada!"); //Print para corrente acima de 3A
VoltAdj=0; //Tensão será 0
CurrentAdj=0; //Corrente será 0
Current5V=0; //Corrente será 0
Current12V=0; //Corrente será 0
CaseStatus=0; //Muda o status para OFF
CaseStatus1=0; //Muda o status para OFF
delay(2000); //Espera 3 segundos
}
delay(100); //Delay de 100mS
print(); //Chama a função de print
}
//=======================================================Tela e temperatura============================================================//
void print(){ //Função de print
g++; //Tempo para atualizar o display
if(g>8){ //Se g maior que 8...
Temp=analog6.getValue(); //Faz a leitura analógica já estável lm35
Temp=Temp*0.5; //Converte para graus
if(Temp>35){ //Se for maior que 35 °C...
digitalWrite(Fan,HIGH); //Liga o fan
FanStatus="ON"; //Status do fan
}
else{ //Caso não...
digitalWrite(Fan,LOW); //Desliga o fan
FanStatus="OFF"; //Status do fan
}
g=0; //Zera a variáel g
}
lcd.clear(); //Limpa o display
//=======================================================Tratamento para A e mA ±5=====================================================//
lcd.print("CH1|"); //Print do canal
lcd.write(1); //Escreve o caracter especial ±
lcd.print("5V:"); //Print da corrent+5V e -5V
lcd.setCursor(11,0); //Seta o cursor
if(Current5V<1){ //Se corrente for menos que 1A...
Current5V=Current5V*1000; //Exibirá em mili.
lcd.print(Current5V,0); //Imprime a tensão da saída ajustável
lcd.print("mA"); //Em mA
}
else{ //Se não...
lcd.print(Current5V,2); //Imprime a corrente da saída ajustável
lcd.print("A"); //Em A
}
//=====================================================Tratamento para A e mA ±12=====================================================//
lcd.setCursor(0,1); //Seta o cursor
lcd.print("CH2|"); //Print do canal
lcd.write(1); //Escreve o caracter especial ±
lcd.print("12V:"); //Print da corrent+5V e -5V
lcd.setCursor(11,1); //Seta o cursor
if(Current12V<1){ //Se corrente for menos que 1A...
Current12V=Current12V*1000; //Exibirá em mili.
lcd.print(Current12V,0); //Imprime a tensão da saída ajustável
lcd.print("mA"); //Em mA
}
else{ //Se não...
lcd.print(Current12V,2); //Imprime a corrente da saída ajustável
lcd.print("A"); //Em A
}
//===================================================Tratamento status e Tensão Adj===================================================//
lcd.setCursor(17,0); //Seta o cursor
lcd.print(FixedONStatus); //Exibe o status da saída fixa
lcd.setCursor(17,1); //Seta o cursor
lcd.print(FixedONStatus); //Exibe o status da saída fixa
lcd.setCursor(0,2); //Seta o cursor
lcd.print("Adj|"); //Print do canal
lcd.print(float(VoltAdj)+String ("V ")); //Imprime a tensão da saída ajustável
//=======================================================Tratamento para A e mA=======================================================//
lcd.setCursor(11,2); //Seta o cursor
if(CurrentAdj<1){ //Se corrente for menos que 1A...
CurrentAdj=CurrentAdj*1000; //Exibirá em mili.
lcd.print(CurrentAdj,0); //Imprime a tensão da saída ajustável
lcd.print("mA"); //Em mA
}
else{ //Se não...
lcd.print(CurrentAdj,2); //Imprime a corrente da saída ajustável
lcd.print("A"); //Em A
}
lcd.setCursor(17,2); //Seta o cursor
lcd.print(AdjONStatus); //Exibe o status da saída ajustável
//=======================================================Tratamento para Temperatura==================================================//
lcd.setCursor(0,3); //Seta o cursor
lcd.print("T:"); //Imprime C
lcd.print(Temp,1); //Imprime temperatura
lcd.write(2); //Imprime o caracter °
lcd.print("C"); //Imprime C
lcd.setCursor(13,3); //Seta o cursor
lcd.print("FAN:"); //Imprime fan
lcd.print(FanStatus); //Imprime C
delay(200); //Delay de 200mS
}
//=========================================================Configura a função 'mapf"===================================================//
float map(float x, float in_min, float in_max, float out_min, float out_max){ //Range de valores mínimos e máximos
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; //Retorna os valores como float
Conclusão
Abaixo temos algumas fotos do nosso projeto concluído:

O que temos aqui é um pequeno resumo desse projeto, todas as etapas explicadas etapa por etapa, estão no nosso canal, onde temos o total de 6 vídeos passo a passo desse projeto, somos o canal Engenharia Entendida, e lá temos esse e outros projetos!
Confira o tutorial completo em vídeo: http://bit.ly/2MFaFzR!


Deixe uma resposta