Ajuda com alimentação 12V Arduino (Estou tendo problemas)

Boa tarde pessoal.
Sou novo no fórum e este é meu primeiro post.

Estou postando aqui a minha duvida, mas, antes dei uma pesquisada e encontrei um outro post que parecia com o meu problema, porém me aconselharam a criar um novo, então aqui estou. :slight_smile:

Pois bem, eu estou pretendendo ligar o arduino, uma memória EEPROM 24c08, um módulo Bluetooth e alguns LEDs RGB (4 unidades). A placa onde estão os LEDs possui catodos comuns, para ligar os anodos, estou utilizando transistores em forma de switch (NPN - BC547). (Chegando em casa eu irei postar o diagrama).
Até aí tudo bem, tudo funciona corretamente quando eu uso o USB do computador para passar o 'sketch' do programa para o arduino e testá-lo. Eu utilizo o Serial Monitor para fazer papel do Bluetooth, enviando comandos e ele interpreta bem. Se eu tirar os 4 LEDs RGB e usar apenas um, por questões de consumo, eu consigo também plugar o arduino em um USB de um carregador de celular (5V - 1A) e ele funciona bem, já testei com o bluetooth e está tudo ok.

Os problemas começam quando eu tento utilizar uma fonte externa, simulando o ambiente onde ele irá operar pra valer. Eu utilizo uma fonte do tipo "Switching Supply" que eu tenho em casa, dessas de computador antigo, para fornecer 12V. Eu construí uma pequena plaquinha com um regulador de tensão 7812 com dissipador, um fusível de 0.5A (Afinal eu não quero consumir mais que isso, então melhor que ele queime antes) e dois capacitores de cerâmica de 0.1uF cada, ligados entre o GND e o Vin e Vout. Essa plaquinha fornece 10v para o Arduino (Por causa da queda de tensão de 2V do regulador, até aí normal). Os 10V eu estou conectando no pino Vin do arduino, e o GND no GND do arduino.
O mini array de LEDs possui 5 fios, o GND dele eu ligo direto no GND compartilhado entre a mini-fonte 10~12V (acima), o VCC dele eu ligo direto na mesma trilha da plaquinha que fornece os 10~12V e os outros três fios são canais RGB que eu ligo no emissor de cada transistor (São 3 transistores, um para cada canal). O coletor destes transístores está ligado através de um resistor de 2200ohms nos pinos 9, 10 e 11 do arduino.
O Bluetooth está sendo alimentado por 3.3v, antes era por 5v, mas dá o mesmo problema em qualquer tensão que eu ligue.
A memória EEPROM está ligada em 5V e no SDA / SCL do arduino, pinos analógicos 4 e 5, e claro, GND do arduino.

Agora o problema: quando eu ligo em 12V, parece que tem algum 'ripple', ou ruído na alimentação que deixa o arduino totalmente esquisito, ele não consegue conversar com o meu android via Bluetooth e não consegue ler a EEPROM pra carregar a pré-configuração (Que eu testei diversas vezes anteriormente, via USB).
Eu estou desconfiando que seja isso, porém, só a experiência de vocês poderá me ajudar.

Obrigado pela atenção, e também por ter lido tudo isso, eu tentei detalhar ao máximo porque o meu raschunho do 'fritzing' tá em casa, o código fica no Dropbox então eu irei postá-lo abaixo:

#include <Wire.h>
#define eeprom 0x50
#define tCFG 2         // Melhor usar no máximo 16 bytes (Por causa do tamanho da página da EEPROM
#define PR 9
#define PG 10
#define PB 11
#define ACK  B01111001 //B10000000
#define VERM B00110001
#define VERD B00110010
#define AZUL B00110011
#define CIAN B00110100
#define AMAR B00110101
#define MAGE B00110110
#define BRAN B00110111
#define LARA B00111000

// Dados Globais
byte CFG[tCFG]; // Vetor de configuracoes
byte R = 0x0;
byte G = 0x0;
byte B = 0x0;
byte cmd,val,ack = B00000000;

void setup(void)
{
  Wire.begin();  
  Serial.begin(9600); 

  pinMode(PR,OUTPUT);
  pinMode(PG,OUTPUT);
  pinMode(PB,OUTPUT);

  //Serial.println("Carregando configuracoes...");
  configurar();
  inicializar();
 
  for(int i=0; i<tCFG; i++)
  {
    Serial.print(">");
    Serial.println(CFG[i]);
  }
}

