Logo address

ニッケル亜鉛二次電池の容量測定

2023/01/24
2023/02/22 一部修正
2023/02/28 一部修正/追加
2023/03/06 追加

最近の二次電池の進歩は日進月歩である。Amazon で「ニッケル亜鉛二次電池(NiZn)」なるものを見かけた。
まだあまり知られていないと思える。宣伝文句を読む限り魅力的である。

家庭用の二次電池としてよく知られているものは三洋電気の Eneloop に代表されるニッケル水素二次電池(NiMH)であろう。なお、三洋電機は現在では Panasonic に合併吸収されており、Eneloop は Panasonic のブランドになっている。NiMH の電圧は 1.2V であり、一次電池で利用されているアルカリ電池の 1.5 V に比べて非力さを否めない。

一方では、携帯電子機器に使われるているリチウムイオン二次電池(LIB)が家庭の中にも入りつつある。しかし LIB は家庭用としては強力すぎる嫌いがある。僕の LIB は家族から隔離している。家族が下手に LIB を使って火災が発生する可能性を心配しているのである。ノートパソコンなどの製品の中で使われている LIB は安全性については考慮されているが、バッテリとして取り出して使った場合が問題である。

NiZn は、LIB ほどの危険性は無く、家庭用として普通に使うには十分な能力を備えているらしい。NiMH の欠点を補なってくれる。また内部抵抗も小さいらしく1、オモチャ程度の動力用としてならば十分使えそうである。
標準電圧は 1.6 V で、新品のアルカリ電池並である。
家庭の電子機器は新品のマンガン乾電池やアルカリ電池の電圧(1.6~1.7V)に耐える様に設計されているはずである。充電直後の NiZn の電圧は 1.88V なので、電子機器によっては、これに耐えられない可能性があるので注意しなくてはならない。その場合、少し放電する必要がある。テスターが必要になる2

最大開路電圧

マンガン乾電池		1.73V
アルカリマンガン電池	1.68V
https://kikakurui.com/c8/C8500-2017-01.html


