はじめに
M5stamp C3Uを用いたプログラミングをいくつか行ってきました。マイコンの稼働電源は単3電池を使用していましたが、現状のままでは電池切れの心配があったため、Battery levelをわかるようにするプログラムをM5stickC Plusを用いて組みました。電池切れ直前かさえわかればいいので、ゆくゆくは別の小型マイコンでも実現したいと考えています。今回は検証用としてディスプレイのあるM5stickC Plusを使用します。
使用したもの
・M5stickC Plus
・10kΩ抵抗x2
・ブレッドボード
・単3×4電池ボックス
プログラムの考え方
今回はM5stickC PlusのGPIO33をADコンバーターの入力として使用します。ここで注意が必要なのですが、M5stickC Plusのピン入力が3.3Vが上限です。一方未使用の単3電池の電圧はメーカーによりますが、1.6V以上になることもあります。これをx4ですので合計6.4Vもの電圧が生成され、このままでは故障の原因となるためGPIOには流せません。
よって今回は10kΩの抵抗2つを用いて分圧回路を組むことにしました。
6.4Vを分圧すればGPIOに入力される電圧は3.2V、仮に6.5Vに上振れしたとしても3.25VなのでGPIOの上限電圧を超えることはありません。そして電池が消耗していけば電池ボックスからの出力電圧が低下していき、分圧された電圧も低下するといった具合です。
電池が満タンの時、電池ボックスの電圧は6.4VでM5stickC Plusへの入力は分圧回路を通して3.2V。この時の電圧をbattery level 100%とし、電池が消耗するに従い画面表示されるbattery levelの%が減少していくプログラムとします。
配線イメージは以下のようになりました。
GPIO33に分圧された電圧の入力が入るようになります。ここで私のつまづいてしまったところなのですが、GPIO33にアナログ入力を接続しただけでは基準となる0Vと比較ができないため、GPIO33を接続しているM5stickC PlusのGrove端末にあるGNDと分圧回路側のGNDを接続しておく必要があります。
プログラム
プログラム上ではanalogReadを使用してGPIO33に入力された電圧を読み取ります。この命令では0~3.3Vの入力に対し0~4095の数値を返します。よって返された数値をもとに電圧値を計算し、3.3Vを100%とした入力電圧が何%かを計算する式をプログラムに追加します。
プログラムは以下のようになりました。
#include <M5StickCPlus.h>
float battery = 0.0;
float percent = 0.0;
void setup() {
M5.begin();
M5.Lcd.setRotation(3);
M5.Lcd.setTextColor(YELLOW);
M5.Lcd.setTextSize(2);
M5.Lcd.setCursor(10, 2);
M5.Lcd.setCursor(10, 10);
M5.Lcd.print("GPIO33:");
}
uint16_t analogRead_value = 0;
void loop() {
// put your main code here, to run repeatedly:
M5.Lcd.setCursor(10, 30);
M5.Lcd.setTextColor(BLACK);
M5.Lcd.printf("%2.1f \r\n%2.1f \r\n", battery, percent);
analogRead_value = analogRead(33);
battery = analogRead_value*3.3/4095;
percent = battery*100/3.3;
M5.Lcd.setTextColor(YELLOW);
M5.Lcd.setCursor(10, 30);
M5.Lcd.printf("%2.1f \r\n%2.1f \r\n", battery, percent);
delay(100);
}
プログラム実行結果
プログラムが正しいかどうかを検証するため、最初にM5stickC Plusの3.3V出力端子を直接GPIO33に接続してディスプレイに表示される数字を検証しました。GNDについても同様に接続しています。
下写真はM5stickC Plusの裏面です。M5stickC Plus上部にはピンポートがあり、GPIOのほかに3.3V出力もあります。こちらから安定して3.3VをGPIO33に出力します。
下写真が接続イメージです。
ディスプレイには3.3Vと表示とbattery Levelが100%と表示されたため、プログラムの確認は良しとします。
実際に電池ボックスと分圧回路に接続してディスプレイを確認します。
事前にテスターで電池ボックスと分圧された電圧を測定しました。使用した電池が使い始めてから時間がたっていたこともあり、4本で計3.21Vの出力でした。それを分圧回路を通すとGPIO33とGND間の電圧は1.59Vと測定されました。M5stickC Plusのディスプレイに表示された結果は下写真の通りです。
ディスプレイには3行の文字列が表示されており、1行目から”GPIO33:”の文字列、2行目がGPIO33に入力された電圧値、3行目が3.3Vを100とした時に入力された電圧が何%なのかを指す数字です。
概ねテスタで測定したものに近い測定値が画面表示されていますのでプログラムとしてはこれで完成とします。