M5Stack内蔵の充電電池の充電状態が表示されないのが不満だったので、M5Stackの回路図を参考にしながらバッテリーインジケーターを増設してみました。
M5Stackの電源回路
M5Stackの回路図を見ると、IP5306というICが使われていることが分かります。回路図から参考資料として示されているIP5306のデータシート(中国語)によると、USBの5V入力から、IP5306を通してM5Stack内の5V電源とバッテリー充電用の電圧を生成しているようです。またIP5306の最新データシートによると、電源ボタンを2度押しすると電源が切れるのも、このICで制御していると書かれていました。(「在 1s 内连续两次短按键,会关闭升压输出、电量显示和照明 LED。」→「1秒以内に2回短く押すと、ブースト出力、電源表示、照明LEDが消灯します。」 by google翻訳)。
さらにM5Stackでは未使用の2番ピンから4番ピンがバッテリーの充放電状態を示してくれるようなので、この機能を使ってインジケータを実装することにします。
ちょっと特徴的なのは、例えばLED1ピンとLED2ピンに、2つのLEDが逆向きにつながっていることです。つまりLED1ピンとLED2ピンの電圧差が短時間で正負入れ替わるような信号が出ているものと考えられます。そこでどんな信号が出ているのか調べてみます。
LED出力ピンの信号
LED1~LED3ピンにどのような信号が出力されるのかは、データシートに記載がありませんでした。そこでオシロスコープを使って観測してみることにします。その結果以下であることが分かりました。
- 4.552ms周期(約220kHz)の信号を1セットとしてLED状態を出力する。
- 1セット(4.584ms)は、1.1msの信号と0.038msの信号間ギャップを基本単位として4単位で構成される。。この基本単位を便宜上「ビット」と呼ぶ。つまり4ビットで1つの状態を送信していることになる。
- 各LEDピンの出力電圧は0Vか4.2Vの2値である。
これを図示すると以下のようになります(例はすべてのLEDが点灯している状態)。
ここでLEDピンの電圧を"1"(4.2Vのとき)と"0"(0Vのとき)で表し、LEDの点灯数で場合分けしたものを以下の表に示します。またLED2ピンとLED3ピンの差とLED1ピンとLED3ピンの差も合わせて記します。
4灯 | 3灯 | 2灯 | 1灯 | 無灯 | |
---|---|---|---|---|---|
LED1 | 1, 1, 0, 0 | 0, 1, 0, 0 | 0, 1, 0, 0 | 0, 1, 0, 0 | 0, 0, 0, 0 |
LED2 | 0, 0, 1, 1 | 0, 0, 1, 1 | 0, 0, 1, 0 | 0, 0, 0, 0 | 0, 0, 0, 0 |
LED3 | 1, 0, 1, 0 | 0, 0, 1, 0 | 0, 0, 1, 0 | 0, 0, 0, 0 | 0, 0, 0, 0 |
LED2-LED3 | -1, 0, 0, 1 | 0, 0, 0, 1 | 0, 0, 0, 0 | 0, 0, 0, 0 | 0, 0, 0, 0 |
LED1-LED3 | 0, 1, -1, 0 | 0, 1, -1, 0 | 0, 1, -1, 0 | 0, 1, 0, 0 | 0, 0, 0, 0 |
注目すべきはLEDピンの電圧差で、たとえばLED2-LED3が1のときはD3(75%のLED)が点灯し、-1のときはD4(100%のLED)が点灯(正確には高速に点滅)することになります。したがって1セット(4ビット)の中に1と-1が含まれていれば2つのLEDが点灯し、1か-1のいずれかしか含まれていなければそれに対応するLEDのみ点灯することになります。
バッテリーインジケーター回路図
以上の解析結果を踏まえ、LED表示回路を実装します。とっかかりとしてIP5306のリファレンス回路をそのまま作ってみたところ、LEDが常時点灯してしまいました。これだとあっという間にバッテリーの電力を消費してしまうため、ワンショットタイマー回路を使って、トリガーが発生してから一定時間のみLEDを点灯するようにしてみます。
回路図を以下に示します。LMC555CNで約4.7秒(1MΩ×4.7μF)のパルスを生成し、3ステートバッファTC74HC125APのゲートに接続します。このICのゲートは負論理であるため、LMC555CNの出力(正論理)をトランジスタによる反転回路で負論理に変換しています。
ワンショットタイマーのトリガー(回路図のSW1)は当初は小型のタクトスイッチにしようとしたのですが、M5Stackのプロトタイプモジュールの厚みの関係でスイッチを実装するのは厳しいことが分かりました。そこでM5Stackを傾けることでスイッチが入るようにするものとしてみます。傾き検出のために秋月で販売されている傾斜スイッチを使います。
これで設計はできたのでM5Stackのプロトモジュール(リンク先はスイッチサイエンスのもの)上に回路を実装していきます。
最初にプロトタイプモジュール加工をしておきましょう。プロトモジュールの下面側に4個の穴を開けます。穴は2mmとします。穴あけはピンバイスを使って手で容易に開けられました。きれいに一列にそろえるのが難しいかもしれません……。写真では5個の穴が開いていますが、一番左は元から空いていた穴です。あと写真右側に、ハンダごてで溶かしてしまった部分も写っていますが気にしないでください……。
次にIP5306のLED1~LED3ピンから線を引き出します。IP5306は基板に表面実装されています。この2番から4番ピンにポリウレタン線を直付けして信号を引き出してきます。
このエナメル線を、M5Stackのプロトモジュールの4隅にちょうどいい具合に空いていた穴に通します。下の写真ではすでに部品を実装済みのプロトタイプモジュールが写っていますが、この写真の通り電源はコネクタから引き出すことができます。なおコネクタからユニバーサル基板側に特にパターンが引かれているわけではないので、コネクタのハンダ面から直接ケーブルで電源を取るような配線をする必要があります。
作り終わってから判明したのですが、プロトモジュール(右側)の最上段左側の部品実装部(ポリウレタン線がつながっている3個のランド部分)とメインモジュール(左側)のグローブコネクタ(赤いコネクタ部品)が干渉して、組み合わせたときに若干隙間ができてしまいました。この付近の3×3のパターンのところは部品を実装しないか、表面だけでパターンを引いた方が良いかもしれません。
後は粛々と基板に部品を取り付けて配線していきます。傾斜スイッチは、M5Stackの下面を上にしたときにスイッチが入るよう、向きを考えて取り付けます。この傾斜スイッチの筒部分の金属はスイッチの足の一方とつながっているので、基板裏面のパターンとの絶縁のために、スイッチと基板の間にポリイミドテープを張り付けました。
IP5306から引き出してきたポリウレタン線の先端に、ピンソケットを付けて置き、基板上に配置したピンヘッダと連結します。
LCM555CNに接続している4.7μFのコンデンサは、占有スペース節約のため電解ではなく積層セラミックを使いました。
これくらいの部品点数でプロトタイプモジュールはいっぱいになってしまいますね。
次はLED部分を作ります。LEDは3216サイズのチップ型(秋月電子通商)のものを4個使います。これも秋月で入手しました。アノードとカソードが交互になるように2.5mm間隔で並べ、片側をハンダメッキ線などで接続します。
そしてこのLEDを先ほど作ったプロトモジュールの4個の穴に合わせて瞬間接着剤などで軽く貼り付けて完成です。
動かしてみる
こんな感じになりました。ちなみに赤いモジュールは大容量のバッテリーモジュールです。
LED表示の意味はデータシートによると以下です。
放電時
充電量 | 表示 |
---|---|
75%以上 | ◎◎◎◎ |
50%以上75%未満 | ◎◎◎× |
25%以上50%未満 | ◎◎×× |
3%以上25%未満 | ◎××× |
0%以上3%未満 | 〇××× |
0% | ×××× |
◎: 点灯、〇: 0.7秒間隔で点滅
充電時
充電量 | 表示 |
---|---|
充電完了 | ◎◎◎◎ |
75%以上 | ◎◎◎〇 |
50%以上75%未満 | ◎◎〇× |
25%以上50%未満 | ◎〇×× |
25%未満 | 〇××× |
◎: 点灯、〇: 0.7秒間隔で点滅
まとめ
まずは思った通り動作するようになったので満足です。プロトモジュールに実装できる回路の規模も何となく理解できたのも自分的には大きな成果です。
2個のICを表面実装のものに変えればもっとコンパクトに作れるかもしれません。また、信号のフォーマットが分かっているので、GPIO経由で取り込むことでソフトウェアでバッテリー状態を取得することもできそうです。