Alguém já conseguiu disparar um triac com arduino? fazer um dimmer por exemplo!
Tags:
Olá Mauro e Euclides,
O Euclides tem razão em temer a "espera" do processamento, a instrução digitalWrite é muito demorada, em aplicações como esta onde o tempo é crítico, é mais eficaz acessar o registrador de uma Porta do microcontrolador diretamente, assim podemos controlar os 8 bits (pinos) de uma porta de uma só vez. Procure mais detalhes no link abaixo:
http://www.arduino.cc/en/Reference/PortManipulation
Abraço.
Legal, Wiechert, vou ver se arrumo uns TRIACs dia desses para testar, quem sabe até fazer uma lib multi-dimmer...
Mauro. Estou "terminando" aquele shield para Dimmer, deixei com o cara do silkscreen para fazer a chapa que vai gerar as placas. Se der tudo certo até sexta pode ser que ele me entregue pronto para "ir pro ácido" e aí poderemos montar pelo menos 1 para testar no Sábado (preciso ver o que será necessário de componentes).
Quanto ao "Multi-Dimmer" pode contar comigo.
Acabei de perceber que a galera aqui eh realmente apaixonada pelo que faz.
:D Valeu pelas respostas e dicas...
Vou quebrar a cabeça aqui tentando bolar algum algoritmo para com apenas 1 interrupção conseguir utilizar 10 Dimmers.
Ja comprei os componentes necessários para o sensor de zero. (Minha cidade aqui não tem uma loja de eletrônica que preste, preciso comprar pela internet mas acho que essa semana ainda chega).
Quanto ao Multi-Dimmer achei fantastica a ideia. Se eu puder colaborar com algo estarei ai.
Lembrando que meu conhecimento em eletrônica eh baixo hehehe... Mas devagarinho vou me aventurando e desvendando o caminho das pedras.
Abraços e obrigado mesmo galera!
Tiago Struck se pretende controlar mais de um dimmer a ideia é essa.
A cada 8,33ms terá uma interrupção externa.
Os primeiro 500us ira ser perdido por atraso na interrupção e também não poderá usar os últimos 500us por medida de segurança(senão pode virar um pisca-pisca), logo terá 7,73ms para a calculeira.
Supondo que deseja uma precisão de "8bits". Vai ter que dividir esses 7,73ms em 256 partes que vai dar 30,19us.
A cada interrupção externa terá que disparar uma de timer e gerar interrupções de timer a cada 30,19us, cada semi ciclo tera num totat de 256+2 interrupções de timer.(considerando o tempo minimo de acionamento de cada saida em 2 x 30,19us).
Dentro da interrupção do timer sera incrementada um variavel que chamaremos de count e ela sera zerada a cada interrupção externa, quando count chegar a 258 dentro do timer é desativado a interrupção do timer e desligado todas as saídas de dimmer.
Pra setar a saída de dimmer, se compara o valor de count com o valor desejado para a saida(valor de saida entre 0 e 255, essa comparação esta dentro da interrupção de timer), se count for maior, seta a saida... assim vai...
Dica: Não use qualquer especie de delay dentro dessas interrupções e nem outras que por ventura ja estiver usando. Também o somatório das interrupções que podem acontecer no mesmo momento não podem demorar mais que 30us, senão seu dimmer pode dar umas balançadas..
Good luck!!
Jucilei agradeço a ajuda.
O grande detalhe é que, usarei 10 Dimmers porem, eles não serão ligados/desligados todos juntos de uma unica vez...
Estou fazendo uma automação para minha casa, e esses 10 Dimmers irão controlar iluminação de ambientes distintos, cada um deles cuidará de um ambiente.
Então acho que o algoritmo será algo um pouco complexo com apenas 1 interrupção, mas estou aqui rabiscando e pensando como fazer...
Agradeço desde já!
Abraços
Santa passoka batman!!!...diria o Robin...
Realmente a idéia seria não ter "delays", mas tão somente o "momento certo" (nos microsegundos dentro da "onda", exceto claro o tempo mínimo para que cada gate "assuma" seu estado) para disparar cada uma das saídas de cada lâmpada.
Obrigado pela ajuda Joe, vou ler as matérias e aplica-las aqui!
Reporto os resultados para a comunidade.
Abraços
Olá Galera tudo bem?
Estou testando esse artigo aqui do Mauro hoje... http://automatobr.blogspot.com.br/2013/05/controle-de-potencia-em-c...
Porem, me deparei com um problema logo nesse primeiro exemplo.
Minha variavel pulsos não sai do 0.
Ja fiz alguns testes como:
Colocar uma resistencia de 100k na entrada, trocar o 4N25 por outro.
Estou ligando na entrada 220V.
O meu código esta EXATAMENTE Igual ao do Mauro no blog.
Na saída do 4N25 estou utilizando um resistor de 2,2K (Já testei com 10k e 1k e ficou a mesma coisa).
Alguém consegue me ajudar e me orientar o que estou fazendo errado?
Agradeço desde já!
Abraços
Teste o 4N25, coloque-o em uma protoboard, ligue um resistor de 330 homs entre o Vcc (do Arduino) e o pino 1 (do 4N25). ligue o pino 2 (do 4N25) no GND (do Arduino). em seguida meça a resistência entre o pino 4 e o pino 5 (do 4N25). Ligue e desligue o pino 1 (do 4N25) do Vcc e veja se está variando a resistencia entre os pinos 4 e 5.
Na figura está 33K, este valor é para 110Volts, e não para este teste de 5Volts.
Coloque os resultados aqui.
Valeu Euclides, na verdade era outra coisa...
depois que eu coloquei: digitalWrite(2, LOW); no setup passou a funcionar...
Já fiz o dimmer funcionar... por questões de achar exagero 10 Dimmers, baixei o numero para 6, então meu código ficou assim:
//Sliders
#define S1 3
#define S2 5
#define S3 6
#define S4 7
#define S5 8
#define S6 9
volatile int valorS1 = 0;
volatile int valorS2 = 0;
volatile int valorS3 = 0;
volatile int valorS4 = 0;
volatile int valorS5 = 0;
volatile int valorS6 = 0;
void setup(){
//Seta como LOW Pino para AttachInterrupt Dimmer - Sensor de zero.
digitalWrite(2, LOW);
//Seta Pinos Sliders
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(S4, OUTPUT);
pinMode(S5, OUTPUT);
pinMode(S6, OUTPUT);
//Seta Pinos Sliders como LOW
digitalWrite(S1, LOW);
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
digitalWrite(S4, LOW);
digitalWrite(S5, LOW);
digitalWrite(S6, LOW);
attachInterrupt(0, zero_crosss_int, RISING);
}
void zero_crosss_int() {
// Cálculo do ângulo de disparo: 60Hz-> 8.33ms (1/2 ciclo)
// (8333us - 8.33us) / 256 = 32 (aprox)
if (valorS1 > 0){
int powertimeS1 = (32*(256-valorS1));
// Mantém o circuito desligado por powertime microssegundos
delayMicroseconds(powertimeS1);
// Envia sinal ao TRIAC para que ele passe a conduzir
digitalWrite(S1, HIGH);
// Espera alguns microssegundos para que o TRIAC perceba o pulso
delayMicroseconds(8.33);
// Desliga o pulso
digitalWrite(S1, LOW);
}
if (valorS2 > 0){
int powertimeS2 = (32*(256-valorS2));
// Mantém o circuito desligado por powertime microssegundos
delayMicroseconds(powertimeS2);
// Envia sinal ao TRIAC para que ele passe a conduzir
digitalWrite(S2, HIGH);
// Espera alguns microssegundos para que o TRIAC perceba o pulso
delayMicroseconds(8.33);
// Desliga o pulso
digitalWrite(S2, LOW);
}
if (valorS3 > 0){
int powertimeS3 = (32*(256-valorS3));
// Mantém o circuito desligado por powertime microssegundos
delayMicroseconds(powertimeS3);
// Envia sinal ao TRIAC para que ele passe a conduzir
digitalWrite(S3, HIGH);
// Espera alguns microssegundos para que o TRIAC perceba o pulso
delayMicroseconds(8.33);
// Desliga o pulso
digitalWrite(S3, LOW);
}
if (valorS4 > 0){
int powertimeS4 = (32*(256-valorS4));
// Mantém o circuito desligado por powertime microssegundos
delayMicroseconds(powertimeS4);
// Envia sinal ao TRIAC para que ele passe a conduzir
digitalWrite(S4, HIGH);
// Espera alguns microssegundos para que o TRIAC perceba o pulso
delayMicroseconds(8.33);
// Desliga o pulso
digitalWrite(S4, LOW);
}
if (valorS5 > 0){
int powertimeS5 = (32*(256-valorS5));
// Mantém o circuito desligado por powertime microssegundos
delayMicroseconds(powertimeS5);
// Envia sinal ao TRIAC para que ele passe a conduzir
digitalWrite(S5, HIGH);
// Espera alguns microssegundos para que o TRIAC perceba o pulso
delayMicroseconds(8.33);
// Desliga o pulso
digitalWrite(S5, LOW);
}
if (valorS6 > 0){
int powertimeS6 = (32*(256-valorS6));
// Mantém o circuito desligado por powertime microssegundos
delayMicroseconds(powertimeS6);
// Envia sinal ao TRIAC para que ele passe a conduzir
digitalWrite(S6, HIGH);
// Espera alguns microssegundos para que o TRIAC perceba o pulso
delayMicroseconds(8.33);
// Desliga o pulso
digitalWrite(S6, LOW);
}
}
Daí no loop é só receber os valores para as variaveis valorS1, valorS2 e etc...
Obs:
Fiz o sensor de zero parecido com: http://automatobr.blogspot.com.br/2013/05/controle-de-potencia-em-c...
A saída para a lampada eu fiz parecido com esse artigo: http://www.cuin.com.br/2012/08/rele-de-estado-solido-para-arduino-o...
Funcionou 100%, só não sei dizer as vantagens e desvantagens de utiliza-lo.
Como dá pra ver ele é bem simples e não tem capacitor, acredito que ele deva ser menos seguro.
Quem entende mais de eletronica pode me responder e quem sabe me dar umas dicas :D
Agradeço desde já a todos!!!
Abraços
Tiago,
Vc só aciona um dimmer por vez?
Se não, a potência que vc quer controlar está indo até o máximo?
[],
Mauro
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por