Arduino fan controller
Posted: Tue Jan 29, 2013 12:44 pm
I'm working on a project at the moment to create a smart fan controller using an Arduino UNO and I thought others might be interested to read about it.
The idea is to connect teh Arduino to the motherboard's SMBus to read the motherboard's sensors directly. The controller will also be able to control the motherboard's fans as well as up to 15 additional PWM fans (although I will not add connectors for all 15 of these).
I would like to implement a control algorithm where I enter a desired maximum temperature for a 'zone' and the system maintains it, I will be implementing a PID controller and hopefully that does the job, otherwise I'll experiment with other techniques. If the more complcated techniques don't provide any benefit over a simple temperature->fan speed mapping then I will revert to that.
The controller should be configurable via the SMBus also but I'm not sure if I'll get that far when it can be configured via USB anyway..
Another nice thing will be that the fan's will be controlled 100% of the time that the PC is on without depending on software on the PC, so no fans @ 100% on startup/shutdown.
So far I have successfully connected the Arduino to my motherboard's SMbus by using a PCI riser card like this one:
I removed one of the ribbon cables as well as the slot part and inserted wires in the to ribbon cable's connector. I didn't realise that PCIe also has pins for SMBus and I would have tried this if I'd have thought of it because the x1 slots are nice and small, not sure if Intel actually routed SMbus to the PCIe slots on my board though.
The SMBus on my motherboard (Intel DX58SO) is routed to pins on the PCI slot (and it doesn't have an SMbus header as far as i'm aware). I'm not sure that all motherboard's actually connect these pins but both the PCI and PCIe spec have pins reserved for SMBus.
I found this method to be much easier than soldering wires to my DIMM's and it can be easily removed.
I was able to read the temperatures with the Arduino and they matched the readings reported by speedfan.
The next stage will be implementing PWM control using a TLC5940 'sheild' and then implementing the control logic and packaging things up neatly. I had seen prototyping PCI boards which would have been cool for mounting everything on but I thought they were a bit expensive.
I'd be interested to hear if anyone has done anything similar and has any comments? I guess the Arduino is probably overkill for this but it makes it straightforward for me to develop. I want to build what for me is the 'ultimate' in fan control which means integration with the motherboard, controller independent of the PC, multiple PWM fan's and a sophisticated control algorithm. I may add an LCD screen for showing status and buttons for cycling the information and cooling profiles at a later date if I'm still inclined. further suggestions are welcome!
For reference my system is an i7 920 on an Intel DX58SO in a coolermaster CM690II case. CPU cooling is via Corsair H50 with push/pull fan's.
The idea is to connect teh Arduino to the motherboard's SMBus to read the motherboard's sensors directly. The controller will also be able to control the motherboard's fans as well as up to 15 additional PWM fans (although I will not add connectors for all 15 of these).
I would like to implement a control algorithm where I enter a desired maximum temperature for a 'zone' and the system maintains it, I will be implementing a PID controller and hopefully that does the job, otherwise I'll experiment with other techniques. If the more complcated techniques don't provide any benefit over a simple temperature->fan speed mapping then I will revert to that.
The controller should be configurable via the SMBus also but I'm not sure if I'll get that far when it can be configured via USB anyway..
Another nice thing will be that the fan's will be controlled 100% of the time that the PC is on without depending on software on the PC, so no fans @ 100% on startup/shutdown.
So far I have successfully connected the Arduino to my motherboard's SMbus by using a PCI riser card like this one:
I removed one of the ribbon cables as well as the slot part and inserted wires in the to ribbon cable's connector. I didn't realise that PCIe also has pins for SMBus and I would have tried this if I'd have thought of it because the x1 slots are nice and small, not sure if Intel actually routed SMbus to the PCIe slots on my board though.
The SMBus on my motherboard (Intel DX58SO) is routed to pins on the PCI slot (and it doesn't have an SMbus header as far as i'm aware). I'm not sure that all motherboard's actually connect these pins but both the PCI and PCIe spec have pins reserved for SMBus.
I found this method to be much easier than soldering wires to my DIMM's and it can be easily removed.
I was able to read the temperatures with the Arduino and they matched the readings reported by speedfan.
The next stage will be implementing PWM control using a TLC5940 'sheild' and then implementing the control logic and packaging things up neatly. I had seen prototyping PCI boards which would have been cool for mounting everything on but I thought they were a bit expensive.
I'd be interested to hear if anyone has done anything similar and has any comments? I guess the Arduino is probably overkill for this but it makes it straightforward for me to develop. I want to build what for me is the 'ultimate' in fan control which means integration with the motherboard, controller independent of the PC, multiple PWM fan's and a sophisticated control algorithm. I may add an LCD screen for showing status and buttons for cycling the information and cooling profiles at a later date if I'm still inclined. further suggestions are welcome!
For reference my system is an i7 920 on an Intel DX58SO in a coolermaster CM690II case. CPU cooling is via Corsair H50 with push/pull fan's.