Arduino PC Fan control and RPM reading

This article is on the final revision of the Arduino Fan control board “CoolRunnings”. I’ve written about the first two revisions, from the board that I etched myself, to the first one from a board house, which still contained a boost converter. After that one, I designed one to be powered with a barrel jack, so as to supply 12v to the fans directly, no boost converter involved. That was version 3, and I was pretty satisfied with it, but needless to say, there were some small bugs, and some design issues that I wanted changed, so I’ll be covering CoolRunnings version 3.1 in this article, as it is based on the most recent hardware revision of the control board.

Here, I’ll attempt to go over the changes that occurred between hardware version 2 and 3.1. Version 3 saw the biggest changes, mainly moving from the use of a boost converter to power the fans from USB power solely, to using a barrel jack and a 9-12v supply voltage. USB simply wasn’t able to cut it in terms of power delivery. Reading of the hall effect sensors was optimized, testing was done with multiple types of fans, and a configuration that worked best for the largest variety of fans was achieved.


USB was still present, responsible for serial communication to the board. The USB jack type moved from USB type B, to mini USB, finally to the very common and miniature micro USB. Due to the issue of having to hardcode one wire bus sensor IDs, and the difficulty of trying to program the identification of the sensors on the fly, dual One Wire Buses were added. Now, temperature sensors can be hot-swapped instantly, without modification of the code. These changes and a few more dealing with changing part footprints are what let to version 3.1.

Many changes in software have also occurred. Optimizations, and changes related to dual One Wire Bus were made. The EEPROM was made use of, to hold on to changes in user set values. Different settings for fan control power were created. In addition to the old three speed settings, a continuously variable fan power function was created, to make fan power more linear over temperature differential. The software project was also put on Github, so additional changes, which are too many to name can be found, if desired.


Overall, I am currently satisfied with version 3.1, and have no plans for a future revision. Although, there are a few areas where I’d be interested in experimenting with different designs ideas. One area is the use of MOSFETS instead of BJTs, but because there is no huge gain from this, it’s on the back-burner, I’d also like to experiment a bit more with fan RPM reading, as some fans read perfectly well, and others not at all. This is due to the difference in how some fans hall effect sensors are configured, but perhaps a more suitable configuration could be created to allow a greater variety of fans to be read. To make the temperature sensors less prone to polarity misalignment by users, I’d also like to look into the use of keyed plug types, but this not being a commercial product at this time, this is also a very minor issue. Currently, the fan PWM runs at 30Hz, which is pretty low. This however doesn’t seem to create any issues, and was selected as to produce no PWM noise in the fan, which was quite evident at the default four hundred something hertz. I also experimented with running the PWM at 60KHz, however, the current configuration of the power transistors doesn’t work well with PWM at that frequency, but with some experimentation, perhaps this could be changed, and any audible PWM noise would not be present, well.. at least for humans.

Project Source Code