冷却ファンを静かにさせる(ArchLinux@ODROID-U2)

2014/12/15追記:
最近のArch@Odroidは自動で回転数を制御してくれているのでこのメージの作業はしなくてもOK。

ODROID-U2と同時購入した冷却ファンをCPU温度に合わせておとなしくさせる(のっけてるOSはArch Linux)。

本体と一緒に買った冷却ファン、電源投入直後からフル回転。CPUの温度が何度でもフル回転でうるさいのです。で、CPU温度によってファンの回転数をコントロールする方法を探してたら、こんなのを見つけたのでコンパイルして使ってみたけどちゃんと動かない。当たり前か・・・

ODROID U2 FAN Service to control the fan based on the TMU temperature

簡単なソースだったので、手直しして動くようにしてみた。

まだgitコマンドをインストールしていなければ先にgitをインストールしておく。

sudo pacman -S git

開発環境も必要なので、インストールされていなければbase-develもインストールしておく。

sudo pacman -S --needed base-devel

ソースの取得

git clone --depth 1 https://github.com/mdrjr/odroidu2-fan-service.git

ソースの修正

cd odroidu2-fan-service
odroidu2-fan.hの修正

CPU温度とファンの回転数を格納するファイル名をAarc Linux用のファイル名に修正する。

vi odroidu2-fan.h
修正前
 8 #define TMU_PATH "/sys/devices/platform/tmu/temperature"
 9 #define FAN_PATH "/sys/devices/platform/odroid-fan/pwm_duty"

修正後(8,9行目をコメントアウト & 11,12行目を追加)
 8 //#define TMU_PATH "/sys/devices/platform/tmu/temperature"
 9 //#define FAN_PATH "/sys/devices/platform/odroid-fan/pwm_duty"
10 
11 #define TMU_PATH "/sys/class/thermal/thermal_zone0/temp"  //CPU温度
12 #define FAN_PATH "/sys/devices/platform/odroidu2-fan/pwm_duty"  //ファン回転数
fileoperations.hの修正

CPU温度を取得する関数を修正する。(CPU温度は25℃なら25000、31℃なら31000というように1000倍された値で格納されているので、1000で割ってやる)

vi fileoperations.h
編集前
35 int gettemp() {
36     int ret;
37     fscanf(fp_tmu, "%d", &ret);
38     rewind(fp_tmu);
39     return ret;
40 }

修正後(39行目を追加)
35 int gettemp() {
36     int ret;
37     fscanf(fp_tmu, "%d", &ret);
38     rewind(fp_tmu);
39     ret = ret / 1000;		//行の追加
40     return ret;
41 }
odroidu2-fan.cの修正

CPU温度からファン回転数を算出するロジックを修正する。

元:CPU温度が1℃からファンが回転し始めて、80℃で最大(255回転)になる
(参考)30℃で95回転、40℃で127回転、50℃で159回転、60℃で191回転、70℃で223回転

変更後:CPU温度が20℃からファンが回転し始めて、83℃で最大(255回転)になる
(参考)30℃で44回転、40℃で84回転、50℃で124回転、60℃で164回転、70℃で204回転

vi odroidu2-fan.c
修正前
28     int target_pwm_value = 255 * temperature / 80;

修正後(28行目をコメントアウトして29行目を追加)
28 //  int target_pwm_value = 255 * temperature / 80;
29     int target_pwm_value = (temperature - 19) * 4;

コンパイル

修正がすんだらコンパイル(fan-controlという名前で実行ファイルを作成)

gcc -o fan-control odroidu2-fan.c

fan-controlという名前で実行ファイルが出来るので、お試し起動

./fan-control

ファンの回転数が(CPU温度に応じて)下がればOK。

CPU温度を表示

cat /sys/class/thermal/thermal_zone0/temp
27000

ファン回転数を表示

cat /sys/devices/platform/odroidu2-fan/pwm_duty
PWM_0 : Duty cycle -> 32 (12)

→CPU温度が27℃でファン回転数が32。
うんうん、静かになりました。

一旦fan-controlを終了させる。psコマンドでプロセスIDを確認してkillする。

ps aux
kill -3 XXX

※killコマンドのXXXはpsコマンドで確認したプロセスID

サービス登録

ODROID-U2の起動時に自動起動するようにサービス登録
実行ファイルを/usr/bin/へコピー

sudo cp fan-control /usr/bin/

.serviceファイルを作成

sudo vi /usr/lib/systemd/system/fan-control.service
[Unit]
Description=Fan Control

[Service]
Type=forking
ExecStart=/usr/bin/fan-control
KillMode=process
Restart=always

[Install]
WantedBy=multi-user.target

systemctlコマンドで起動させる

sudo systemctl start fan-control.service

systemctlコマンドで起動状況を確認

systemctl
UNIT                        LOAD   ACTIVE SUB       DESCRIPTION
     :
fan-control.service         loaded active running   Fan Control
     :

※fan-control.serviceの行が loaded active runningとなってればOK

サービスとして登録

sudo systemctl enable fan-control.service

再起動してちゃんと動いてるか確認

sudo reboot

起動直後はファンがフル回転するけど、起動プロセスが一段落すれば静かになる。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。