注1: Wikipedia( https://ja.wikipedia.org/wiki/ニッケル・亜鉛電池 )には無造作にも 5Ω と書かれている。しかし内部抵抗の大小比較はバッテリ容量や電圧との関係で議論すべきではないか?
注2: 普通の家庭にはテスターの存在を仮定できない。従って、充電器をほんの少し工夫して、使用時にマンガン乾電池の最大電圧を超えないように設計すると言う選択もある。

NiZn の実測(定負荷)

今回実験に使ったのは Amazon で見かけた

図1: 実験に使った NiZn 二次電池

である。

Amazon
https://www.amazon.co.jp/Melasta-充電式ニッケル亜鉛電池-2600mWh-Ni-Zn単三充電池-【500回以上循環使用可能】【1年保証】【ROHS、CE認証】/dp/B07X22Q9K9?th=1
の商品説明には以下のように書かれている。

Melastaニッケル亜鉛電池のメリット
商品仕様
充電について
Ni-Zn充電池の管理について
つまりバッテリ容量は 2600mAh であると説明されている。今回はこれについて調べる。

10Ωの負荷抵抗の下で、経過時間に対する電圧の変化を図2に示す1


注1: Arduino を使って電圧を観測し、結果をファイルに記録する方法が http:Arduino.html に解説されているので参考にしたらよい。

図2: 10Ω の負荷抵抗の下での経過時間に対する電圧の変化

横軸は経過時間を秒で表している。
1.2Vで電圧が急速に落ちている。このバッテリが使える実質的な電圧の下限である。
Amazon の商品説明には
電池を長く使用できるため、過放電で電池の電圧が1.3V以下に低下されないように
とある。説明では 0.1V のゆとりをもたせているが、この程度のゆとりは必要であろう。
この電池メーカーが主張する放電終止電圧は 1.3V と解釈できる。

図3に放電電気容量に対する電圧の変化を示す。

図3: 放電電気容量に対する電圧の変化

図から読み取れる放電終止電圧 1.3V に対する放電電気容量は 1250mAh ほどである。従ってこのバッテリーの容量は 1250mAh 程度である。もっともここで行われた容量計算は厳密ではない。本当は定電流の下で測定する必要があるが、僕は定電流を保証する装置は持っていない。しかし、図から判断する限り、ここで行われた計算誤差はせいぜい10%程度だろうと思える。とても 2600mAh を正当化できないのである。

図4に放電エネルギーに対する電圧の変化を示す。

図4: 放電エネルギーに対する電圧の変化

異なる電圧のバッテリーの能力を比較する場合には電気容量ではなくエネルギーを問題にすべきである。放電終止電圧 1.3V に対しては 1950mWh 程である。

Eneloop の実測(定負荷)

SANYO Eneloop (図4) を持っていたので、これで Melasta の NiMn と比較することにした。

図4: SANYO Eneloop

この商品は現在売られていない。Eneloop のブランドは Panasonic に引き継がれている。現在ではもっと改善されているだろう。

電池には HR-3UTGB と書かれている。型番だと思う。
https://panasonic.jp/sanyo-battery/p-db/HR-3UTGB-4.html
によると、放電終止電圧 1.0V である。

図5: 10Ω の負荷抵抗の下での経過時間に対する電圧の変化

Eneloop は Melasta の NiZn に比べてかなり粘る。電圧の違いを考慮しても粘りは大きい。

図6: 放電電気容量に対する電圧の変化

この図から 1800mAh が読み取れる。商品説明の 1900mAh に近い。しかも実験したものは新品ではないことを考えると上等だと見做さなくてはならない1

図7: 放電エネルギーに対する電圧の変化

2200mWh 程度か? Melasta の商品は 1950mWh 程度であったことを想起しよう。

筆者の手元には TOSHIBA の NiMH (単3) がある。これには 1300mAh と書かれている。
これは NiMH が販売された初期の製品である。NiMH はこれ以来どんどん改良されて、結局 SANYO がこの分野を制覇した。NiZn も NiMH と同様に、改良が重ねられて、放電エネルギーにおいても Eneloop に負けない商品が現れるであろう。企業側の努力に期待したい。


注1: 1800mAh は個体差の可能性が高い。他の Eneloop では 1900mAh が出ていた。

Pyplot によるデータ解析と描画

観測データは serlog.txt に収められている。NiMH の例を示す。
1674540295 7221022 1.417
1674540360 1023 1.408
1674540420 1024 1.403
1674540480 1025 1.398
1674540540 1026 1.393
1674540600 1027 1.388
...
1674602876 2064 0.137
1674602936 2065 0.132
1674602996 2066 0.132
1674603056 2067 0.132
第1フィールドは観測時刻(unix time)である。1674540295 が観測の開始時刻(単位は秒)を表している。
第2フィールド以下は Arduino から送られてくるデータであるが、1行目に関してはゴミを含み、信用できない。従って捨てることになる。
第2フィールドは観測ごとに増える数である。これは Arduino が送っている。
第3フィールドが Aruduino のアナログピンの測定電圧を表している。

serlog.txt の解析とプロットには pyplot が使われている。
使用したプログラムを以下に示す。
プログラムを実行する環境に応じてフォントの設定を合わせる必要があるかも知れない。

#
#	plot1.py ver.0.9
#	execute: python3 plot1.py
#	-Kenar-
#

import matplotlib
import matplotlib.pyplot as plt

matplotlib.rc('text', usetex=True)

# change the default font
plt.rcParams["font.family"] = "jsMath-cmmi10"
plt.rcParams["font.size"] = "14"
#plt.rcParams["font.style"] = "italic"	# no effect
plt.rcParams["font.style"] = "normal"

def plot(x,y,**k):
	# draw circles at coordinate points (x,y)
	plt.scatter(x,y,s=2) # use 2 typographic points marker. typographic points are 1/72 in.
	if "title" in k:
		plt.title(k["title"])
	plt.xlabel(k["xlabel"])
	plt.ylabel("volt")
	plt.grid(True)
	if "save" in k:
		plt.savefig(k["save"]+".pdf")
	plt.show()

title="NiMH"	# your title in plot charts

f = open("serlog.txt")
line = f.readline()	# discard the first line
line = line.split(" ")
time0=int(line[0])	# initial time

lines = f.readlines()
np = len(lines) # numbers of observed points
x = [None]*np
y = [None]*np
for i in range(0,np):
	line = lines[i].split()
	x[i] = 	int(line[0])-time0
	y[i] = float(line[2])
	print(x[i],y[i])
print(np)
plot(x,y,save="sec",title=title,xlabel="sec")

R = 10 # registor 10 Ω
dt = x[np-1]/np # time interval

z = [None]*np
sum = 0		# outflowed current in unit of mAh
for i in range(0,np):
	sum += y[i]/R*dt
	z[i] = 1000*sum/3600

plot(z,y,save="mah",title=title,xlabel="mAh")

z = [None]*np
sum = 0		# energy consumption in unit of mWh
for i in range(0,np):
	sum += y[i]**2/R*dt
	z[i] = 1000*sum/3600

plot(z,y,save="mwh",title=title,xlabel="mWh")

譜1: plot1.py (ver.0.9)

他のページ( http:raspi/index.html )で扱った汎用的な plot.py と異なり、plot1.py は放電容量の計算に特化されている。

補足: NiCd について

2023/02/28

古い NiCd 電池

手元に湯浅の NiCd (単2 1800mAh) があったので試すことにした。これは20年程も昔の商品ではないかと思える。ニッケル水素が現れてから使わなくなった。僕の印象では NiCd 電池は非常にタフであるが、充電するまえに放電しなくてはならないので、使いにくい。そのためか、リチウムイオン電池が現れてから、急速に姿を消した。

図A1: 湯浅の NiCd (単2 1800mAh)

この電池には充電の方法が書かれている:

充電電流: 180mA
充電時間: 15時間
これは NiCd 電池の標準的な充電方法である。電池容量の計算からは充電時間は10時間でよいのだが、15時間になっているのはエネルギーロスが考慮されているからだろう。0.9V になるまで放電し、あとはこれに従うことにした1

図A2: 充電回路2


注1: 終止電圧の管理は、自動停止の方法を持っていないと難しい。実際には 0.1V 台にまで、終止電圧を大幅に超えてしまうことが何回もあった
注2: 電流計は必須であるが、電圧計は無くてもよい

使われた電源は可変電圧なので、適当に調整して、180mA 付近に持っていく。そのときの電圧は 2.23V を示していた。あとは15時間放置する。安全のために、電池が熱を持っていないことを確認する。

しかし性能が回復しない。さらに放電/充電を行っても改善しない。次の図は3回目の放電/充電サイクルの結果を示す。

voNiCd-sec.png voNiCd-mAh.png voNiCd-mWh.png
sec mAh mWh

図A3: 放電/充電を2回繰り返し、3回目の充電の結果

この図を見るに、僕の古い NiCd 電池はダメになったと考えざるを得ない。

新しい NiCd 電池

図A4は、2年程前に、僕の電動ドリルのバッテリ交換のために買ったものだ。方針が変わって使われていない。
今回、この能力を試すことにした。

図A4: NiCd

電圧を測ると、1.29V あった。立派である。安全圏(1.0V以上)に納まっている。特に NiCd を実験に選んだのは内部抵抗を促成してみたいからだ。

図A5は一度放電処理/再充電を行った後の測定結果である。

NiCd-sec.png NiCd-mah.png NiCd-mwh.png
sec mAh mWh

図A5: NiCd (公称 1500mAh) の結果

放出電気容量は 1200mAh 程度出ているのが判る。

NiCd 電池は内部抵抗が小さいので、モーターなど大きな電流を要する場面で使われる。この図では負荷抵抗は 10Ω であるが、5Ω にすると観測される容量はかなり小さくなるはずである1。しかし後に示すが、10Ω と 5Ω では観測される容量は殆ど違わない。


注1: SANYO カドニカのデータが
http://www.inedenki.co.jp/dcms_media/other/sanyo_nc.pdf
で公開されている。放電特性図からは放電容量の放電電流依存性が判る。

過放電防止回路

バッテリの容量テストにおいて過放電保護回路を入れることにした。僕のジャンクボックスを漁っていたら NEC K659 と書かれた FET が出てきた。調べると MOS-FET であり、今回の目的には少しオーバースペックなのであるが、これを使うことにした。

図A6: 過放電保護回路

Analog は Arduino のアナログ入力ピン、また Digital は Arduino のデジタル出力ピンである。Arduino の sketch でアナログ入力ピンの電圧が或る値より小さくなったらデジタル出力ピンが LOW になるようにしている。
R1 は pull-down 抵抗である。10KΩ 程度でよい1。(LEDと560Ω抵抗の直列接続の方が良かったかも2)
Bat はテストバッテリ、また K2 は負荷抵抗で 10Ω を採用している。

譜A1は図A6の回路のための sketch である3。電圧監視用のアナログピンをA1に、放電を停止するためのデジタルピンを DIGITAL 8 から採っている。停止電圧を 0.9V に設定されているが、目的に応じて再設定する必要がある。


注1: Arduino は内部に pull-up 抵抗を備えているので、それと競合する可能性があるので 10KΩ が pull-down 抵抗として使われることが多いようだ。
注2: 文献
http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=1643
よると、GPIO の出力ピンに流せる最大電流は 40mA らしい。従って R1 の下限は 125Ω である。小さなLED に接続される 560Ω はもちろん OK である。
注3: この sketch には次のような欠点がある。最初に得られたデータはゴミを含むので捨てることになる。従ってグラフに反映されるデータは観測開始から60秒後のデータである。本当は観測直後には電池の電圧はもっと高かったのである。この問題は sketch の新しい版( http:Arduino.html 譜3)では改善されている。

#define ledPin 13
#define dPin 8 /* digital pin to stop discharge */
#define aPin 1 /* analog pin to watch */
#define stopVolt 0.9 /* voltage to switch off the load resistor */
#define delaytime1 30000 /* delay time for ledPin LED HIGH */
#define delaytime0 30000 /* delay time for ledPin LED LOW */
/*
 * stopVolt 0.9 for NiCd
 */


void setup()
{
    pinMode(ledPin, OUTPUT);      // sets the digital pin as output
    Serial.begin(9600);
    pinMode(dPin, OUTPUT);    // sets the digital dPin as output
    digitalWrite(dPin, HIGH);
}

void loop()
{
    int i;
    int val;  // variable to store the value read
    float volt;
    static int done = 0;
    static int count = 0;
    digitalWrite(ledPin, HIGH);
    count++;
    Serial.print(count,DEC);
    Serial.print(" ");
    val = analogRead(aPin);  // read the input pin. the val is from 0 to 1023
    volt = 5.0*val/1023;   // convert to volt. 1.588 for val=325
    Serial.print(volt, 3);
    if(done)
        Serial.print(" *");
    Serial.println("");
    if(volt < stopVolt){
        digitalWrite(dPin, LOW);
        done = 1;
    }
    delay(delaytime1);
    digitalWrite(ledPin, LOW);
    delay(delaytime0);
}

譜A1: 過放電防止 sketch の例

過放電防止回路を使って新しい NiCd (1500mAh) を再度試した1。10Ωの負荷抵抗、0.9V の停止条件で図A7のようになった。0.9Vになってからも電池の電圧は計測し続けている。


注1: 僕は新しい NiCd (1500mAh) をいくつか持っているので、過放電が発生した電池ではないとの意味

この結果を見ると、思わず唸ってしまう。二次電池の動作は複雑である。0.9Vで放電を停止すると、今度は電圧が上がって行く! 何故だろう? どこまで上がるのだろうか?

NiCd-sec-a14.png NiCd-mah-a14.png NiCd-mwh-a14.png
sec mAh mWh

図A7: NiCd (公称 1500mAh) の放電. 負荷抵抗 10Ω, 放電終止電圧 0.9V

参考のために負荷抵抗や放電終止電圧に変更を加えた結果を、図A8 及び図A9に示す。

NiCd-sec-a13.png NiCd-mah-a13.png NiCd-mwh-a13.png
sec mAh mWh

図A8: NiCd (公称 1500mAh) の放電. 負荷抵抗 5Ω, 放電終止電圧 0.9V

NiCd-sec-a15.png NiCd-mah-a15.png NiCd-mwh-a15.png
sec mAh mWh

図A9: NiCd (公称 1500mAh) の放電. 負荷抵抗 10Ω, 放電終止電圧 1.1V

結局、次の根本的な疑問に行き着く:「何が電池の電圧を決めているのか?」

放電時の負極での反応式:
Cd + 2(OH)- → Cd(OH) + 2e-

放電時の正極での反応式1:
NiO(OH) + HO + e- → Ni(OH) + (OH)-


注1: NiO(OH) はオキシ水酸化ニッケルと呼ばれる。酸化剤として使われる
https://ja.wikipedia.org/wiki/酸化ニッケル(III)
http://www.secondary-cell.com/nicd/reaction.html
https://www.baj.or.jp/battery/knowledge/structure.html

FET の一般的な解説は次の記事[1]がよくできている。専門的な解説は例えば記事[2]を見よ。K659 のデータシートは記事[3]にある。
[1] https://www.am.ics.keio.ac.jp/digital/mosfet.pdf
[2] https://www.marutsu.co.jp/pc/static/large_order/fet_3
[3] http://www.datasheet.jp/pdf/944913/K659.html

K659 は、昔買って使おうとしてそのままになっていた部品である。ゲート電圧に 5V 系の回路を想定しているところが時代を感じる。しかし、今回の目的には丁度よい。MOS-FET の図は自己流に書かれている。エッセンスが簡潔に表現されているので、僕はこの図の方が好きである。

奇妙な放電曲線

2023/03/06

或る継ぎ足し充電をした NiCd 電池の放電曲線を求めたら次のような奇妙な曲線になった。

NiCd-sec-a26.png NiCd-mah-a26.png NiCd-mwh-a26.png
sec mAh mWh

図A10: NiCd (公称 1500mAh) の放電. 負荷抵抗 10Ω, 放電終止電圧 0.9V

この電池は図A9の放電実験のあとに継ぎ足し充電をしている。
このような奇妙な曲線を描いたのは継ぎ足し充電が原因ではないかと思われる。ちゃんと充電すれば綺麗な放電曲線が得られることが以下のように確認できる。

この電池は(図A10の放電実験によって)放電終止電圧まで放電されている。しかし時間の経過とともに1.2V弱にまで電圧が上昇している。これを充電するとどのような充電曲線を描くだろうか?

図A11: ケーブルに逆流防止ダイオードと過電流防止ヒューズを取り付けて使っている

電池と抵抗を直列に繋いで電源から電流を流す。抵抗を噛ませる理由は、安全性の向上の他に、充電に伴う電流の変動を抑えたいからである。

電源は定電圧を供給する。抵抗値を \(R\)、充電開始時の電池電圧を \(V_1\)、充電電流を \(I_1\) とする。充電終了時の電池電圧を \(V_2\)、充電電流を \(I_2\) とする。その下で(電源電圧に関わらず) \[ V_2 - V_1 = R \cdot (I_2 - I_1) \tag{A1} \] の関係が成立している。

図A11: NiCd (公称 1500mAh) の充電曲線。R=5Ω

図A11において電池の電圧を観察すると 1.52V から昇って行かない。この 1.52V はもちろん Arduino が捉えた電圧であるが、NiCd の両端をテスターで測定すると 1.45V になっていた1。図から察するにしっかりと充電できたのではないかと思われる。


注1: 1.52V と 1.45V の違いは測定装置の誤差の大きさを超えている。僕の経験では Arduino と電池が近いと、両者の電圧の違いは殆どない。このケースでは 1m 程離れている。その場合、なぜこれ程までに電圧に大きな違いが発生するのか? 謎である。

NiCd-sec-a28.png NiCd-mah-a28.png NiCd-mwh-a28.png
sec mAh mWh

図A12: NiCd (公称 1500mAh) の放電. 負荷抵抗 10Ω, 放電終止電圧 0.9V

今度は 1400mAh 近く出ている(図A7と比較せよ)。

なお満充電を判定する方法として、デルタピーク検知法がある。この方法は満充電に達した後で電池電圧が下降する現象を利用している。この電圧の下降は、満充電になっていると供給される電気エネルギーがすべて熱に変わり、それによって電池の温度が上昇し、電池電圧が下がることが原因である(下記の文献[1]の「充電特性」を見よ)。しかし、図A12のようにゆっくりと充電すると電池は殆ど熱を持たず電圧の下降は観測されない。僕は電池が発熱するような高速充電は大嫌いである。

次に式(A1)の抵抗 \(R\) として 10Ω を選択して充電曲線を調べる。図A11では 5Ω であったが、これを 10Ω にすることによって、定電流充電に近づく。定電流充電と言うのは、電流を流す強制力が強いと言うことでもある。従って十分な充電管理が要求される。結果を図A13に示す。右側には参考のために横軸を(時間ではなく)注入電気量にしている。従って満充電との関係が解りやすい。注入電気量は積分で計算しているために電源電圧が少々変動しても図は変わらないはずである。注入電気量は抵抗の両端の電圧の差分から計算している。

NiCd-a29-out1.png NiCd-a29-out3.png
sec mAh

図A13: NiCd (公称 1500mAh) の充電曲線。R=10Ω

今度は僅かながらデルタピークが現れている。しかしこれを確実に捉えるアルゴリズムが思いつかない。

[1] カドニカ
http://www.inedenki.co.jp/dcms_media/other/sanyo_nc.pdf