void loop() 
{
  boolean ajustarLED = false;
  byte cor = CFG[0];
  
  while(Serial.available()>0)
  {
    delay(4);
    cmd = Serial.read();     
    delay(2);
    val = Serial.read();     
    delay(2);
    ack = Serial.read();     
    delay(2);

    Serial.print("Comando:");
    Serial.println(cmd);
    Serial.print("Valor: ");
    Serial.println(val);
    Serial.print("Fim: ");
    Serial.println(ack);

    if(cmd == ACK)
    {
      CFG[0] = (val-0x30);
      ajustarLED = true;
    }
    else 
    {
      Serial.print("Nao entendi: ");
      Serial.print(cmd);
      Serial.print(", ");
      Serial.print(val);
      Serial.print(", ");
      Serial.println(ack);
    }

    cmd = val = ack = B00000000;
  }
  
  if(ajustarLED)
  {
    corLED(CFG[0]);
    mudarLED();
    gravarCFG();
    ajustarLED = false;
    Serial.print("LED Ajustado! ");
    Serial.println(CFG[0]);
  }
}

void configurar()
{
  boolean reconfig = false;
  lerCFG();
  // Tratar os valores padrao
  if(CFG[0]>0xF) { CFG[0] = 0x2; reconfig = true; }               // Cor padrao do painel
  if(CFG[1]!=0x0||CFG[1]!=0x1) { CFG[1] = 0x1; reconfig = true; } // Os LED estarao acesos ou nao?
  
  // Se houveram modificações, precisa gravar de novo
  if(reconfig) 
  {
    Serial.println("Foi necessario reconfigurar a EEPROM");
    gravarCFG();
  }
}

void inicializar()
{
  corLED(CFG[0]);
  mudarLED();
}

void gravarCFG()
{
  Wire.beginTransmission(eeprom);
  Wire.write(B10100000);
  Wire.write(B00000000);
  for(int i=0;i<tCFG;i++)
  {
    delay(10);
    Wire.write(CFG[i]);
  }
  Wire.endTransmission();
}

byte lerCFG()
{
  Wire.beginTransmission(eeprom);
  Wire.write(B10100001);
  Wire.endTransmission();
  Wire.requestFrom(eeprom,tCFG);
  for(int i=0;i<tCFG;i++)
  {
    if (Wire.available()) 
      CFG[i] = Wire.read();  
    delay(5);
  }
}

// Função para ajustar e exibir a cor do led RGB
void corLED(byte pCor)
{
  switch(pCor)
  {
    case 0x0: R=0xFF; G=0x00; B=0x00;  break;
    case 0x1: R=0x00; G=0xFF; B=0x00;  break;
    case 0x2: R=0x00; G=0x00; B=0xFF;  break;
    case 0x3: R=0x00; G=0xFF; B=0xFF;  break;
    case 0x4: R=0xFF; G=0xFF; B=0x00;  break;
    case 0x5: R=0xFF; G=0x00; B=0xFF;  break;
    case 0x6: R=0xFF; G=0xFF; B=0xFF;  break;
    case 0x7: R=0xFF; G=0x40; B=0x00;  break;
    default:  R=0x00; G=0x00; B=0xFF;  CFG[0] = 0x2;  break;
  }
}

void mudarLED()
{
  if(CFG[1]==0x1)
  {
    analogWrite(PR,R);
    analogWrite(PG,G);
    analogWrite(PB,B);
  }
}

EDITADO: Segue a imagem do circuito:

E se tentares usar outro transformador para ligares na placa que fizeste com o regulador de tensao
Esse problema como suspeitas pode muito bem ser ripple na alimentaçao ou num caso bem pior nao ter os condensadores para eleminar o ripple dentro desse transformador, sem bem que pouco provavel ,mas pelas duvidas coloca um condensador eletrolitico de grande capacidade algo tipo 2200uF e vê o efeito.

Olá Hugo!

