クムクムロボットは充電池で動作しており、電池の残量が少なくなったかを確認する方法があります。
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プログラムのコードと同じフォルダに置いていることを前提としています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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行目までがバッテリの残量を取得してコンソールに出力している処理で下記の部分となります。
1 2 3 4 |
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の間隔をとっています。
下記にテストを行ったときの結果を載せました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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プログラムのコードと同じフォルダに置いていることを前提としています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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行目までが超音波センサから計測した値を取得する処理で下記の部分になります。
1 2 3 4 5 |
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の間隔をとっています。
下記にテストを行ったときの結果を載せました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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)