Braveridgeでは、全固体電池や防爆リチウムイオン電池など、他社に先駆けて様々な部品を積極的に使用しています。
様々な部品を使うときには、部品の特性を把握しておく必要があります。
今回の記事は、電池の特性に関係があるお話です。

電池の特性を把握するときには、様々な電流で放電したり、何度も充電・放電を繰り返すことが有効になります。
高価な機器を組み合わせて、放電電流を変更したり、充電・放電を繰り返すこともできますが、試験器は有限。
安価に気にせず試験できる環境を作りたくて、充放電サイクル試験器を作ってみました。

ということで、前回のブログ記事で回路構成を説明しました。
今回の記事は、Node-REDプログラムの解説をしていきます。
プログラミングが得意になってきたかもしれない、電気設計課の楠川です。

まずは全体の構成図を下記に記載します。

構成図

動作説明

・電池の放電&電圧電流監視
・3時間の充電
と、充電と放電を切り替えながら繰り返す動作となります。

回路の動きは大きく分けて4つです。

  1. 電池の放電・・・電子負荷回路で放電します。
  2. 電圧監視と電流記録・・・測定回路で電圧監視・電流記録します。
  3. 充電へ切り替え・・・電池電圧が低下したら、電子負荷の動作停止と、リレーで充電回路に切り替えます。
  4. 三時間の充電・・・充電後はリレー回路で電子負荷回路に切り替えます

Node-REDプログラム説明

フロー全体像

①1秒ごとにフロー実行

Node-REDのフローを1秒ごとに動作させています。
動作のたびに、センサーの値を読み出します。

②電圧確認

1秒ごとに、電池電圧を確認します。
放電すべき電圧なのか、充電すべき電圧なのかを確認します。
1秒ごとに電圧を確認することで、回路に異変が起きた場合にもすばやく対処できます。
放電回路のショートなどの危険があったら、電圧低下を検知して放電モードから1秒で抜け出せます。
(が、抜け出した直後に充電モードに入るので、微妙なフロー・・・)

③測定値保存

1秒ごとにセンサーの値を読み出したら、読みだした値にタイムスタンプを追加してCSVに保存します。
(電流に大きな変動は無いので、1分ごとに保存する形でもいいかもしれません)
(プログラミングがニガテなので、フローはこのままとします・・・)

④1秒ごとにトリガリセット

充電フローが動作するようにトリガをリセットしています。
(1秒ごとにリセットする必要はありませんが、フローがシンプルになるのでこのまま・・・)

⑤充電開始電圧に到達したら、trigger & blockで1回だけフローを実行

・電子負荷の操作フロー、
・充電時間のディレイフロー、
2個のフローを1回ずつ実行します。

⑥電子負荷の操作

電子負荷を操作して放電電流をゼロにします。
また、リレー回路で充電を開始します。
(放電電流がゼロになったのを確認してから、リレーを切り替えたほうがリレー接点の消耗が少ないかと思いますが、このまま・・・)

⑦充電時間のディレイ

充電回路に切り替わるのを前提に、3時間のディレイ中に充電します。

3時間経ったら、
・電子負荷の起動
・放電回路への切替
を行います。
(こちらも、放電回路へ切り替わってから電子負荷を起動したほうが、リレー接点の消耗が少ないと思いますが、このまま・・・)
 

⑧充放電回路の切替

充放電回路を切り替えます

上記①〜⑧の動きを繰り返して、充放電サイクル試験器として動作します。

Node-REDコード全体


