今までOrangePi(512Mb)でOpenhab3を運用していたがメモリ不足気味で動作はするものの数日程度で誤動作してしまうためRaspberry Piの1-2Gbのものに入れ替えようと思ったら物がない。どこを探しても在庫切れ...唯一、KSYに4B(4Gb)の在庫があってポチッたらその後すぐに在庫切れとなってしまった。ギリセーフだったようだ。(-_-;)
openhabサイトのドキュメントを見ながらjdk(.deb)とopenhab3をaptでインストールしOrangePiからの移行はopenhab-cli backup/restoreコマンドで何の問題もなく一発で成功。
で、4Bの発熱が心配だったのでPWM-Fan付きケースをアマゾンでポチッた。
raspi-configでFan設定は出来るが温度設定が60℃以上なのといきなり最高速でぶん回すというのも騒音的に気になるので少しでも静かにするべくPWM制御するプログラムを作ってみた。50-60℃の範囲を0-100%で制御するようにしてみたところゆっくり静かに回り始めるのがなかなかいい感じだ。
PWM制御にはHW-PWMが使えるPIGPIOを使ってみた。多機能で便利なライブラリであるがpigpiodが常にtopコマンドの一番目に表示されるくらいCPUを使っている(6-7%)のが気になる。これだとCPUクロックも落ちないし発熱&省電力対策的にはぜひ改善してほしいところだ。
この件については続編があるので参考にしてほしい。
Raspberry PiでFANをPWM制御する。(自作ライブラリ版)
※pigpiodを使わずに直接ライブラリコールを試してみたところpigpiod起動中は初期化エラーとなりpigpiodとの共存ができなかった。
【Dwnload (Install Script and Program)】
pigpio.zip
1./opt/pigpioなど適当なディレクトリに展開コピーしそのディレクトリに移動した後sudo ./download.shを実行しpigpioをdownloadする。
2.sudo ./install.shを実行すると共有ライブラリの生成とインストール、pigpiodの自動起動設定を行う。
3.pwmfanディレクトリに移動しsudo ./make.shを実行後にsudo ./install.shを実行すれば自動起動設定まで完了する。
4.温度設定の変更はinstall.shのPROGRAM_OPTS=”-c 50 -h 60″の部分を書き換え再度sudo ./install.shを実行すればOKだ。
【Program】
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 98 99 100 101 102 103 104 105 106 |
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pigpiod_if.h> #define TEMPSENSOR "/sys/devices/virtual/thermal/thermal_zone0/temp" int temperature(void) { static int rv = 0; FILE *fp; if ((fp = fopen(TEMPSENSOR, "r"))) { char data[16]; data[fread(data, 1, sizeof(data), fp)] = 0; fclose(fp); rv = atoi(data) / 1000; } return rv; } void usage(void) { printf("Usage: pwnfan [options]\n"); printf("\n"); printf(" options: -c n ... cold temperature (*50 'C)\n"); printf(" -h n ... hot temperature (*60 'C)\n"); printf(" -p n ... PWM output pin (12/*18 or 13/19)\n"); printf(" -f n ... PWM Frequency (*10000 Hz)\n"); printf("\n"); } int main(int argc, char **argv) { int pin = 18; // hardware PWM Pin int freq = 10000; // hardware PWM frequency int cold = 50; // cold temperature int hot = 60; // hot temperature int status, temp, duty, c; printf("Cooling PWM Fan Controller Utility. Version 1.0\n"); printf("Copyright (C) 2022 Sasapea's Lab. All right reserved.\n"); printf("\n"); while ((c = getopt(argc, argv, "f:c:h:p:")) != -1) { switch (c) { case 'f': freq = atoi(optarg); break; case 'c': cold = atoi(optarg); break; case 'h': hot = atoi(optarg); break; case 'p': switch((pin = atoi(optarg))) { case 12: case 13: case 18: case 19: break; default: usage(); exit(1); } break; default: printf("\n"); usage(); exit(1); } } if (cold >= hot) { usage(); exit(1); } printf("temperature range (%d - %d)\n", cold, hot); if ((status = pigpio_start(0, 0))) printf("Error: pigpio_start() = %d\n", status); else { while (1) { temp = temperature(); if (temp <= cold) duty = 0; else if(temp >= hot) duty = 100; else duty = (temp - cold) * 100 / (hot - cold); hardware_PWM(pin, freq, duty * PI_HW_PWM_RANGE / 100); time_sleep(10); } pigpio_stop(); } return 0; } |