Paso 9: Conectar la lámpara principal
Lo único diferente de la lámpara principal para las lámparas del esclavo es que es un microcontrolador diferente (o también puede utilizar arduinos en todas las lámparas de esclavo y cargar el código de esclavo (adaptada) a las lámparas de esclavo). También es la única lámpara que tiene un conector USB y un receptor de infrarrojos.
He quitado la toma mini USB original del tablero y utiliza envoltura cable (los otros cables pequeño estará bien) para conectarlo con cable de 5cm entre. Utilicé la herramienta dremel para hacer un orificio en la lámpara a la toma usb, por lo que puedo actualizar el software principal sin necesidad de abrir la lámpara. En el lado opuesto, hice un hoyo lo suficientemente grande como para el receptor de IR pero lo suficientemente pequeño como para que desde fuera parece sólo un pequeño botón negro. Es una buena Idea para colocar el receptor IR sobre en el medio entre la costura de las dos mitades y la parte inferior de la lámpara.
Conecte el receptor IR a GND, 5V y la salida de la señal al pin al pin digital de arduino 8 (que está vinculada con la interrupción de la captura de timer1 de entrada).
Conectar el transistor NFET para Arduino: Conecte la puerta al pin digital 13 y la fuente a tierra. El drenaje se conecta a la entrada negativa del ventilador. Conecte la entrada positiva del ventilador al pin de 5V de Arduino. Sí, es un ventilador de 12V pero en 5V crea suficiente flujo de aire para mantener el LED enfriado y no crea casi ruido. Si tu ventilador no funciona a 5V, conectarlo a la línea de 12V (que también es válida para todas las lámparas de esclavo por cierto).
Uso dos 1.5 k Ohm resistencias y conectarlos como pullups: uno de SDA (pin analógico 4) 5V y uno de SCL (pin analógico 5) a 5V. Se trata de finalizar para el bus de comunicación I2C. Si se les olvidan, no funciona la comunicación serial. No utilice pullups interno de Arduino, son demasiado débiles (ignorar esta frase si no sabes de los pullups interno de Arduino, son activados por el software y no importa si son activados o no si la soldadura externa pullups).
Las señales PWM se generan usando (rojo y verde) de timer1 y timer2 (azul). Las clavijas de control son pin digital 9 (rojo), pin digital 10 (verde) y pin digital 11 (azul).
Timer1 es un temporizador de 16 bits, dando pasos de color 65'536, que es más que suficiente (por encima de 12 bits no puede ver cualquiera "saltos de color" cuando oscurecimiento) pero sólo un temporizador de 8 bits timer1. Al principio tuve tanto funcionar en modo 8 bits pero que parecía un poco cutre porque nuestros ojos son logarítmicos y el LED es lineal, lo que significa que percibir un cambio de 2 a 4 como un cambio mayor en el brillo de un cambio de 200 a 255. En realidad los 256 pasos de brillo, cuando se hace en una forma logarítmica sólo dan sobre valores de color de 12-13 (en teoría, en realidad es un poco más) por canal, resultando en un total de 13 ^ 3 = 2197 colores distinguibles. Parece mucho pero no es.
Voy un poco en detalle sobre el código ahora, si no estás familiarizado con la materia de tiempo y temporizador de hardware, saltarla.
He buscado en la web durante unas horas tratando de encontrar un método software para aumentar el temporizador de 8 bits, pero todos ellos introducen errores jitter debido al retraso del software, que se traduce en frecuente parpadeo de un led que no es aceptable. Luego se sentó y escribió mi propio código para obtener una mayor resolución. He encontrado que para los valores más bajos, retrasos de software son demasiado lentas, también las interrupciones no son lo suficientemente rápidas (estamos hablando de simple precisión del reloj cpu aquí). Se podría tal vez haber hecho en ensamblador pero no quiero ir por ese camino, no Señor.
En su lugar utilicé un truco (que descubrí por casualidad y ahora estoy muy orgulloso de) que los temporizadores no se actualizan inmediatamente las comparan igualar registro pero tiene un buffer, actualización en el desbordamiento de contador de tiempo siguiente. Con esto en mente, yo use el desbordamiento del timer2 para sincronizar y verificar alarmas y puede hacer un up al temporizador de 16 bits de cualquier temporizador de 8 bits, pero también puede tener que ser 12bits o 13bits. Esto agrega mucha carga de CPU, pero el maestro lámpara sólo debe escuchar el IR, enviar comandos y generar PWM, que todos en su mayoría se realiza en hardware así que hay tiempo suficiente de hacer cálculos y color cosas mientras tanto. Con un arduino CPU reloj de 16Mhz y un prescaler del temporizador de 8 (con un prescaler de 1 la carga de CPU es muy alto debido a interrupciones cada garrapata 256 temporizador) la frecuencia PWM es 2MHz/(2^13) = 244 Hz (para las lámparas de esclavo es sólo 122 Hz ya que ejecuta a 8 Mhz) que es fina (100 Hz es el mínimo para obtener luces libres de parpadeo).
Bueno, así que tenemos una combinación de software y hardware salida PWM con una resolución de 13 bits, dándonos 8191 medidas de color lineal para cada lámpara, esto nos da 254 pasos logarítmicos (la resolución es realmente muy alta y los valores más bajos utilizan el mismo número de pasos de temporizador) dando por resultado diversos colores de 16'387 ' 064. Esto permite cambios de color agradable y suave.
OK, lo suficiente acerca de la teoría del código y el color. Conectar la fuente de alimentación de 12V para el arduino. Tomar el cable de alimentación y poner a través de uno de los dos orificios más pequeños en la parte inferior de la lámpara. Conectar a la entrada de CA de la fuente de alimentación de 12V, asegúrese de utilizar tubería en las juntas soldadas del cable del encogimiento del calor. Arreglar toda la electrónica muy bien en los dos tazones de fuente de madera y fijarlo con pegamento, como se describe para las lámparas del esclavo. Comprobar que las líneas de 230V están aseguradas y bien aisladas. Ahora usted puede enchufar (yo uso un cable de extensión con un switch, también de IKEA). Ser muy cuidadoso ahora, la lámpara tiene todavía algunos lugares (en la fuente de alimentación) con las piezas expuestas 230V.
¿No funciona como se esperaba? Gotcha. Necesita comentario todos updatelamp(x); ordena el código de arduino (también de todas las funciones!), con x siendo 1 a 5 (sólo actualización de lámpara de 0, el maestro). Los comandos updatelamp esperan la adecuada respuesta del esclavo e intentan enviar comandos si no, por lo que el programa cae en un bucle infinito. Usted puede poner en un tiempo de espera en el comando de updatelamp si lo desea, no quería hacerlo ninguna lámpara omite cualquier color.
Oh y mientras se trabaja en la lámpara principal, tres resistencias de telecine (a tierra) de deja decir alrededor de 2k ohmios en cada uno de los pines de señal PWM. Me olvide de hacerlo y durante el arranque de la arduino la lámpara principal parpadea la luz blanca brillante durante aproximadamente medio segundo, cual would't si no había olvidado los jalones...
Si todo está funcionando, es ahora tiempo para conectar los esclavos. Espero que marcó que programado con la dirección del esclavo número uno.
Nota: sé que todavía hay algunos errores en el código, si encuentra uno, por favor informe a mí (y si sabes cómo arreglarlo, me dicen). También mis habilidades de programación son moderados en el mejor y el código es un desastre pero he intentado añadir en comentarios en la mayoría de las líneas (puede ser en alemán en algunas partes, lo siento por eso). Sigue siendo un trabajo en progreso (que código ¿no?) y no completamente limpia.
Adiciones o sugerencias para el código son bienvenidos.