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);
}
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.
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;
}
}
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.
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.
Usando un cable, conecte 3.3V+ al pin de entrada del atenuador.
Triac debe operar y conducir la carga.
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.
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;
}
}
yippie
yippie
Daniel Eucar
Daniel Eucar