Recently I had hacked a Riverbed Steelhead x55 and installed pfSense (OpenBSD) Firewall on it.
Under normal operation, when you first turn the machine on the 3 turbine fans should turn on to full speed and then slow down according to however hot the CPU is. The fan speeds then varies as required for heat dissipation.
If there is a problem (eg. temperature sensor broken or software not controlling the fans) then the fail-safe is that the fans will function at just below max speed 100% of the time.
This cooling system is controlled by ACPI (Advanced Configuration and Power Interface) and is an industry standard, which OpenBSD also supports. So imagine my frustration when I found that the fans turned on and stayed on! I spent the better part of a day trying to figure how to fix this in software (OpenBSD was able to see the temperature but had no idea what it was doing with the fan) and finally concluded that it is some proprietary controller which I won’t be able to control through OpenBSD.
I was doomed to listen to those damn fans, forever!
Or was I?…
The box has plenty of room for an Arduino Pro Mini and some electronics. I had the required parts lying around and put together a fan speed controller and temperature sensor in under an hour. You can too! Here is what you need:
- Arduino Pro Mini (5V)
- 10K Thermistor
- 10K Ohm resistor
- Soldering iron & solder
- Electrical tape
Step 1 – Tap in to Steelhead power
The Arduino requires 5v to run, which luckily is what powers USB. So we can tap in to the 5v of the USB to power the Arduino. Here are the pins you need to tap in to.
You will notice that these are the same pins which are powering your USB drive for booting the SH. Unfortunately, the other USB pins on the same header are not working, so splicing in to the existing one required.
Step 2 – Upload code to Arduino
Download the code and upload it to the Arduino.
Step 3 – Wiring the Arduino
Each fan has 4 wires. The yellow one is used to control the speed, so cut this wire (leaving the other 3 still plugged in to the board) and strip the end, you will need to solder some wire on to the end to extend the length. Then solder the other end to pins 3, 6, and 9 (one for each fan) in any order on the Arduino.
- Solder the thermistor to +5V/VCC and Analog pin 0.
- Solder the 10K resistor to ground and Analog pin 0.
Make sure the thermistor wires are long enough so you can nestle it between the two heat sinks so that it will read the temperature of the CPU and north-bridge as accurately as possible.
Step 3 – Test
The code has a built-in testing feature which will simulate the temperature rising and falling steadily. The serial monitor will also show you the current temperature and the fan states which is useful for debugging.
Once all is tested and working, be sure to tape up the Arduino so that there are no exposed metal surfaces and then put everything back together.