10.電池残量のチェック方法

クムクムプログラミング

クムクムは充電池で動作しており、電池の残量が少なくなったかを確認する方法があります。
Pythonで電池の残量チェックを行うにあたって、まずこの電池残量の取得のメカニズムを知っておく必要があります。

電池残量確認のメカニズム

電池残量は「電圧値」で確認するのですが、そのためにはクムクムのCPUで電池残量の情報を収集する機能が必要になります。
クムクムには電源ラインからの電圧を収集できるようにアナログ入力に接続されています。
アナログ入力でCPUで取得できるのはあくまで一定の範囲の数値のみで、○○Vといった電圧値を知るにはこの「アナログ値」から計算することになります。

クムクムの電池残量のアナログ値について

アナログ値から電圧値への変換には、アナログ値の取得可能な範囲(上限値と下限値)、とクムクムの電池残量が満充電に近い状態(約5.0V)のクムクムのCPUへ供給される電圧値(上限値)と0Vのときの電圧値(下限値)が関係します。

クムクムのCPUでは、電圧値が0.0(V)のときはアナログ値は0、電圧値が3.3(V)のときはアナログ値が1023となるようになっています。

CPUの動作電圧による電圧値の範囲(V) クムクムのCPUで取得できるアナログ値
0.0 0
3.3 1023

 電圧値に対するアナログ値の算出方法

また、クムクムは電源の供給電圧は5.0(V)ですが、クムクムの電池残量チェック用にCPUに実際に供給される電圧値は0 – 2.5(V)で、充電池が満充電の状態の場合、クムクムのCPUへは2.5(V)が供給される仕組みになっています。

クムクムのCPU内で充電池が満充電の状態で電池残量をアナログ値で取得すると2.5(V)の入力となるのでCPU側の動作電圧3.3(V)に対する2.5(V)時のアナログ値が「充電池が満充電の状態」となります。

では実際のアナログ値はどのくらいになるかというとこれは計算で出すことが可能です。

まず、2.5(V)が3.3(V)に対する割合をもとめます。

 

2.5(V) / 3.3(V) = 0.7575…(←この0.75…はあくまで「割合」です)

 

そして、この割合がアナログ値の範囲(0 – 1023なので1023)での0.75(75%ですね)のアナログ値が幾つになるかを求めます。

 

1023 * 0.75 = 775(←この数値)

 

この’775’という値が「クムクムで充電池が満充電のときのおおよそのアナログ値」となります。
(「おおよそ」と書いてあるのは、必ずこの値になるとは限らないからで、誤差などで多少値が異なることがあります)

 

参考までに、アナログ値1に対する電圧値は

 

3.3 / 1023 = 0.0032258…

 

となり、アナログ値が1変化すると「充電池の電圧値は約0.0032(V)変化した」ことになります。

 

電池残量のチェックを行うための情報

VS CodeでPythonプログラムのプロジェクトやソースファイルを作成する方法については「5. VS CodeによるPythonプログラムの開発」を確認してください。

Pythonプログラムから直接QumcCommLib.dllを呼び出す場合は、「3.Qumcum PythonライブラリでコントロールできるAPI仕様(QumCommLib.dll呼出し)」にある電池残量のチェック”qumcomm_get_battery_value()”を確認してください。

Pythonプログラムからqumcum.pyを経由して呼び出す場合は、「2.Qumcum PythonライブラリでコントロールできるAPI仕様」にある電池残量のチェック”qumcum.get_battery_value()”を確認してください。

クムクムと接続する方法についての説明は、「4.クムクムとの接続~LEDの点灯」を参考にしてください。

Pythonプログラムから直接QumcCommLib.dllを呼び出す

コード全体はこのようになります。

※ここで、QumcCommLib.dllはこれから作成し、実行するPythonプログラムのコードと同じフォルダに置いていることを前提としています。

import os
import time
from ctypes import *

# DLLのフォルダにカレントディレクトリを追加します
os.add_dll_directory(os.getcwd())

