Dimanche, 4 mai 2014

I finally built the timer for the new Leffakone. It is based on an Arduino
Uno, which controls two reed relays and one LED. The reed relays can be
activated with a very low current (10 mA), meaning that the Arduino can drive
them directly from any I/O pin. The relays' contacts are connected in parallel
to the power button and the reset button. The Arduino's serial-over-USB port
is connected to one of the USB headers of the motherboard with a home-made
cable, and the timer is set by software through this serial connection. All
the wires coming from the computer case's front panel are connected to the
circuit (to the 8-pin header protruding from the protoboard), and wires go
from there to the motherboard's front-panel header (2 white wires for the
power button, 2 grey wires for the reset button, and 2 blue+black wires for
the power-on LED. The two boards are screwed on the bottom plate of the case
of an old CD drive; for installation, I closed the case and put it into the
computer as a regular CD drive.

While the timer is counting down, it blinks the computer case's HDD LED (which
therefore is not anymore indicating the HDD activity).

When the timer expires, it closes the power button's relay for 500 ms. An
optional watchdog timer would close the reset button's relay if the machine
does not boot correctly i.e., if the timer is not reset within 30 s. This
watchdog timer is currently disabled in the code, since the problems I have
had with GRUB freezing on startup seem to be related to manually powering the
device and switching the TV on shortly after. I'll enable it if it seems
necessary. Here
is the code for the Arduino.

The software client
for the timer is written in Python and is very
straightforward: send ASCII digits to the serial port, ending with a newline
character. It interprets this number as a number of seconds, and starts
counting down. When disconnecting the client from the serial port, the Arduino
resets and forgets all about the timer value; I found out that setting the DTR
line to False in the Python Serial object prevents this from happeining. I
haven't however found out how to prevent a reset when connecting to the
Arduino; this is less a problem, since when I connect to it, I want to reset
the timer, and reseting the whole program does just that. It seems that it's
the Linux driver that asserts the DTR line when opening the serial port; I
haven't investigated further. It is worth noting that when the machine boots,
it does not reset the Arduino.

Finally, the cristal in the Arduino is accurate to 99.5% which is not enough
to guarantee that the timer will wake up the computer within a minute after a
countdown of several days. I therefore apply a corrective factor to the time
sent to the Arduino. The factor was estimated from a 15.5 hour countdown,
which lasted about 90s more than it should have. Over a 7-days countdown, it
would cause the timer to expire about 16 minutes too late.