Serial port controlled CPU fan

[Christian] was running a Linux box as a home server but needed a way to quiet the noisy machine. Like many Linux servers, he’s using some pretty old hardware which doesn’t have an on-board header for the CPU fan which generates much of the unwanted sound. Those headers are nice because software can monitor the CPU and board temperature and adjust the fan accordingly.

[Christian's] solution was to use the serial port for the task. He built a small circuit in which serial pin 3 drives the base of a transistor, pin 5 provides ground, and a floppy drive power cable supplies 5 volts. From there he wrote a RUBY program to monitor the CPU temperature and generate a PWM signal on the serial port, throttling the fan speed as needed.

[CC Photo Credit: Garrette via Flickr]


  1. Jake says:

    You could also just use a thermistor to vary the base current into the transistor, and a potentiometer to calibrate it… That’s a LOT less work!!!

  2. Pedro says:

    The trouble with using a thermistor is that it doesn’t give you the CPU’s temperature.

  3. Jacek says:

    And if the rubyscript hangs or the server reboots, the fan doesn’t work because of the lack of pwm-signal?

    I would either work with Jake’s thermistor-solution or program a small attiny-µc to take commands per serial line, which works even if there is no input.

  4. Matthew says:

    I think this is a brilliant idea and very well done. I don’t think a thermistor is that great of an idea, much better to get the CPU temp.

  5. Stories like these bum me out because most computers don’t have serial ports (or centronics ports) any more. I know adapters exist, but it kinda defeats the purpose of easy / fast / free.

  6. osgeld says:

    I have bought 3 boards within the last 2 years and they all have legacy ports, just cause your name brand big box doesn’t …

    and Yea I would vote for an application that does not require software to be on to run it, I would feel much better with a hardware failsafe

  7. salec says:

    @Nick: You weren’t paying attention. “Like many Linux servers, he’s using some pretty old hardware …” I.e. if he had a new computer, he probably wouldn’t need to do this.

  8. tnt23 says:


    Most of the computers modern enough to not carry legacy ports are equipped with sensors-aware fans these days :)

  9. llvllatrix says:
  10. Drew says:


    He wired serial pin 3 to a transistor. not straight to the fan, which means that the fan -could- be triggered on the ground signal on the serial port, so the fan would be on full on startup, and then slow down while running the script. It depends on if it’s PNP or NPN.

    Honestly, this is a sweet and simple hack.

  11. fhunter says:

    Hmm… Asus CUSL2? I thought that is was supported by lm-sensors?
    Most of the pentium2/pentium3 boards I have seen had adjustable cpu fan.

  12. tyco says:

    varying the speed of a motor with a transistor usually results in poor speed control. You really need to PWM a motor to get smooth control. A more complicated circuit could vary the duty cycle of a 555 circuit or similar based on the thermistor, and it could all be done with analog circuits and no software.

    The only advantage that the thermistor/transistor combination would have is that since it would have negative feedback, and since the heatsink’s thermal mass provides enough low-pass filtering, it would become stable at some point. But I believe the fan would be spinning with less torque, and faster (more noise), than it would be if it were driven by PWM.

    A failsafe would of course be a good idea with either arrangement.

  13. I agree, a lot of desktop mobos have serial, but half of all computers sold now are laptops.

    I miss the serial port for other applications – easy connections to ucontrollers, easy programming, etc.

  14. Jake says:

    @ Pedro,Matthew

    I disagree, you don’t need to know CPU temp, if you simply calibrate the system w/a thermistor. CPU temp in this system is nowhere near that critical.

  15. tristan says:

    cool idea, good proof of concept. but i wouldn’t trust my chip’s life to a script.

  16. Jacek says:


    On the schematic it’s an NPN. And the TxD-Port can hang on HI or LO when the script’s hanging…

  17. HackerK says:

    Those DIMMs in the background caught my eyes…

  18. Jake says:

    You guys have an EXCELLENT point- If the software hangs, the system could overheat! I’ll stick with a thermistor, thanks.

  19. steaky says:

    im currently working on (taking longer than expected due to not backing up) usb controlled PC fans – using pic18f2550. best of both worlds – auto control based on external temp etc, then can override it with c# app when wanna quiet it down.

    extra advantage with microcontroller is scalable, and can run it from usb, rs232 or lpt port. have to be using some fairly unique hardware when none of the options are available.

    I mean i will continue work on it, as my pic is currently plugging into a ps3

  20. lwatcdr says:

    Well if you want a more fault tolerant you could use a simple micro and hook it up to the i2c bus on the PC or a bit banged SPI off the printer port or a serial connection.

    But honestly for a fun home hack using old hardware this is a pretty cleaver setup.
    The script hanging? I guess it could happen but the script is pretty simple. I would put that as a low risk. Everything can fail after all including the motor on the fan!

  21. 3-R4Z0R says:

    @tnt23: I have a current PC including a serial port. AMD Phenom X4, DDR2-RAM and so on. Mainboard is GA-790FX-DQ6

  22. Iratas says:

    Nice hack considering that tons of P1 P2 P3s getting recycled every day. You could get them for basically free with fancontrol so I could say why bother hacking one.

    Of course its a good hax. I never know that fan actually controlled by a frequency signal on the 3rd wire. I always thought that a certain current between the yellow and black wire determines the fan speed.

    Also I don’t get why new newbie programmers start with RUBY instead of the good old perl or C.
    But good hack anyways.

  23. QDot says:

    @ Thermistor v/s CPU temp:
    I’m sensing a lot of misunderstandings here – you really don’t want to use the CPU temp as an indicator when to turn on the heatsink fan.

    Why? a lot of CPU work is bursty – perhaps even long-lasting enough to increase the core temperature, but not long-lasting enough to overcome the heat capacity of the heatsink. At that point, having the fan running faster doesn’t help a bit.

    You do want to use the CPU temp for monitoring – preferably in conjunction with the heatsink temperature – it would make it a lot easier to diagnose the overheating problems, if you have any.

  24. coreyl says:

    @Iratas Because perl is a hideous mutant abortion of a language that nobody should ever allow to pollute their mind, whereas Ruby is quite elegant and has a future as well as employment potential?

  25. Jake says:


    It’s just a fan. You guys wanting to control it with micros/code are getting waaaaay to complicated and wasting a lot of time!

  26. M H says:

    Of course the usual solution to this problem is to use a bigger fan. (And/or a bigger heatsink.)

    Then you run fan at a constant low speed without fear of overheating. But interesting idea anyway.

  27. steaky says:


    I dont see how doing something you enjoy and having something to show for it at the end constitutes as “wasting a lot of time”…

  28. Hip says:

    This will be my first negative comment on hackaday… What a waste of a serial port, this _actually_ needs more arduino. Serial ports are hard to come by now without wasting a pci slot for an IO card and those USB serial adapters, with the exception of FTDI devices, are mostly junk. Nice idea, but I can think of plenty of better things to do with my serial ports.

  29. Jake says:


    I disagree. The goal of this project was to maintain a low fan speed without letting it overheat. If the software stops responding, it overheats. This design would not be acceptable in a “real-world” situation.


    No – It doesn’t need ANY “arduino”. You could use a microcontroller if you really wanted, but that’s some major overkill. Using an “arduino” would be even worse, you’d have this huge MCU board with all sorts of capabilities that would go to waste. I say, if you really want to, just pic a small microcontroller that fits the projects needs!

    • Hip says:

      An “arduino” is not overkill, it’s over estimated and over “quoted”, but certinally not overkill. Besides I was taking the piss anyway… Get a quiet microphone and speaker and cancel out the noise by reversing the phase of it.

  30. vtl says:

    Why do you need variable control for a fan? If its too loud then just run it at a constant speed that isnt annoying.

    Just stick in an inline resistor and call it a day.

  31. steaky says:


    I dont know about you, but I enjoy doing these sorts of mini-projects.

    It seems like the purpose isnt just to have it quiet or just cold but to allow it to speed up if needed – as I very much doubt there would be the same CPU load all of the time.
    Whilst the serial port script is prone to failure, and an arduino is overkill he obviously didnt want to sit next to the box all the time tweaking pots. The thermistor would be good if he didnt care about the values, but it doesnt afford the same amount of control (ie script/arduino/pic can intuitively inrease fan speed based on CPU load as apposed to tackling the issue when heat has already build up).
    Obviously a simple measure would just be quiet fans

  32. coreyl says:

    @Jake You’re just bitter because your thermistor solution is crap and now everybody knows it. Author’s solution cost 10c in parts and it works, unlike your proposal.

  33. Jake says:


    You should hear the fan in my old Shuttle X. Then you’d understand.


    Yeah, it’s fun, but wouldn’t a little analog circuit design be *more* fun? I mean, anyone can bang out some code to twiddle an I/O line the way they want it, but how many people are willing to do it the “old fashioned” (read: RELIABLE) way? :D


    Nono. The thermistor solution is definitely superior, that’s why it’s been used for so long…

    “Get a quiet microphone and speaker and cancel out the noise by reversing the phase of it.”
    HELL YES!!! Now YOU are speaking my language!!! Keep it simple, stupid. You don’t have to debug the code or worry about bugs in THAT circuit ;)

  34. Ivan says:

    This makes no sense ¿bitbanging PWM on RS232 on such an old computer where resources are limited? Come on!

  35. christian - author says:

    Hm you guys didn’t read my article carefully enough – if the script hangs, there wouldn’t be a pwm signal. But this means the fan would run at full speed – NOT FULL STOP! That’s why you can use a 4 wire fan on a 3 wire port, too. Anyway thanks for your interest

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s


Get every new post delivered to your Inbox.

Join 96,650 other followers