WiFi内臓でお買い得と思わず衝動買いしてしまったOrangePi Zeroでしたが、CPUボード剥き出しで使うわけにもいかないし、好みのケースも売ってないようなので自分で作ることに。
拡張ボード等は使わないという前提でWiFiアンテナを取り付け可能な最小限のものということで最初はファンなしで作ったのですがファイル・コピーとかコンパイルとかなんとなく重そうな処理をさせると急激にCPUが熱くなってしまうためファンを取り付けてみることに。その効果は絶大で一気に10℃も温度が下がるようになりましたが、今度は静かな部屋だとファンの音が気になってしょうがないのでCPU温度がある程度高くなったときだけファンを回すようにしてみました。
ケースは3Dプリンターを使うことにしてこんな感じの設計に。ネジは嫌いなのでいつもハメ込み式で設計してますがファンの取り付けのみネジを使ってます。
ファン・スイッチ回路です。モーターなので逆起電力対策用のダイオードが必要かなと思っていましたがオシロで調べても逆起電力らしきものの発生が確認できなかったので、省略できるものは全て省略するという個人的ポリシーに基づいて省略してます。
ユニバーサル基板にファン・スイッチ回路を実装して。
ケース・トップのCPUの真上に超小型ファンを取り付けて。
ファン・スイッチ回路と接続して。
ケースにCPUボードをセットして。
拡張コネクタに接続して。
ケースを閉めて完成!!
違う角度から。
今回使った超小型ファン。CPUボードよりもお高いです(笑)。ちなみにですが、こういう超小型で精密な物は中国では作れないのか作らないだけなのかわかりませんが国産の物しかないようです。
ファン制御プログラムはこんな感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include "gpio_lib.h" #define GPIO_FAN SUNXI_GPG(06) #define THERMAL "/sys/devices/virtual/thermal/thermal_zone0/temp" int main(int argc, char **argv) { int port, upper, interval, help, status, i; port = GPIO_FAN; upper = 50; interval = 10; help = 0; for (i = 1; i < argc; ) { char *p = argv[i++]; if (strcmp(p, "-port") == 0) { if (i < argc) { p = argv[i++]; char b = *p++; if (toupper(b) == 'P') b = *p++; int n = isdigit(*p) ? atoi(p) : -1; b = toupper(b); if ((b < 'A') || (b > 'O')) { printf("illegal gpio bank [A - 0] -> [%c]\n", b); help = 1; } else if ((n < 0) || (n > 31)) { printf("illegal gpio number [0 - 31] -> [%d]\n", n); help = 1; } else { port = ((b - 'A') << 5) + n; } } } else if (strcmp(p, "-temp") == 0) { if (i < argc) upper = atoi(argv[i++]); } else if (strcmp(p, "-interval") == 0) { if (i < argc) interval = atoi(argv[i++]); } else { help = 1; } } if (help) { printf("usage: %s [-port {A-O}{0-31}] [-temp {upper limit}] [-interval {seconds}]\n", argv[0]); return 1; } printf("Fan Control Port [P%c%d], Upper Limit Temperature [%d], Interval Time [%d]\n", GPIO_BANK(port) + 'A', GPIO_NUM(port), upper, interval); if (status = sunxi_gpio_init()) { printf("sunxi_gpio_init() = %d\n", status); } else if (status = sunxi_gpio_set_cfgpin(port, SUNXI_GPIO_OUTPUT)) { printf("sunxi_gpio_set_cfgpin() = %d\n", status); } else { while (1) { unsigned int temp; FILE *fp = fopen(THERMAL, "r"); if (fp) { fscanf(fp, "%u", &temp); fclose(fp); printf("cpu temperature = %d\n", temp); if (status = sunxi_gpio_output(port, temp >= upper)) printf("sunxi_gpio_output() = %d\n", status); } else { printf("cpu temperature read error!!\n"); } sleep(interval); } } return status; } |
メイク・ファイルです。簡単すぎて必要ないかも。(笑)
1 2 3 |
#/bin/bash gcc fan_ctl.c gpio_lib.c -o fan_ctl |
上記以外に、gpio_lib.c と gpio_lib.h が必要です。次のものを利用させて頂きました。作者様ありがとうございます。
duxingkei33/orangepi_PC_gpio_pyH3
なお、自動起動させるには/etc/rc.localにでも次のような設定を追加すればOKです。この設定ではCPU温度が50℃以上になるとファンが回ります。
1 |
${プログラムの場所}/fan_ctl -port PG06 -temp 50 & |
最後に...
OrangePi ZeroのWiFiはドライバーの問題なのかどうかはわかりませんが速度が不安定で極端に遅くなったりしてtelnetしててもイライラするぐらい実用的ではないので私はWiFiを使わず有線で使ってます。
せっかくケースにアンテナも取り付けできるようにしたのに...まぁ、技適もないしで現実的にも使えませんが、今後に期待したいなと。
しかし、WindowsしたりLinuxしたりしてると頭がグニャグニャになるときがある。特にリネームしようとしてrmすることが良くある...その結果どうなるか皆さんお分かりですよね。(笑)
あ、忘れてた。インストールしたOSです。
Armbian_5.24_Orangepizero_Debian_jessie_3.4.113
OrangePi Zero は、我が家のホーム・コントローラとして、暖房制御、車庫シャッター制御、MQTTサーバー、OpenHABサーバー、監視カメラ・ストレージ等等、日々、大活躍してくれてます。このブログが見れるのもOrangePi Zeroのおかげです。なので、お願いだから死なないでほしい。我が家が壊滅状態になっちゃうから。(笑)
追記 – 2017/05/02
久しく何もメンテしてなかったので、何気なくapt-get upgrade してみたらOSが勝手にアップデートされてしまった。(-_-;)
その後、eth0のmacアドレスが勝手に変更されたことが発覚。なぜ?。さらにjavaをアップデートしようとしたら関連モジュール(ca-certificates-java)が壊れていると表示される。削除してみたり強制インストールしてみたりしたがすべて駄目。さんざん調べまくったあげくaptitude updateにより問題のca-certificates-javaを強制更新し解決できたのだが...今後のことを考えるとサポート面ではやはり不安が残りそう。raspberry-piのほうが少しは安心できるのだろうか?