Alguém já conseguiu disparar um triac com arduino? fazer um dimmer por exemplo!

Exibições: 15497

Responder esta

Respostas a este tópico

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

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço