Paso 4: Software
Soy un ingeniero de software de comercio por lo que esta parte es la más detallada.
Summery: cuando las botas primer Arduino se llama al método setup(). Ahí configurar algunas de las variables y los lugares de salida para usarse más adelante. zeroCrossInterupt() se llama / funcionó cada vez que la CA cruza de positivo al voltaje negativo. Se establece el indicador de zeroCross para cada canal e iniciar el temporizador. El método loop() se llama continuamente para siempre. Para activar la salida, el TRIAC sólo tiene que ser activado de 10 microsegundos. Si es el momento de accionar él TRIAC y zeroCross ha pasado la salida se encenderá hasta el final de la fase AC.
Hubo algunos ejemplos en línea que utilizaba para conseguir este proyecto iniciado. Lo principal que no podía encontrar era tener varias salidas TRIAC. Otros utilizan la función de retardo a la salida PWM, pero que no funcionaría en mi caso porque el ATMEGA tiene que estar escuchando a DMX todo el tiempo. Resuelven pulsando el TRIAC en tantos ms después de zero-cross. Por pulsación el TRIAC más cerca para zero-cross más del pecado la onda es salida.
Aquí es la media onda de pecado de 120 VAC como luce en un osciloscopio, arriba.
El ISP814 está conectado para interrumpir 1. Así que cuando recibe señal de que la CA transición de positivo a negativo o viceversa zeroCross para cada canal establece en true e inicia el cronómetro.
En el método loop(), comprueba cada canal si zeroCross es verdad y lo ha pasado el tiempo para que pueda activar parpadeará el TRIAC de 10 microsegundos. Esto es suficiente para activar el TRIAC. Una vez que un TRIAC es en permanecerá encendido hasta zeroCross. Parpadea la luz cuando el DMX rondaba el 3% así que añadido el recorte allí para evitar que. Esto fue causado el Arduino es demasiado lento, y el pulso a veces daría la próxima ola de pecado en vez del 4% de la onda.
También en el loop() configurar el valor PWM de los LED de estado. Estos LED pueden usar el PWM interno generado por el Arduino pues no hay que preocuparse de zeroCross de AC. Una vez que el PWM es el Arduino continuarán en ese brillo hasta dijo otro sabio.
Como se señaló en los comentarios arriba para poder utilizar una interrupción de DMX en el pin 2 y funcionar a 20 MHz se tienes que editar algunos de los archivos de la aplicación de Arduino. En HardwareSerial.cpp que un trozo de código debe ser suprimido, esto nos permite escribir nuestra propia llamada de interrupción. Este método ISR está en la parte inferior del código para manejar la interrupción DMX. Si vas a usar un Arduino como programador ISP, asegúrese de revertir los cambios realizados en HardwareSerial.cpp de lo contrario el ATMEGA328 en el tablero de pan será inalcanzable. El segundo cambio es un easer uno. El archivo boards.txt tiene que ser cambiado a la nueva velocidad de reloj de 20MHz.
Brightness[CH]=Map(DmxRxField[CH],0,265,8000,0);
Mapas de brillo a 8000 ya que es la cantidad de microsegundos de 1/2 una onda de seno la CA a 60hz. Por lo que en el brillo completo DMX 256 el programa dejará 1/2 AC en la onda de seno para 8000.... Se me ocurrió con 8000 por conjetura y cheque. Matemáticas de 1000000us / 60hz/2 = 8333 así que podría ser un número más, pero con la 333us extra sobre la cabeza permite lo TRIAC abrir y cualquier inquietud en el programa es probablemente una buena idea.
En Arduino 1.5.3 que se trasladaron a la ubicación del archivo HardwareSerial.cpp. Ahora es /Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino/HardwareSerial0.cpp tendrá que comentar este si todo cuadra a partir de línea 39: #if defined(USART_RX_vect)
De lo contrario terminarás con este error: core/core.a(HardwareSerial0.cpp.o): en la función '__vector_18':