[{"id":"db378aa9.6c20c8","type":"tab","label":"電子負荷","disabled":false,"info":""},{"id":"d0f92562.a50778","type":"ina226-sensor","z":"db378aa9.6c20c8","name":"ina226読み出し","address":"0x40","shunt":"0.025","x":200,"y":120,"wires":[["5d7e0b53.11a7c4"]]},{"id":"a57c3d8e.6163f","type":"inject","z":"db378aa9.6c20c8","name":"1秒ごとに実行","topic":"","payload":"true","payloadType":"bool","repeat":"1","crontab":"","once":false,"onceDelay":0.1,"x":140,"y":80,"wires":[["d0f92562.a50778"]]},{"id":"886f2e78.28281","type":"i2c out","z":"db378aa9.6c20c8","name":"デジタルポテンショメータ","busno":"1","address":"24","command":"0","payload":"payload","payloadType":"msg","count":"1","x":1200,"y":480,"wires":[[]]},{"id":"2e0dda66.4619e6","type":"file","z":"db378aa9.6c20c8","name":"","filename":"/home/pi/test-1214.csv","appendNewline":false,"createDir":false,"overwriteFile":"false","encoding":"none","x":950,"y":120,"wires":[[]]},{"id":"af729c82.e1625","type":"function","z":"db378aa9.6c20c8","name":"タイムスタンプ追加","func":"var now = new Date();\nvar nowStr =\n    \"\" + now.getFullYear() +\n    \"/\" + ('0' + (now.getMonth() + 1)).slice(-2) +\n    \"/\" + ('0' + now.getDate()).slice(-2) +\n    \" \" + ('0' + now.getHours()).slice(-2) +\n    \":\" + ('0' + now.getMinutes()).slice(-2) +\n    \":\" + ('0' + now.getSeconds()).slice(-2);\n \nmsg.payload = {\n    // 日付\n    date: nowStr,\n    // 電圧、電流\n    voltage:msg.payload.v,\n    current:msg.payload.c,\n    wattage:msg.payload.p\n}\n \nreturn msg;","outputs":1,"noerr":0,"x":580,"y":120,"wires":[["cbbd7095.b9305"]]},{"id":"cbbd7095.b9305","type":"csv","z":"db378aa9.6c20c8","name":"","sep":",","hdrin":"","hdrout":true,"multi":"one","ret":"\\n","temp":"","skip":"0","strings":true,"x":760,"y":120,"wires":[["2e0dda66.4619e6"]]},{"id":"807dfd55.537d2","type":"comment","z":"db378aa9.6c20c8","name":"電流読み出し","info":"","x":90,"y":40,"wires":[]},{"id":"e28c1c63.00465","type":"rpi-gpio out","z":"db378aa9.6c20c8","name":"","pin":"10","set":"","level":"0","freq":"","out":"out","x":1140,"y":680,"wires":[]},{"id":"c50656cd.a3e3a8","type":"comment","z":"db378aa9.6c20c8","name":"充放電切り替え","info":"","x":1140,"y":640,"wires":[]},{"id":"5d7e0b53.11a7c4","type":"switch","z":"db378aa9.6c20c8","name":"<2.6","property":"payload.v","propertyType":"msg","rules":[{"t":"gte","v":"2.6","vt":"num"},{"t":"lt","v":"2.6","vt":"num"}],"checkall":"true","repair":false,"outputs":2,"x":370,"y":300,"wires":[["af729c82.e1625","4c0e96c7.b5d658"],["167642c9.7a696d"]]},{"id":"994bf5b4.1ad1d8","type":"change","z":"db378aa9.6c20c8","name":"31 (700mA)をセット","rules":[{"t":"set","p":"payload","pt":"msg","to":"31","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":920,"y":520,"wires":[["886f2e78.28281"]]},{"id":"85b3b49.946f848","type":"comment","z":"db378aa9.6c20c8","name":"デジタルポテンショメータ値","info":"","x":920,"y":440,"wires":[]},{"id":"257c7f4.a46158","type":"comment","z":"db378aa9.6c20c8","name":"充電時間","info":"","x":580,"y":640,"wires":[]},{"id":"cdadc2fe.1390c","type":"comment","z":"db378aa9.6c20c8","name":"充電開始電圧","info":"","x":350,"y":260,"wires":[]},{"id":"253f8924.f6e686","type":"comment","z":"db378aa9.6c20c8","name":"放電","info":"","x":470,"y":220,"wires":[]},{"id":"3b6e2440.71568c","type":"comment","z":"db378aa9.6c20c8","name":"充電","info":"","x":470,"y":360,"wires":[]},{"id":"93acf8e0.ee8f88","type":"comment","z":"db378aa9.6c20c8","name":"放電データ記録","info":"","x":540,"y":80,"wires":[]},{"id":"167642c9.7a696d","type":"trigger","z":"db378aa9.6c20c8","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"0","extend":false,"units":"min","reset":"","bytopic":"all","name":"","x":560,"y":480,"wires":[["416d9283.ab5d6c","fce5232a.b3a27"]]},{"id":"4c0e96c7.b5d658","type":"change","z":"db378aa9.6c20c8","name":"トリガリセット","rules":[{"t":"set","p":"reset","pt":"msg","to":"","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":560,"y":160,"wires":[["167642c9.7a696d"]]},{"id":"416d9283.ab5d6c","type":"delay","z":"db378aa9.6c20c8","name":"","pauseType":"delay","timeout":"3","timeoutUnits":"hours","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":600,"y":680,"wires":[["e28c1c63.00465","994bf5b4.1ad1d8"]]},{"id":"fce5232a.b3a27","type":"change","z":"db378aa9.6c20c8","name":"0 (0A/充電オン)をセット","rules":[{"t":"set","p":"payload","pt":"msg","to":"0","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":930,"y":480,"wires":[["e28c1c63.00465","886f2e78.28281"]]},{"id":"e5fd560b.c96e28","type":"comment","z":"db378aa9.6c20c8","name":"充電モードオン、放電開始まで入力拒否","info":"","x":600,"y":440,"wires":[]},{"id":"7acd4ce1.a75394","type":"comment","z":"db378aa9.6c20c8","name":"充電オン","info":"","x":1100,"y":560,"wires":[]},{"id":"c2253de3.d7dd2","type":"comment","z":"db378aa9.6c20c8","name":"充電オフ","info":"","x":860,"y":680,"wires":[]}]

 

システム全体を通して眺めてみる

システム全体をながめてみると、寿命部品があることに気づきました。SDカードです。
SDカードについて確認してみます。

SDカードの寿命について

今回のプログラムでは、1秒ごとにログを保存しています。
書き込み回数が多いので、寿命がすぐに来そうです。

というわけで、Panasonic社のSDカードページを調べてみると、今販売されているメモリの種類と寿命の目安について記載がありました・・・(2021/1/22調べ)

  • MLC:約2,000〜3,000回
  • pSLC:約20,000回
  • SLC:約60,000回

これはヤバいw
もう少しブラッシュアップしていかないと、すぐにSDカードの寿命が来るかもしれません。
 

全体のまとめ

回路をだけを見たときには、必要にして十分!かと思っていました。
でも、システム全体としては、部品寿命や回路保護の観点からは不十分でした。。。
「動けばいいだろう」で、作ると検討不足が目立ちます。
製品レベルに落とし込むなら、システム全体で検討しないとダメですね!

ビジュアルプログラミングなら簡単だと思っていましたが、フローを組むのを慣れていないと難しい・・・
自分でツッコミを大量に入れてしまうようなプログラムになっています。
安全なプログラムを組もうと思ったら、簡単ではないことがわかりました!

「プログラミングが得意になってきたかもしれない」というのは気のせいでした。。。
ビジュアルプログラミングになっても、プログラミングはやっぱりニガテ!!

でも、ビジュアルプログラミングはわかりやすく、すこし手の届くところに近づいた気がします。
今後も挑戦していくかもしれません。

SNS SHARE