Ontem à noite eu tentei ligar de outra forma, liguei nos 12V do carro, eu adicionei um capacitor eletrolítico de 1000uF em paralelo à alimentação do circuito, nos 12V. Além disso, eu fiz o tal do "Decoupling" com um capacitor cerâmico de 0.1uF bem pertinho (fisicamente) da alimentação da EEPROM, ela agora está funcionando como deveria, agora só restou o problema da comunicação com o Bluetooth, ele está se comportando de maneira parecida quando colocamos dois dispositivos pra conversar no Baud Rate incorreto, ele está 'comendo' partes das strings, hora não diz nada, hora trava.
Quando trava, eu reinicio o arduino mas o Bluetooth continua conectado ao Android, só que durante o Boot do Arduino o Bluetooth parece que libera o cache. Abaixo tem dois screenshots do programa que eu uso pra ver a entrada e saída do Bluetooth, um deles é como ele funciona quando plugado no carregador de celular (5V) e sem aquela parafernália do 7812 (Ele manda certinho as mensagens de Debug). A outra imagem é um print da saída dele quando o bluetooth trava (Não interpreta os comandos) e daí eu aperto o "Reset" na placa do Arduino (Ele escreve um monte de trechos, sem completar nenhum, nesse caso, ele também não interpreta meus comandos).

Resumindo, em média, de 10 comandos que eu envio para o arduino via Bluetooth, ele interpreta apenas 1.

Uma vez que tas a usar um Bluetooth na porta serie vê qual o efeito se descativares o auto reset.para isso coloca uma resistência de 120 entre o pino de reset e os 5 V
Pode ser quando o android inicia a conexão o arduino se reset e poderá ser este o teu problema

Gente. Eu consegui corrigir o meu problema, eu vou postar a resposta aqui por motivos de consulta futura, caso alguem necessite.
Os ultimos sintomas que eu estava tendo estavam relacionados a comunicacao serial via bluetooth. Eu troquei o fio que eu estava usando para o TX e RX, que era um flat cable em duas vias paralelas, 26 AWG, por um par trançado, desses de cabo de rede. Eu acho que a propria comunicacao estava causando ruidos que o arduino tentava interpretar e o Serial.available() dava sempre um valor maior que Zero.
Para auxiliar eu coloquei o fio por dentro de um tubo de ferrite. Nao sei se vai ajudar, mas colquei mesmo assim..
Agora o bicho esta rodando liso...
Obrigado pela ajuda pessoal!

Está tirando esse 3v3 de onde? alguma fonte de 3.3V ou está alimentando pela porta 3v3 do arduino?

Se estiver utilizando o 3v3 direto do arduino, este pode ser o problema.
Quem fornece o 3v3 é o chip FTDI, quando você alimenta via usb lá está os 3v3 funcionando.
Quando alimenta por fora, não existe 3v3 disponível. Este pode ser o problema com o bluetooth.

Quanto aos 10V, 12V, etc...
A sua fonte chaveada é de 12V? Se for, não tem como alimentar corretamente o 7812 pois ele precisa de pelo menos 14,5V para trabalhar corretamente. Estes 10V de saída nunca serão muito estáveis.

Então, os 3.3v eu estou usando do próprio Arduino (o meu é o Rev3 e talvez ele tenha um regulador interno porque eu o alimento com 12v no pino Vin e ele consegue fornecer corretamente os 3.3v e os 5v também). Mas enfim, agora até que está funcionando bem, e eu estou utilizando o 7812 mais como uma proteção mesmo, porque como ele fica no carro, cada vez que eu dou umas 'aceleradas', o alternador irá girar mais rápido e a tensão pode subir até os 14v, aliás, eu digo isso porque já ouvi falar, não cheguei a medir e pode ser que o carro já tenha algum regulador de 12v para os fios "pós-chave" que é onde o Arduino está ligado.

Mesmo assim, agradeço muito a sua resposta, e logo eu irei trocar o regulador 7812L que estou usando por um 7809 que eu tenho aqui, afinal eu não estou precisando de 12v pra alimentar nada em especial, eu só terei de trocar alguns resistores...

E sobre a fonte chaveada, eu estava usando uma de computador, dessas comuns e fajutas, mas era pra testar dentro de casa mesmo, porque a idéia é que o negócio fique no carro.

Abraços!

Essa questão do 3v3 eu disse pois o arduino Nano tem este problema. O R3 tem um regulador dedicado ao 3v3.

Mas quanto a alimentação de 12V, o melhor é utilizar um 7809 mesmo pois a família 78XX precisa SEMPRE de no mínimo XX + 2,5V para funcionar direito.
Se alimentar um 7812 com 12V, a única certeza que você terá na vida é que vai sair porcaria do 7812.

Boa sorte com seu projeto.

hehehe, pois é...
Pior que se eu tivesse um osciloscópio dava até pra ver que tipo de porcaria estava saindo do 7812 ligado em 12v :P.
Mas logo eu troco pelo 7809, pra ficar melhor! :slight_smile: