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

Exibições: 15497

Responder esta

Respostas a este tópico

Realmente. senão pode estar "encavalando" os delays e isso pode atrapalhar o resultado.

Uma forma simples é comparar o valor de controle atual com o valor anterior e só executar mudanças nos cálculos quando isso ocorrer.

tipo:

"if (valorSNatual <> valorSNanterior ){"....etc...

Mas para ser mais exato seria necessário um conbrole de ocorrências fora dos delays e que disparasse cada evento quando chegasse o "microssegundo certo" para ele ocorrer ou ser desligado (saltando os delays de 8.33 microsegundos, que atende a saída atual, mas que atrapalham as outras por não ocorrer em paralelo).

O que acha Mauro?

É verdade, nos testes acionei apenas 1 por vez o0.

Já vou testar aqui para acionar todos juntos, vamos ver o que ocorre...

Estou utilizando um resistor de 100K na entrada do sensor zero. (O de 33K estava esquentando pra caramba). (Obs: estou usando resistor de 1/4W)

O Dimmer vai de 0 a 234.

vou montar mais alguns reles aqui para fazer a saida em todos juntos assim que conseguir testar eu reporto aqui o resultado.

Abraços

Tiago.

Vc. está com muita sorte...

Veja os resultados dessa semana: http://labdegaragem.com/photo/albums/placa-dimmer-shield

Acredito que a ponte estava com defeito, alem de que me baseei em outra placa onde a ponte vinha antes dos resistores redutores (tive que usar 2 resistores de 56K).

Em outro circuito montado sobre protoboard os resultados foram certinhos, pois coloquei os 2 resistores de 56K, antes da ponte, um em cada fase e assim não esquentaram (nem explodiu como esta placa).

Volta pra "prancheta"...

Qualquer coisa "bota aí".

Dei uma a

cochambrada na plaquinha:


E liguei em 220Volts novamente, desta vez não deu problema.

Amanhã se tudo correr bem irei testar conectado ao Arduino.

Neste circuito Pode-se selecionar:

2 pinos para sensor de zero-cross (como precisa-se somente de 1, é para prevenir que outro shield não esteja usando um ou o outro).

8 pinos para disparo do TRIAC (teoricamente poderia-se controlar 6 Dimmers ao mesmo tempo, veja a seguir porque, e mais 2 como liga/desliga), ou dependendo da utilidade dos pinos poder se selecionar outros se outro shield estiver usando algum necessário.

6 pinos para o sensor de nível de luminosidade (potenciômetro).

Esta quase acabando...

Olá Tiago

Para resolver o problema do aquecimento, do resistor (33K) vc devera colocar uma associação resistor /capacitor no lugar do resistor de 33K, veja neste tópico logo nas primeiras paginas tem como calcula-los.

http://labdegaragem.com/forum/topics/ajuda-com-fonte-sem-transforma...

Não descuide da isolação, nos fotoacopladores, as trilhas DC não podem ficar próximas a do AC.

Abços

Valeu pela dica Joe, como disse meu conhecimento em eletronica é limitado. Vou verificar e fazer o circuito dessa forma.

Como desejo utilizar apenas um sensor de 0, vou faze-lo bem feito.

Abraços

É verdade galera, da forma que eu fiz o código esta "encavalando" tudo, se perde completamente já com 2 Dimmers.

Vou estudar outra forma de fazer o código.

Se alguem tiver mais dicas pode postando aí que já vou testar no circuito.

Abraços

Amigo, já descrevi como deve fazer, não é simples como compilar um stech mais funciona..... Domine bem interrupção de timer e externa, faça como sugeri com um triac só, depois vai implementando os outros..... Não use qualquer especie de delay dentro de interrupções e se puder escrever direto no pino melhor..

É, essa rotina é um desafio, Tiago. Boa diversão!

Realmente Mauro, ta dificil... queimando neuronios aqui...

Tentei fazer com TimerOne, conforme exemplo postado aqui, mas nada (nem ligou a lampada hehe).

Estou aqui forçando e lendo e vendo (artigos e videos gringos) para ver se descubro como fazer, se tiver algum avanço eu posto aqui.

Abraços

Fala galera tudo bem? Hoje estou bem feliz hehehe...

Achei uma luz BEM brilhante referente a esse tema. Estou estudando o código para ver como ele funciona, já fiz umas modificações, e esta rodando legal...

/*
AC Light Control

Ryan McLaughlin <ryanjmclaughlin@gmail.com>

The hardware consists of an Triac to act as an A/C switch and
an opto-isolator to give us a zero-crossing reference.
The software uses two interrupts to control dimming of the light.
The first is a hardware interrupt to detect the zero-cross of
the AC sine wave, the second is software based and always running
at 1/128 of the AC wave speed. After the zero-cross is detected
the function check to make sure the proper dimming level has been
reached and the light is turned on mid-wave, only providing
partial current and therefore dimming our AC load.

Thanks to http://www.andrewkilpatrick.org/blog/?page_id=445
and http://www.hoelscher-hi.de/hendrik/english/dimmer.htm
*/

/*
Modified by Mark Chester <mark@chesterfamily.org>

to use the AC line frequency (half-period) as a reference point
and fire the triacs based on that plus a dimmer delay value.
I removed the second timer-based interrupt and replaced it with a
means to reference the zero-crossing point as per interrupt 0.
*/

// General
unsigned long int ZeroXTime1 = 0; // Timestamp in micros() of the latest zero crossing interrupt
unsigned long int ZeroXTime2 = 0; // Timestamp in micros() of the previous zero crossing interrupt
unsigned long int NextTriacFire[4]; // Timestamp in micros() when it's OK to fire the triacs again.
unsigned long int DimStep; // How many micros() in each step of dimming
int Dimmer[4]; // The dimmer input variable. One for each channel
byte TriacPin[4] = {3,5,6,7}; // Which digital IO pins to use
boolean OKToFire[4]; // Bit to say it's OK for the triacs to fire
volatile boolean zero_cross = 0; // Boolean to store a "switch" to tell us if we have crossed zero

void setup() { // Begin setup
pinMode(TriacPin[0], OUTPUT); // Set the Triac pin as output
pinMode(TriacPin[1], OUTPUT); // Set the Triac pin as output
pinMode(TriacPin[2], OUTPUT); // Set the Triac pin as output
pinMode(TriacPin[3], OUTPUT); // Set the Triac pin as output
attachInterrupt(0, zero_cross_detect, FALLING); // Attach an Interupt to Pin 2 (interupt 0) for Zero Cross Detection
delay(50); // Give the interrupt time to capture a few AC cycles
} // End setup

void zero_cross_detect() { // function to be fired at the zero crossing
zero_cross = 1; // All we do is set a variable that's picked up later in the code
}

void loop() { // Main Loop
if ( zero_cross ) { // Did we detect a zero cross?
ZeroXTime2 = ZeroXTime1; // shift the current zero cross value to the previous
ZeroXTime1 = micros(); // set the new current zero cross time in micros()
DimStep = (ZeroXTime1 - ZeroXTime2)/768; // Calc the duration of each dimming step
Dimmer[0] = map(analogRead(0), 0, 1022, 255, 0); // Read in a dimmer value (change to suit needs)
Dimmer[1] = map(analogRead(1), 0, 1022, 255, 0);
Dimmer[2] = map(analogRead(2), 0, 1022, 255, 0);
Dimmer[3] = map(analogRead(3), 0, 1022, 255, 0);

NextTriacFire[0] = ZeroXTime1 + (Dimmer[0] * DimStep); // Calc the next triac fire time
NextTriacFire[1] = ZeroXTime1 + (Dimmer[1] * DimStep);
NextTriacFire[2] = ZeroXTime1 + (Dimmer[2] * DimStep);
NextTriacFire[3] = ZeroXTime1 + (Dimmer[3] * DimStep);

OKToFire[0] = 1; // Tell us it's OK to fire the triacs
OKToFire[1] = 1;
OKToFire[2] = 1;
OKToFire[3] = 1;
zero_cross = 0; // Done. Don't try again until we cross zero again
}

if ( OKToFire[0] && micros() >= NextTriacFire[0] && Dimmer[0] < 255 && Dimmer[0] > 0) { // Are we OK and past the delay time?
digitalWrite(TriacPin[0], HIGH); // Fire the Triac mid-phase
OKToFire[0] = 0; // We fired - no longer OK to fire
digitalWrite(TriacPin[0], LOW); // Turn off the Triac gate (Triac will not turn off until next zero cross)
} else if (Dimmer[0] == 0){
digitalWrite(TriacPin[0], HIGH); // Fire the Triac mid-phase
} else if (Dimmer[0] == 255) {
digitalWrite(TriacPin[0], LOW); // Fire the Triac mid-phase
}


if ( OKToFire[1] && micros() >= NextTriacFire[1] && Dimmer[1] < 255 && Dimmer[1] > 0) { // Are we OK and past the delay time?
digitalWrite(TriacPin[1], HIGH); // Fire the Triac mid-phase
OKToFire[1] = 0; // We fired - no longer OK to fire
digitalWrite(TriacPin[1], LOW); // Turn off the Triac gate (Triac will not turn off until next zero cross)
} else if (Dimmer[1] == 0){
digitalWrite(TriacPin[1], HIGH); // Fire the Triac mid-phase
} else if (Dimmer[1] == 255) {
digitalWrite(TriacPin[1], LOW); // Fire the Triac mid-phase
}

if ( OKToFire[2] && micros() >= NextTriacFire[2] && Dimmer[2] < 255 && Dimmer[2] > 0) { // Are we OK and past the delay time?
digitalWrite(TriacPin[2], HIGH); // Fire the Triac mid-phase
OKToFire[2] = 0; // We fired - no longer OK to fire
digitalWrite(TriacPin[2], LOW); // Turn off the Triac gate (Triac will not turn off until next zero cross)
} else if (Dimmer[2] == 0){
digitalWrite(TriacPin[2], HIGH); // Fire the Triac mid-phase
} else if (Dimmer[2] == 255) {
digitalWrite(TriacPin[2], LOW); // Fire the Triac mid-phase
}

if ( OKToFire[3] && micros() >= NextTriacFire[3] && Dimmer[3] < 255 && Dimmer[3] > 0) { // Are we OK and past the delay time?
digitalWrite(TriacPin[3], HIGH); // Fire the Triac mid-phase
OKToFire[3] = 0; // We fired - no longer OK to fire
digitalWrite(TriacPin[3], LOW); // Turn off the Triac gate (Triac will not turn off until next zero cross)
} else if (Dimmer[3] == 0){
digitalWrite(TriacPin[3], HIGH); // Fire the Triac mid-phase
} else if (Dimmer[3] == 255) {
digitalWrite(TriacPin[3], LOW); // Fire the Triac mid-phase
}
}

Vou fazer esse rele de estado sólido agora para testar, acho que a unica modificação que vou precisar fazer será do resistor de 2K, como estou usando o MOC3021 vou usar o resistor de 390Ohms.

O pessoal que manja mais de eletronica, esse Rele da imagem é seguro?

Abraços

Onde está neste circuito a entrada de energia AC???

Só aparece a "saída" para a lâmpada...

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço