カテゴリー
ESP8266+ESP32+RISC-V

M5Stack or ESP32C3 で ネットワーク機器用 UPS を製作

M5Stack Basic Core または ESP32C3 、その他 ESP32 シリーズで制御する UPS を製作します。今回はハードウェアの製作と、ソフトウェアによるUPSの制御と見える化を行います。

市販UPSの課題

PCやサーバ、ネットワーク機器を停電から守るには UPS を使用します。しかし、市販品のUPSは製造元が想定した用途でしか使えない課題があります。

例えば、SNMPに対応していない安価なNASの場合、UPSとNASとはUSBで接続します。このため、停電時のシャットダウン信号が、PCやサーバに送れなくなります。

また、モバイル・ルータや、Raspberry Pi を使ったサーバ等、DC 5V のUSB電源を使用する機器が増えています。しかし、市販のUPSの多くは、AC 100V 出力のみです。このため、停電時は電池のDCからACに変換してから再びACをDCに変換することになります。(変換が多いほど変換ロスが増え、その分の蓄電容量を増やす必要がある)

SNMPに対応していないNASや、AC 100V 出力しかないUPSが存在する

こういった市販機器の課題を解決する方法の一つとして、UPSを自作してみました。

想定するシステム

M5Stack Basic Core または ESP32-C3-WROOM-02 、その他ESP32シリーズをコントローラとして利用し、ACアダプタから鉛蓄電池(12V)に電気を蓄え、停電時は鉛蓄電池から放電するシステムを製作します。

ACアダプタからの充電により鉛蓄電池(12V)に電気を蓄え、停電時は鉛蓄電池から放電する

Wi-Fi に接続することで、停電が発生したことをサーバ機器に通知したり、インターネット上のクラウド・サービス上に状態を表示することもできるようになります。

コントローラに M5Stack Basic Core または ESP32-C3-WROOM-02を用い、鉛蓄電池に電気を蓄え、停電時は鉛蓄電池から放電するシステム

停電が発生し、ACアダプタからの電力供給が途絶えると、鉛蓄電池から放電することで、電力を供給し続けます。

停電時にACアダプタからの電力供給が途絶えると、鉛蓄電池を放電する

LINE Notify で LINEアプリに通知

スマホなどにメッセージで通知することも出来ます。下図は、LINEアプリ に停電があったことを通知したときの一例です。

LINEアプリ に停電があったことを通知する

クラウドサービス Ambient

無料で利用できるクラウドサービス Ambient を使用すれば、充電状態や放電状態を、スマホやパソコンのブラウザで確認することが出来ます。

無料で利用できるクラウドサービス Ambient で動作状態を確認することが出来る

安全なハードウェア設計

自作の場合であったも、安全性には一定の考慮が必要です。

今回は、電流制限抵抗つきの定電圧充電を行うようにしました。電流制限抵抗の値は、充電を実行する最小の電池電圧VBAT_MIN(10.8V)と、充電電圧VCHG(13.8V)、使用する鉛畜電池の最大充電電流ICHG_MAX(2A)から、下式で求めました。

R > (VCHGーVBAT_MIN)÷ICHG_MAX

下図のように、定電圧レギュレータNJM317Fで13.8Vを出力し、1.8Ωの電流制限抵抗を経由して、鉛蓄電池に接続します。今回は放電の時も、同じ電流制限抵抗を経由するようにしました(抵抗の右側から取り出せば放電ロスが減らせる)。

定電圧レギュレータNJM317Fで13.8Vを出力し、1.8Ωの電流制限抵抗を経由して、鉛蓄電池に接続した。放電の時も、同じ電流制限抵抗を経由するようにした

ご注意:鉛蓄電池の取り扱いについて電池工業会が注意喚起の資料を配布しています。購入前、製作前に必ず確認してください。
http://www.denchi.info/publication/IPS-TS-009.pdf

回路図の説明

FETスイッチは、充電用と放電用を直列に接続しました。ただし、充電時と放電時のどちらの場合も両方のFETをONにします。

電池電圧を測定する時は、充電用FETをOFFします。これは、測定時にACアダプタの影響を受けにくくするためです。充電用FETの内部の逆流用ダイオードは電流容量が小さいので、充電用FETと並列にダイオードを追加しました。

電池電圧が10.8V以下になった時は、放電用のFETをOFFします。これは過放電を防止するためです。ただし、測定用の分圧抵抗に電流が流れるので、長期間、放っておくと過放電になります。