# DLLをロードします
dll = cdll.QumCommLib

# COMポートの番号文字列を生成
port = c_char_p('\\\\.\\COM11'.encode('utf-8'))

# Qumcumと接続
h = dll.qumcomm_connect(port, 115200)

dist = c_int()

for num in range(20):
    dll.qumcomm_get_battery_value(h, byref(dist))
    print(dist.value)
    time.sleep(0.1)

# Qumcumから切断
dll.qumcomm_end(h)

19行目から22行目までがバッテリの残量を取得してコンソールに出力している処理で下記の部分となります。

for num in range(20):
 dll.qumcomm_get_battery_value(h, byref(dist))
 print(dist.value)
 time.sleep(0.1)

こちらはループを用いて20回計測を行っています。
ループの中でqumcomm_get_battery_value()を呼出し、distに計測結果を取得してprint(dist.value)で取得した値を表示しています。
time.sleep(0.1)で0.1秒(100msec)ほど間隔を置いています。あまり頻繁に通信を行うとPCに負荷がかかるので負荷がかからないように100msecの間隔をとっています。

下記にテストを行ったときの結果を載せました。

742
742
739
739
742
745
744
740
740
742
747
745
742
739
742
747
745
742
742
740

 

テストしたときは、上記のような結果(20回での平均は742.3)が取得されました。

ここから下記の計算を行うとバッテリ(充電池)の残量(電圧値)を知ることができます。

( [取得結果] / [アナログ値の数]  * [動作電圧(V)] ) * 2 = [バッテリ(充電池)の残量(V)]
※式の最後に2をかけているのは、クムクムの電池残量チェック用には実電圧の1/2で入力されるようにしているので逆算するために2倍しています。

今回の結果をこの計算式に当てはめると、下記のようになり「バッテリ(充電池)の残量は約4.78(V)」であるということがわかります。

(742.3 / 1023 * 3.3(V)) * 2 = 4.78(V)

 

Pythonプログラムからqumcum.pyを経由して呼び出す

コード全体はこのようになります。

※ここで、QumcCommLib.dll、qumcum.pyはこれから作成し、実行するPythonプログラムのコードと同じフォルダに置いていることを前提としています。

import qumcum
import time

# Qumcumと接続
qumcum.connect("\\\\.\\COM11")

dist = [0]

for num in range(20):
    # Get Battery
    qumcum.get_battery_value(dist)

    print(dist[0])

    qumcum.wait(0.1)

# Qumcumから切断
qumcum.end()

9行目から15行目までが超音波センサから計測した値を取得する処理で下記の部分になります。

for num in range(20):
 # Get Battery
 qumcum.get_battery_value(dist)
 print(dist[0])
 qumcum.wait(0.1)

こちらはループを用いて20回計測を行っています。
distは配列としています。pythonで関数から引数経由で値を取得するには配列などを用います。
ループの中でqumcum.get_sensor_value()を呼出し、distに計測結果を取得してprint(dist[0])で取得した値を表示しています。
qumcum.wait(0.1)で0.1秒(100msec)ほど間隔を置いています。あまり頻繁に通信を行うとPCに負荷がかかるので負荷がかからないように100msecの間隔をとっています。

下記にテストを行ったときの結果を載せました。

744
743
743
743
739
739
745
745
739
745
745
745
745
739
745
745
744
742
742
739

 

テストしたときは、上記のような結果(20回での平均は742.8)が取得されました。

ここから下記の計算を行うとバッテリ(充電池)の残量(電圧値)を知ることができます。

( [取得結果] / [アナログ値の数]  * [動作電圧(V)] ) * 2 = [バッテリ(充電池)の残量(V)]
※式の最後に2をかけているのは、クムクムの電池残量チェック用には実電圧の1/2で入力されるようにしているので逆算するために2倍しています。

今回の結果をこの計算式に当てはめると、下記のようになり「バッテリ(充電池)の残量は約4.79(V)」であるということがわかります。

(742.8 / 1023 * 3.3(V)) * 2 = 4.79(V)