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.
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: