Atenuación de bombilla Arduino 230v

Hola chicos, he investigado mucho y probado en diferentes circuitos para atenuación de luz de 230v (50hz) o 220v, pero no puedo hacer que mi arduino atenúe mi luz. Esto es lo último que probé.

hizo este circuito: circuito y enlace de código

Código que probé:

int AC_LOAD = 3;    // Output to Opto Triac pin
int dimming = 128;  // Dimming level (0-128)  0 = ON, 128 = OFF

void setup()
{
  pinMode(AC_LOAD, OUTPUT);       // Set the AC Load as output
  attachInterrupt(0, zero_crosss_int, RISING);  // Choose the zero cross interrupt # from the table above
}

void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
{
  // Firing angle calculation :: 50Hz-> 10ms (1/2 Cycle)
  // (10000us - 10us) / 128 = 75 (Approx)
  int dimtime = (75*dimming);      
  delayMicroseconds(dimtime);    // Off cycle
  digitalWrite(AC_LOAD, HIGH);   // triac firing
  delayMicroseconds(10);         // triac On propogation delay
  digitalWrite(AC_LOAD, LOW);    // triac Off
}

void loop()
{
  dimming = 128; 
  delay(100);
  dimming = 75;  
  delay(100);
  dimming = 25;  
  delay(100);

}
Olvídese de la rutina de interrupción por unos momentos. ¿Comprobó si realmente ve los cruces por cero en su pin de entrada? Es posible que desee escribir un boceto que alterne el LED pin13 cada 50 o 60 o cruces por cero. Debería ver un parpadeo visible de 1 Hz.
¿Qué pin de entrada usó para conectar el detector de cruce por cero? Tenga en cuenta que el número de interrupción puede no ser el mismo que el número de pin de entrada y que los números de pin de interrupción pueden variar según el tipo de placa Arduino. Entonces, ¿qué Arduino estás usando?
@jippie Estoy usando Arduino uno y mi pin de interrupción es 2
@jippie, soy nuevo en esto, ¿puede ayudarme? "¿Comprobó si realmente ve los cruces por cero en su pin de entrada? Es posible que desee escribir un boceto que alterne el LED pin13 cada 50 o 60 o cruces por cero".

Respuestas (4)

Comenzaría a depurar intentando encender y apagar la carga varias veces en la configuración para asegurarme de que el TRIAC se está disparando, por ejemplo:

void setup()
{
  pinMode(AC_LOAD, OUTPUT);       // Set the AC Load as output
  for (int i=0; i < 10; i++)
  {
      digitalWrite(AC_LOAD, HIGH);   // triac firing
      delay(1000);
      digitalWrite(AC_LOAD, LOW);    // triac Off
      delay(1000);
  }
}

La hoja de datos de MOC3021SM muestra que se pueden requerir 15 mA para controlar el LED. A 3,3 V, como se muestra en el esquema R5, la resistencia 470R limitaría la corriente a 7 mA y a 5 V seguiría siendo solo 10 mA y eso ignora la caída de voltaje directo.

Puede usar un cálculo de resistencia LED normal para determinar la resistencia, parece una caída de voltaje directo de aproximadamente 1,15 V para esa parte a temperatura ambiente, por lo que 120 ohmios a 3,3 V serían más apropiados para dar un poco más de 15 mA. Las siguientes son las recomendaciones con respecto a la corriente LED de la hoja de datos:

Se garantiza que todos los dispositivos se activen con un valor de IF menor o igual que el IFT máximo. Por lo tanto, la FI operativa recomendada se encuentra entre la IFT máxima (30 mA para MOC3020M, 15 mA para MOC3010M y MOC3021M, 10 mA para MOC3011M y MOC3022M, 5 mA para MOC3012M y MOC3023M) y la FI máxima absoluta (60 mA)

Si eso funciona bien, el siguiente paso puede ser probar que la detección de cruce por cero funciona al menos una vez, tal vez usando lo siguiente y viendo si se enciende después de 10 segundos:

void setup()
{
  pinMode(AC_LOAD, OUTPUT);       // Set the AC Load as output
  digitalWrite(AC_LOAD, LOW);     // triac Off
  delay(10000);
  attachInterrupt(0, zero_crosss_int, RISING);  // Choose the zero cross interrupt # from the table above
}


void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
{
    digitalWrite(AC_LOAD, HIGH);   // triac firing
}

Si eso no funciona, tal vez retire U1 el optoacoplador (¿si está en un zócalo?) Y vea si lo anterior funciona si corta la salida entre el emisor y el colector (¡con cuidado!) en U1 juntos para llevar la entrada a tierra. Es posible que tenga un problema general de configuración de interrupción según el pin al que esté conectado, que debe agregar a la pregunta, pero eso ayudará a aislar un problema de software versus hardware.

Gracias por la respuesta. El MOC3021SM funciona perfectamente. Cansé el código que diste y su conmutación perfecta.
Creo que me estoy equivocando con la detección de cruce por cero, ¿pueden guiarme más?
ahora no brilla, cambiaré mis componentes y luego les diré los resultados.
hey peter, puedo obtener la interrupción, pero solo cuando el interruptor está encendido o apagado. no durante otros tiempos alguna sugerencia?
@DanielEuchar, el ZCD detecta que parte de ese circuito también parece poco fiable y solo permite que fluyan unos pocos miliamperios incluso en voltajes máximos. Es mejor que haga una nueva pregunta que muestre esa parte del circuito y busque consejos sobre cómo hacer uno confiable. Como se destaca en mi respuesta y la de Russell, hay muchos problemas de diseño con el circuito solo en el controlador TRIAC (aunque a veces puede funcionar) y el ZCD no parece mucho mejor.

Olvídese de la rutina de interrupción por unos momentos. ¿Comprobó si realmente ve los cruces por cero en su pin de entrada? Es posible que desee escribir un boceto que alterne el LED pin13 cada 50 o 60 o cruces por cero. Debería ver un parpadeo visible de 1 Hz.

No puedo probar el boceto (pero se compila sin errores), pero creo que debería verse un poco así:

const uint8_t ledPin = 13;                          // Digital output pin that has the on board LED
const uint8_t zeroPin = 2;                          // Digital input pin to which the zero crossing detector is connected

uint8_t zeroCounter = 0;
bool zeroState = 0;
bool ledState = 0;

void setup() {
  pinMode( ledPin , OUTPUT );                       // Enable output driver for LED pin
}