なお、筆者は安全性に関して、一切の責任を負いません。十分に検証してから製作してください。

使用する機材(M5Stack版)

M5Stackと鉛蓄電池を使ったUPS
左から順に、M5Stack Basic Core、製作した基板、密閉型鉛畜電池
  • M5Stack Basic Core
  • 密閉型鉛蓄電池 12V 7.2Ah
  • ACアダプタ DC 16V 1A
  • 回路図に記載の部品および基板
  • USBコネクタ タイプA メス × 2個
  • DCジャック 耐圧16V1A対応品
  • ファストン端子 2個
  • ポリカーボネート製ケース、ねじ、ナット
  • 16V 2A 以上に対応したビニール電線
  • 接着剤 ハックルー
  • その他、USB電源チェッカや、USB模擬負荷があると便利

DCジャックについては、16V 1A以上に対応した部品を推奨します。ただし、類似の 24V 4A 対応品 (4UCON TECHNOLOGY 製) の場合、購入した2個中2個の割合で不良が発生しました。ケースに締め付けると、その圧力で接触不良が発生し、使い物になりませんでした。4UCON 製のプラグとの組み合わせでも同様でした。ケースに取り付けない状態では正常に使用できました。

VRLA 鉛蓄電池

バッテリには、密閉型鉛蓄電池 12V 7.2Ah を使用しました。注意点としては、設置する際に底面となる向きが決まっている点です。密閉構造の場合であっても、倒れたまま使用し続けると、制御弁から、電解液(有害)が漏れる場合があります。

バッテリには、密閉型鉛蓄電池 12V 7.2Ah を使用した

鉛蓄電池のセル単体の電圧は 2Vです。12Vの鉛蓄電池は、内部で 6つのセルが直列に接続されています。データシートでは、特性がセル単位で規定されている項目もあります。諸元の項目が電池全体なのかセル単体なのかに注意をはらってください。

M5Stack版の製作方法

ハードウェアの製作

ユニバーサル基板を使った製作例を下図に示します。

左下のICソケットは ESP32-C3-WROOM-02 用です。また、5か所に配置したピンヘッダは M5Stack Basic Core 接続用です。

ユニバーサル基板で製作する場合の一例

左側のビニール線は DC16V 出力の ACアダプタ用で、右側が鉛蓄電池用です。これらは半田付けを行ったうえで、接着剤(ハックルー)で固定しました。

ハードウェアの調整

充電電圧を12V~13.8Vの範囲で設定します。定電圧レギュレータ NJM317F に接続した可変抵抗(下図の青色の部品)は、充電電圧の設定用です。マイナスドライバで回転させるとレギュレータの出力電圧が変化します。

ここでは範囲内12V~13.8Vの中で最も高い13.8Vに設定しました。電圧が高い方が、より長い停電に備えることが出来ます。ただし、高い電圧で充電し続けると電池の寿命は短くなるので、容量に余裕があれば、充電電圧を下げてください。なお、電池電圧が10.8Vを下回ると、電極に膜が出来、急速に劣化が進みます。保管時や停電時は電圧の下限値に注意してください。

定電圧レギュレータNJM317Fに接続した可変抵抗で、充電電圧を 13.8V に設定した

なお、定電圧充電なので、停電後の充電には何日もかかります。充電を急ぐ場合は一時的に充電電圧を上げてください。

USB端子 5V DC 出力

製作した UPS の出力には、DC-DCコンバータ M78AR05-0.5 (MINMAX製)を用い、5V DCのUSB端子出力としました。DC 5V の USB電源で動作する機器のみを対象にしています。

MINMAX製のDC-DCコンバータ M78AR05-0.5(右)。左側の同形状のDC-DCコンバータは3.3V出力用(後述のESP32C3で使用)

下図は、Raspberry Pi Zero W を接続した時のようすです。5V 1A 出力の M78AR05-1 も販売されていますが、実力的(筆者環境)には、5V 0.5A の DC-DCコンバータで、Raspberry Pi Zero W のほか Raspberry Pi 4 を動かすことも可能でした。

UPS の出力は、DC 5V の USB電源で動作する機器のみを対象にした

ソフトウェアのダウンロード

筆者が作成した 本UPS用のサンプル・プログラムは下記からダウンロードすることが出来ます。

サンプル・プログラム ZIP形式:
https://bokunimo.net/git/ups/zipball/master

(参考資料) GitHub Pages 公開ページ:
https://git.bokunimo.com/ups/

M5Stsack Basic Core 用のプログラムはm5coreフォルダに、ESP32C3用はesp32c3フォルダに収録してあります。ESP32用はatomフォルダに収録しており、ESP32開発ボードや M5 ATOM Lite などで使用できます。

Arduino IDEで開き、次節の定義(#define)を編集してから、書き込んでください。

ソフトウェア定義の編集

定義 ADC_CHG_DIV および ADC_BAT_DIV の値を調整する必要があります。これらは、電圧測定の電圧分割係数です。回路図上のレギュレータの出力電圧用 ADC_CHRと、バッテリ電圧用 ADC_BATの値の補正に使用します。

例えば、誤差の少ない抵抗を使用した場合、次のように計算します。

#define ADC_CHG_DIV 12./(110.+12.)
#define ADC_BAT_DIV 12./(110.+12.)

しかし、一般的な±5% や±1%の抵抗を使用する場合は、以下の手順で、定義値を調整してください。

  1. NJM317F の出力電圧を測定し、ADC_CHG_DIV の分母にする
  2. 回路図の ADC_CHG の位置の抵抗分圧電圧を測定し、ADC_CHG_DIV の分子にする
  3. 同様に、BATT および ADC_BAT を測定し、それぞれ ADC_BAT_DIVの分母と分子にする

以下の例のように値を編集します。

#define ADC_CHG_DIV 1.353 / 13.78
#define ADC_BAT_DIV 1.363 / 13.72

また、#define SSIDと、#define PASSに無線LANの設定を行ってください。

システムの起動手順

以下に本システムの起動手順を示します。なお、過放電となってしまった電池電圧10.8V以下の鉛蓄電池には充電しないでください。

  1. 充電電圧の調整(参照:ハードウェアの調整)
  2. SSIDと分圧抵抗値の設定(参照:ソフトウェア定義の編集)
  3. M5Stack (またはESP32C3,ESP32)への書き込みます
  4. 鉛蓄電池の電圧が10.8V以上であることをテスターで確認します
  5. 鉛畜電池を製作した制御基板に接続します
  6. ACアダプタを接続します

鉛畜電池を接続する前に ACアダプタを接続した場合、充電を開始しません。一度、ACアダプタを取り外し、蓄電池を接続してから、再度AC接続してください。

画面(LCD)の例

下図は実行画面の一例です。

左上のメータは充電状態(放電状態)を示します。中央の0から右に針が振れると充電、左が放電です。

右上のメータは電池電圧です。

実行画面の一例。左上のメータは充電状態(放電状態)を、右上は電池電圧を示す

また、折れ線グラフは充電状態の過去の推移を示します。マイナスが放電なので、グラフの先頭では停電していました。その後、復電し充電をはじめます。充電の電力は時間とともに下がってゆくのが分かります。これは、充電により電池電圧が上昇したためです。

ダミー負荷を使った実験例

完成したらダミー負荷で実験してみます。下図は USB端子の DC 5V 出力に 10Ωのダミー抵抗を接続し、2.5Wの負荷をかけたときの様子です。この状態で、ACアダプタからの充電や、停電状態での放電のテストを行います。

ダミー負荷を使った実験例

M5Stack Basic Core を UPS で保護する

次に、M5Stack Basic Core の電源を、USB端子の DC 5V 出力から供給してみました。これで、停電時であっても M5Stack Basic Core に電力を供給できるようになりました。

M5Stack Basic Core の電源を、USB端子の DC 5V 出力から供給する

ESP32C3 / ESP32 で実運用

実運用時は、ESP32C3 を搭載した ESP32-C3-WROOM-02 が適しています。もちろん、通常の ESP32 にも対応しています。

動作状態はスマホやPCで確認できるので、M5Stack Basic Core で使用した LCD は必須ではありません。また、 LCD が無い点や後述のディープスリープで、低消費電力化が図れます。

下図は、 ESP32-C3-WROOM-02 を使った製作例です。製作方法は、前述のM5Stack版と同じです。よりコンパクトになり、ケースの蓋が閉じれるようになりました(考慮して部品を配置した場合)。

ESP32-C3-WROOM-02 (ESP32C3搭載)を使った製作例

ESP32-C3-WROOM-02 を使った製作

ESP32-C3-WROOM-02 用の電源には、3.3V 0.5A出力の M78AR033-0.5 (MINMAX製)を使用しました。

回路図には ESP32-C3-WROOM-02 がありません。配線は下記の表に合わせてください。

Pin割当接続Pin割当接続
13V3Power(3.3V)18IO 0未使用
2EN要プルアップ17IO 1Outage Detector(USER SW)
3IO 4Charging FET16IO 2Charger Voltage(ADC1_2)
4IO 5Discharging FET15IO 3Battery Voltage(ADC1_3)
5IO 6未使用14IO19未使用
6IO 7未使用13IO18未使用
7IO 8Pull Up, RGB LED12TXD未使用
8IO 9未使用11RXD未使用
9GNDPower(GND)10IO10未使用

EN端子と IO 8 にプルアップ抵抗10kΩと、電源端子に 1000μF/10Vの電解コンデンサ 10WXA1000MEFC10X9 (ルビコン製) を接続しました。(電解コンデンサは ESP32-C3-WROOM-02 モジュールの裏面に配置)

ESP32-C3-WROOM-02 モジュールの裏面に 1000μF/10Vの電解コンデンサ 10WXA1000MEFC10X9 (ルビコン製) を接続(写真の右下の黒い部品)

ESP32-C3-WROOM-02 モジュールの DIP化 については、下記の記事で製作したものです。GPIO 18 と GPIO 0は使用しないのでGNDのままでも動作すると思います。

ESP32C3 で ディープスリープ動作

本システムの充電は定電圧レギュレータによる定電圧充電です。また、停電時の経路切り替えはダイオードで行います。このため、常時マイコンを動かすような細かな制御は不要です。

そこで、普段、ESP32C3はディープスリープにしておき、30秒後に起動し、測定や制御を行うようにしました。

ESP32C3はディープスリープにしておき、30秒後に起動し、測定や制御を行う

制御部の消費電力を抑えることが出来るので、月間の電気代を節約できます。また、停電時のUPSによる保護時間(バッテリ持続時間)を長くすることもできます。

さらに、RGB LED を GPIO 8 に接続すれば、動作モードを LED の色で表示することも可能です。接続しない場合も、プルアップ抵抗は必要です。

M5Stack のブログ by bokunimo.net

「M5Stack or ESP32C3 で ネットワーク機器用 UPS を製作」への3件の返信

なるほど、二段構えでシステム設計を考えるというわけですね。ありがとうございます。貴重なヒントです。
その後、さらにさまざまな情報をリサーチしていましたら、Solarパネルから給電し、LiPoバッテリーを蓄電にした仕組みも存在することが分かりました。こういう製品も使えそうだと思いましたので、取り寄せて実験してみたいと思います。
https://www.adafruit.com/category/67

素晴らしい製作記事をありがとうございます。ESP32などで作った計測装置を太陽光パネルを使って半永久的に動かすための電源を探していて、この記事にたどり着きました。
まずは実験的にこの記事を参考に作ってみようと思いますが、前提となるソースがAC100Vなので、私の目的には少し外れてしまいます。この記事を参考にアレンジを加えてみようと思いますが、私には難しそうです。
ソーラーパネルは小さな5Wクラスのパネルで十分と思いますが、電圧が0Vから40Vくらいまで大きく変動します。これをうまく取込むにはどうすればいいか、工夫してみたいと思います。
このあたりの考察を既にお持ちではないかとも思いますが、何かヒントがありましたらご教授お願いしたいと思います。

コメント、ありがとうございます。
計測と装置を分離して考えてみてはどうでしょうか?
ソーラーパネルから鉛蓄電池に充電して、AC出力するというシステムは、いろいろと市販されていると思いますし、ある程度、自分でシステムを構築したいという場合は、ソーラー用のコントローラとACインバータを組み合わせれば作成できると思います。

コントローラ:
https://akizukidenshi.com/catalog/c/csolarctl/

インバータ:
https://akizukidenshi.com/catalog/c/cacinvert/

こういった機器でシステムを製作したうえで、ESP32に電流センサを取り付けた計測器を組み合わせるというのはどうでしょうか?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

 - 
Chinese (Simplified)
 - 
zh-CN
Chinese (Traditional)
 - 
zh-TW
English
 - 
en
French
 - 
fr
German
 - 
de
Italian
 - 
it
Japanese
 - 
ja
Korean
 - 
ko
Russian
 - 
ru
Spanish
 - 
es