ラズベリーパイ4で
自宅サーバの構築
2021年
12月30日
サーバ電源のUPSの続きです。電流センサのアンプ部を追加しました。100mAで100mV変化するように調整しました。センタは2.5Vです。
2022年
1月5日
秋月のソーラパネルに斜めのステーを取り付けて、母屋の物干し台の屋根に仮設置しました。
以前、換気扇が付いていた所から、パネルの配線を引き込みます。
コントローラを介してバッテリに接続し、充電状態になることを確認します。
2月28日
サーバ電源のUPSの続きです。ソーラパネルとACアダプタのどちらから電力を供給しているか分かるようにインジケータを追加しました。電流センスの出力をコンパレータに入れてLEDを点灯させます。緑点灯がバッテリ、赤点灯でACアダプタです。
5Vの負荷に10オームのダミーロードを付けて動作確認します。出力の5VのDCーDCの青色LEDの輝度が明るすぎです。秋月で購入したソーラパネルのコントローラはバッテリの電圧が12V以上ないと充電が始まらない仕様でした。雨や曇りの日が続いて、バッテリの電圧が下がりACアダプタに切り替わった後、天気が良くなってもバッテリの電圧が12V未満だと充電されません。ちょっと失敗でした。
3月3日
右が秋月で買い直した3端子のソーラパネルコントローラです。こちらはバッテリの電圧が下がると負荷側をOFFする仕様で、ソーラパネルから充電してバッテリの電圧が規定まで上がれば、再度負荷側をONにする仕様です。この出力がOFFの間はACアダプタから電力が供給されます。
早速、接続して動作確認を行います。念のためヒューズを追加しました。出力の5Vの青色LEDの制限抵抗を1kオームから47kオームに変更しました。輝度が丁度良くなりました。
UPSのブロック図を更新しました。
3月6日
UPSの電圧と電流を入力するために、FT232HのI2Cプログラムを作成しますが、稼働中のサーバでテストすると不具合が起きた時に面倒なのでラズベリーパイ2で調整デバッグを行い、その後ラズベリーパイ4のサーバに移行します。ラズベリーパイ2のFreeBSDは12.3を使いました。まず、FT232HをGPOに設定して、通信とlibftdiが正常に動作しているか確認します。プログラムはここを参考にして、デバイスIDをFT232R(0x6001)からFT232H(0x6014)に変更し、DポートにLEDを接続すると動作確認できます。ただ、サンプルプログラムは論理が反転しているので、XORで反転してLEDを点灯させました。
3月12日
UPSの電圧と電流を入力する続きです。GPOモードに続いてI2Cモードで動作確認します。ADCを接続する前に、I2CのシリアルROMで確認します。手持のAT24C32Aを接続して、ここからプログラムをダウンロードして、i2csend、i2cgetコマンドをラズベリーパイ2上でコンパイルします。i2csendコマンドは少し修正(デバイスのアドレスを2回出力しているので1回に修正)するだけで動作しましたが、i2cgetコマンドの方は初期化の部分でエラー終了してしまいます。
2年くらい前に購入したシリアル接続のROMライター用のPCのシリアルが調子悪く、動作しないため、USB接続の汎用プログラマをaitendoから購入しました。送料を含めて、6000円弱で購入できます。
アプリは付属していないので、aitendoのサイトのリンク先からダウンロードします。BタイプのUSBケーブルも手持ちのケーブルを使いました。デバイスを選ぶと、ZIPソケットの挿入位置が表示されます。
リードボタンを押すと、バッファに読み込まれ、i2csendコマンドで書いた先頭から4バイトの00、01、02、03が正しく読み込まれました。i2csendコマンドは正しく動作しています。
試しに、i2cgetコマンドの初期化部分をi2csendと同じコードにすると、読み込みも動作するようになりました。コマンドは先頭から、1バイト書き込みで00、01、02、03を書いて、アドレスを先頭に設定し直し、設定したアドレスから4バイトリードする動作です。
3月15日
UPSの電圧と電流を入力する続きです。AT24C32Aからの読み込みは問題なくできるのですが、どのようなシーケンスになっているか確認しておきます。ソース中のdebug変数を1に設定すると、通信途中のデバッグ情報が出力されます。下はアドレスを先頭に設定した後、4バイトリードした時です。0xA1出力と1バイトリードが4回行われていることが分かります。
念のため、アナログディスカバリを接続して確認します。
下はSDAとSCLの波形です。赤枠内が0xA1と1バイトリードの対で、4回繰り返して4バイトリードしています。
下はAT24C32Aのデータシートのカレントアドレスリードの図です。デバイスの中に保持されているカレントアドレスカウンタが自動的にインクリメントするので、0xA1に続いてリード動作をするだけで、次々データがアクセスできるわけです。データバイトの後ろのACKは誰も発生させません。
一方、今回UPSで使用するADCのADS1015の変換結果レジスタのアクセス方法は下で、読みたいレジスタのアドレス(変換結果レジスタは0)を設定した後、0x91に続いて、2バイト(変換結果は12ビットで左詰め)を連続で読む必要があります。データバイトの後ろのACKはマスタ側(FT232H)が発生させる必要があります。上記のシリアルROMでは動作したi2cget1では正しく動作しません。
3月24日
ADS1015から変換結果を読むためにi2cget.cの中にある複数データを読む、ReadBytes関数を修正します。
ReadBytes関数はWinMargeの左ウインドのようにACKを返さない(シリアルROMを想定)仕様です。ADS1015から変換結果を読むにはFT232H側がACKを返す必要がります。右ウインドのように修正しました。main関数ではstartコンディションの後にアドレスを送り、ReadBytes関数で指定したバイト数を読み、配列に格納された結果表示して、stopコンディションで終了するように修正しました。修正したプログラムはi2cget3にリネームしておきます。
早速、ブレッドボードにADS1015を接続して、動作確認します。ADDR端子はLOWなので、アドレスは0x48です。
修正したi2cget3を使って1チャンネルを読むスクリプトを作成しました。他のチャンネルを指定するには赤枠の0xc3を変更すれば良いです。0xd3、0xe3、0xf3で2〜4チャンネルが指定できます。
安定化電源の2Vを接続して実行すると、0x3e5(左詰、下位4ビットの0は無効)が読めました。PGAの設定はプラスマイナス4.096Vなので、1ステップは0.002Vです。0x3e5=997なので、997*0.002=1.994Vで合っています。動作良好です。ちょうど4チャンネルあるので、バッテリの電圧、バッテリが供給する電流、ACアダプタの電圧、ACアダプタが供給する電流の4つを読んで処理する予定です。
ADS1015から電圧が読めるようになったのでブロック図を更新しました。追加でFT232Hの汎用入力ポートにスイッチ入力を接続できるようにします。扉が開いた、AC器具の電源が入りっぱなしなど警告情報のWEBページやメール送信ができます。
4月9日
UPSの続きです。サイトの更新が停滞していますが、いらない物をヤフオクで売っていて、結構忙しいです(笑)。実験に使っていたミッレ用のバッテリが無負荷でも12.5V以下になって、充電コントローラが出力を遮断してしまうようになったので、ホームセンタで軽自動車用の一番安い3980円のを購入してきました。手持ちのマイナス側のB端子が無く、D端子でした。とりあえず、充電しておきました。
4月10日
アストロプロダクツでB端子のキルスイッチを購入してきました。
4月13日
配線を変更して、実験を再開しました。この容量だとソーラパネルを2枚並列にした方が良さそうです。
5月28日
UPS回路の続きです。電源投入時やACアダプタとバッテリの切替時にOR回路の動作に不具合があり、両方から電源が供給されてしまう不具合が見つかりました。電流センサとコンパレータの電源判定回路の電源をDC−DCの5Vから、ACアダプタの9V電源から3端子レギュレータで作った5V電源に変更しました。
ブロック図を修正しました。破線枠内に5V電源を追加しました。破線枠のA基板が上の写真の上側基板に対応しています。下側基板には外部からのGPI回路を作る予定です。
回路を修正後、ダミーロードで動作確認を行います。約7W消費させて、バッテリからACアダプタへの切り替え、バッテリの充電後にACアダプタからバッテリへの切り替えが正しく行われるか確認します。
ダミーロードは100度近くの高温なるので注意が必要です。
5月28日
1日半くらいバッテリから給電され、その後ACアダプタに切り替わるのを確認しました。コントローラの仕様でバッテリの電圧が11.5V未満になると出力がOFFになります。
動作ステート図を作成しました。現在は右側のACアダプタ給電です。バッテリが充電され12.5V以上になると再度バッテリ給電に切り替わるはずです。以降この繰り返しで動作します。
6月2日
下側基板の空きスペースに電圧計を取り付けました。上側はソーラパネルのコントローラからの入力電圧、下は5VのDC−DCの入力電圧です。基板間の接続はコネクタを使いました。
早速、動作確認にします。現在バッテリが充電されていなので、コントローラの出力はOFFで上は0V、下はACアダプタの9Vになっています。バッテリが充電されるとインジケータが緑になって、上にコントローラの電圧が表示されるはずです。
6月3日
バッテリが充電されると正しくバッテリ駆動に切り替わりました。写真では11.6Vなので、しばらくするとACアダプタ駆動に切り替わります。
6月9日
UPSの動作が良好なので、秋月から追加のソーラーパネルを購入しました。パネルにはダイオードが入っているので、そのまま並列に接続できます。その他、コネクタやメッキ線も購入。
6月16日
以前と同様にパネルに角度を付けるステーを作製して取り付けます。
早速、物干し台の上に取り付けました。配線は単に並列に接続するだけです。この後は負荷をダミーロード抵抗からラズベリーパイ2に替えてプログラムを作成して動作確認してラズベリーパイ4のサーバに移行する予定です。
8月16日
夏の夕方の落雷の停電や母屋からドラムリールで電気を引いているガレージ側の不具合で漏電遮断器が動作するとサーバの電源が落ちるので、電流/電圧センスのADCデータの取り込みはまだ未対応ですが、作製中のソーラパネルUPSの運用を臨時で開始しました。ラズベリーパイ4への電源はUSBコネクタではなく、電流が流せるGPIO(赤枠)に変更します。初めに9.1VのACアダプタで電源を供給して半日運用して問題ないことを確認しました。
GPIOの電源は念のため5V、GNDとも2つコンタクトを使いました。場所を間違えないように慎重に接続します。
8月17日
6時30分。バッテリ電圧は12.86Vです。バッテリを接続します。バッテリ電圧の11.5V/12.5Vを閾値にして、自動的にバッテリとACアダプタで切り替わるはずです。
19時00分。日中の天候は曇り時々小雨でソーラコントローラのステータスは常時充電状態でした。19時の時点で日が落ちているため充電は停止されています。12時間でバッテリ電圧が約0.5V下がりました。曇りではソーラの電気だけでは足りていないということです。このバッテリが28AHとして、仮に半分残っているとすると、12Vで1Aを14時間供給できる計算です、ラフに5Vで2Aなら、朝までバッテリ駆動のまま持ちそうです。
8月18日
6時50分。バッテリ電圧は12.16Vです。天候は雨で薄暗いですが、充電は開始されています。約12時間バッテリ駆動で動作していました。動作良好です。
13時00分。バッテリ電圧は12.43Vです。天候はお昼過ぎから晴れてきました。
19時00分。バッテリ電圧は12.05Vです。朝までにACアダプタ駆動に切り替わりそうです。その後の確認で朝までギリギリで持ちました。
12月27日
FT232HにI2Cで接続しているADS1015の続きです。抵抗分圧で違う電圧を4つのチャンネルに接続します。
以前に作成したi2cget3とi2csendを1つのプログラムにマージしてget_ads1015を作成しました。
初めに、ラズベリーパイ2で動作確認を行います。フルスケールで4.096Vなので、4chは少し下げて、テスタ読みで0.954V、1,914V、2.864V、3.633Vです。正しく電圧が読めています。
ラズベリーパイ2で動作確認ができたので、ラズベリーパイ4に接続して動作確認します。
正しく読めています。4つのチャンネルはACアダプタとバッテリの電圧、電流を接続してUPSの動作状況を読み込みます。