void loop() {
  while ( digitalRead( zeroPin ) == zeroState ) {}; // Wait for the state of the zero crossing detector to change
  zeroState != zeroState;
  zeroCounter++;
  if ( zeroCounter == 50 ) {                        // Every 50 zero crossings change the LED state
    ledState != ledState;
    digitalWrite( ledPin , ledState );
    zeroCounter = 0;
  }
}
Probé el código anterior y no, el LED no parpadeó en absoluto :( incluso probé la impresión en serie para verificar el valor, todo estaba lleno con '1'
Comience conectando R1 (10k) a +5 VCC en lugar de +3V3, eso no hace daño.
Sin suerte :( supongo que tengo que reemplazar los componentes. Lo intentaré

Si no MUESTRA el circuito exacto y las conexiones que USTED está utilizando, TODAS las preguntas de este tipo no tienen sentido.

Este es el diagrama del circuito al que se accede a través de la página a la que hizo referencia. Agregue SUS conexiones y publíquelo como parte de su pregunta.

ingrese la descripción de la imagen aquí


La tierra de Arduino DEBE estar conectada a tierra MOC3021.


¡¡¡NÓTESE BIEN!!! - Lo siguiente destaca un defecto en el diseño del circuito. Esto puede o no ser lo que está mal con su circuito. por ejemplo, es posible que hayan descubierto que el MOC3021SM no funcionaba de manera confiable y lo sustituyeron por un MOC3023 o MOC 022. Su problema PUEDE no estar relacionado.

  1. Usando un cable, conecte 3.3V+ al pin de entrada del atenuador.
    Triac debe operar y conducir la carga.

  2. Si 1. funciona, conecte 3.3V+ en la conexión del pin de salida de la unidad Arduino. Idealmente, debe eliminar la conexión del pin Arduino, ya que esto PUEDE dañar el Arduino. En casi todos los casos, debería estar bien, pero la retroalimentación de 3.3V en un controlador bajo es "traviesa" en el mejor de los casos. TRIAC debería funcionar.

Si 1. y 2. no funcionan, el problema podría ser el circuito que se muestra a continuación o aún su culpa. Cambie R5 como se indica a continuación y vuelva a intentar 1 y 2.

Cuando Arduino high OR +3.3V está conectado a Dimmer, debe haber una caída de voltaje en R5 (aproximadamente 1.5V +) y el pin de entrada U @ debe estar a 1.2 - 1.5V por encima de grpund.

El circuito ha sido mal "diseñado" y con una unidad de 3,3 V no funcionará con optoacopladores que cumplan con las especificaciones típicas de la hoja de datos y es (por supuesto) aún peor con las especificaciones de la hoja de datos del peor de los casos. Incluso con una unidad de 5 V, no cumplirá con las especificaciones típicas.
El diseñador, si lo hubo, tuvo un severo desvanecimiento cerebral el día que se diseñó.

Hoja de datos MOC3021 : la marca PUEDE importar, por desgracia.

Voltaje de entrada opto a 20 mA = 1/15 V/1,5 V típico/máx.
Corriente para enclavar TRIAC = 8/15 mA típico/máx.

Trabajando con opto vin TÍPICO y corriente de accionamiento típica (es decir, el caso más optimista).
Iopto = (Vin - Vopto)/R5 = (3,3-1,15)/470 = 4,6 mA.
Corriente optto típica = 8 mA.
En el peor de los casos opto corriente = 15 mA !!!

Corriente de accionamiento Arduino min = ??? mamá.

En el peor de los casos, R5 = (Vin-Vopto_max)/Imax = (3,3-1,5)/15 mA = 120 ohmios.

Vopto_max está a 20 mA, pero PUEDE necesitar la mayor parte de 20 mA en el peor de los casos.
¿Cuál es la capacidad máxima de corriente de la unidad Arduino y a qué cae Vhi en esta corriente?

Cambie R5 a 100 ohmios. O coloque 120 Ohms o 150 Ohms en paralelo con R5.

8-15 mA 1,15-1,5 V (3,3-1,5)/470 =


AGREGADO

Se hizo una pregunta acerca de los dispositivos de corriente de activación muy baja.

Utilice esta búsqueda para ver todos los optoacopladores de cruce por cero de Digikey, ordenados por corriente de trogger ascendente. Ignorando aquellos para los que no se muestra Ift, la familia Vishay IL411x tiene el Ift más bajo a 1,3 mA en el peor de los casos. Dicen que la corriente real utilizada debe ser varias veces mayor, y muestran que la corriente de activación varía con el voltaje y la temperatura de la carga y más. Lea la hoja de datos para obtener más información.

Las familias Fairchild **FOD4xx y xxx son similares.

El MOC3063 de Liteon y otros tiene Ift = 5 mA. Vea la hoja de datos para más detalles.

Arduino basado en AVR puede generar/hundir 40 mA por pin con un máx. de 200mA por paquete. Arduino basado en AVR generalmente funciona a 5 V CC. Arduino Due (no Duemilanove) es un controlador basado en ARM, que tiene un chip 3V3, no está seguro acerca del máximo de salida/fuente. actual.
Probé el código proporcionado por @PerterJ y el triac parece funcionar bien, ¿pueden guiarme? como estoy bastante perdido
@DanielEuchar - PeterJ parece estar en el camino correcto con respecto al código. No solo hagas lo que dice SINO TAMBIÉN entiende por qué las tangas funcionan o no funcionan cuando cambias las cosas. ¿Funciona el código original del sitio web en el que compraste la placa? ¿Qué dicen ellos? SI la unidad TRIAC está bien Y el cruce por cero está bien (lo que debe probar usando los ejemplos provistos), entonces el código que está ejecutando difiere en lo que hace de lo que hacen los ejemplos. ¿Cómo? ¿Por qué?
¡Hola! Estoy tratando de implementar este esquema en Arduino Due usando MOC3043 (cruce por cero, para calentador). Tengo problemas similares con la fuente de corriente máxima en Due (15mA). ¿Alguien puede recomendar un reemplazo de baja corriente para los optopares MOC *?

El código anterior de jippie no funcionó para mí, pero este, que se basa en este código, sí lo hizo. También prueba el ISR.

const uint8_t ledPin = 13;                          // Digital output pin that has the on board LED
const uint8_t zeroPin = 2;                          // Digital input pin to which the zero crossing detector is connected

uint8_t zeroCounter = 0;
bool zeroState = 0;
bool ledState = LOW;

void setup() {
  Serial.begin(9600);
  pinMode( ledPin , OUTPUT );                       // Enable output driver for LED pin
  attachInterrupt(0, zero_crosss_int, RISING);  // Choose the zero cross interrupt # from the table above
}

void loop() {

}

void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
{
  zeroState != zeroState; 
  zeroCounter++;

  if ( zeroCounter == 60 ) {                        // Every 50 zero crossings change the LED state
    ledState = (ledState == LOW) ? HIGH : LOW;
    digitalWrite( ledPin , ledState );
    zeroCounter = 0;
  }
}
Bienvenido a EE.SE. Tenga en cuenta que la referencia al "código anterior" no tiene sentido en un sitio donde las respuestas flotan hacia arriba y hacia abajo con los votos y las preferencias de clasificación de los usuarios. Sin embargo, has anotado el nombre de Jippie para que podamos resolverlo.
Por eso mencioné que era el código de Jippie.