Dimmable AC Light Box
For the python script, I used the python module, PySerial to communicate to the port. As I couldn’t get PySerial to work on Windows 7, I decided to write a quick VB app. I added to the app the ability to send faulty start bytes, to allow channels to have the same value as the start byte, and to allow a false checksum to be sent. The box passed the test every-time.
I needed a way to get Discolitez to send dimmable values via serial, and adhere to the protocol I devised. A breakthrough came when I learned that Discolitez Pro had a way to pipe UDP packets out through a network socket. I fired up Wireshark and found the packet it was generating was 18 bytes in length.
Out of the 18 bytes, 16 represent 8 channels. Each channel is represented by two bytes that represent an 8-bit value. For each channel, the first of the two bytes represent the first nibble of the value, and the second byte represents the second nibble. The nibble is sent in plain text as ascii. So “0-F” will be sent. By combining the first and second nibble, an 8 bit value of the channel can be determined.
The 17th byte will always be 0x0D, and the 18th byte will always be 0x0A.
Using this knowledge, I wrote a script that took in the UDP packet, interpret it, and spit it right back out to serial using my protocol. The results were great! ^_^
Although… I found that the frequency bands didn’t allow for too much uniqueness, and I was limited to use Winamp as my audio player.
I decided I wanted a way for the code to work wirelessly, so I found a guide to get UART out of a WRT54G series router. Using the SD-Card hack, I was able to install Python and run my script off of it.
–UDP over Wifi w/ WRT54G-TM SD Card and Max232n
Late night a few weeks later, I was on a Skype video call with my friend, and FamiLAB member, “Tetsu” Dan, and showed him a floor lamp I had hooked to my light dimming box. I forwarded the UDP port through NAT on my home router, and challenged him to code a home automation webapp for my iPod touch.
A short time after corresponding back and forth, he was able to control my lamp using the sencha touch api for NodeJS. I am very pleased by the results. The video screen capture below was recorded that night:
Lastly, Hardware based music sync.
Pingback: Dimming AC lights the hard way - Hack a Day
Hi.
Does the transformer induce some phase (delay) to the zero cross detection?
Juan, I’d imagine the Sine Wave looks the same after being stepped down, only with less power, so I don’t think a delay is being caused here, or the wave is being pushed out of phase.
The wave becomes rectified and drives a Transistor that in turn inverts the signal into a a square wave. i.e. when voltage is 0, the transistor passes no power, and a pull up drives the interrupt high. What I believe is happening is once the wave hits a low threshold, say 4v, for example, the transistor no longer functions, and the interrupt is triggered. I’d like to find a solution to this.
Hope that helps.
I know this has been idle for a few months but just to give a possible solution.
You have a processor, which allows you more flexibility that a transistor circuit monitoring a full wave rectifier.
If you use a single separate diode as a half wave rectifier,with some resistors you’ll get a square wave at the line frequency, that you could read with logic input.
Now if life were perfect,you’d be set, because all you would have to do is monitor that input for an edge. Rising or falling. That would be a zero crossing. It may even work just that simple. But possibly there is line noise on the AC that would give you several as the signal is near Vinputhigh. There is also a symmetry issue, where voltage crossing would be different on one phase from the other. Its the kind of thing you’d use a Schmidt trigger to read if you were using pure logic.
This is where the processor comes in. You can calculate how deep into the wave form the input crosses Vih, and when it will crass back again on the way down. From there you can calculate where the real zero crossing is.
With further elaboration you should be able to use that data make a phase locked loop in software that locks into the 60 Hz signal of the AC line. Using that as a time base, then you can determine your triac firing times.
On additional thought, you can really factor out the asymmetrical aspect of the half wave detector. Whatever Vih is, the peak of the AC powerline waveform is going to be half way between the rising edge and the falling edge. Likewise the nadir of the low part of the cycle will be half way between the falling edge and the next rising edge.
This PIC has a timer. So if (after deglitching) you take the times of the rising and falling edges, you should be able to calculate where the peaks are, and thereby the zero crossings.
I’d probably set it up so that a timer caused an interrupt when it rolled over, intending that to be a zero crossing. Reloading the timer count should take into account the error based on the the expected peak times. If the peak is not at 1/4 of a cycle, and the low at 3/4 of a cycle, calculate the error, and add that in when setting the timer count back 1/2 a cycle in the interrupt service routine.
You can even use an initialization process at the start of day to figure out how many timer ticks a cycle is, and not worry about an absolute scaled time base. just get an average for a few cycles.
Therefore with a bitof deglitching, you should be able to know
You can use another optocoupler on the transformer line in place of the transistor circuit instead. Look up the 4N26. The internal diode will half rectify the wave and the transistor will cause a more precise square wave you can base your timing from.
You must be Psychic. The last comment here was over a month ago, and I JUST had gotten done purchasing it’s sister chip, the H11AA1 when you commented. I was researching this earlier. The Renard PIC controller uses it, and I think I’ll adapt it also.