先日、マイクロビットを使って、とある工作を行いました。
単4電池2本で、3週間ちかく連続稼働できる見込みのデバイスです。
稼働時間の確認のため、このデバイスに電池をつないだまま放っていたのですが、何故か、わずか2日ほどで停止してしまいました。
電池の持ち具合が、想定とあまりに違うので、少し調査することにしました。
今回のデバイスでは、複数のアナログ入力ピンを使用したいのですが、マイクロビットでは、最大6本のアナログ信号を入力することができます。
アナログ入力できるピンは、「0」、「1」、「2」、「3」、「4」、「10」です。このうち「0」、「1」、「2」の3本はワニ口クリップなどで外部素子と接続できますが、「3」、「4」、「10」はエッジコネクタを利用して外部と接続します。
また、「3」、「4」、「10」はLEDディスプレイでも利用している信号なので、アナログ入力に使う場合は、あらかじめLEDディスプレイ機能をOFFにしておかなければなりません。
説明を簡単にするため、MicroPythonで、「3」ピンにアナログ信号を入力するだけのプログラムを作ってみました。
from microbit import *
display.off()
while True:
v3 = pin3.read_analog()
sleep(10000)
マイクロビットにこのプログラムを読み込ませ、「3」ピンには何もつながず、単体で動作させたときの消費電流値は、約1.5mAでした。
次に、「3」ピンにアナログ電圧値を与える目的で、「3」ピンと可変抵抗をつなぎ、消費電流値を測定したところ、可変抵抗のつまみの位置(=「3」ピンに供給する電圧値)によって、なぜか、約1.8mA〜10.6mAの範囲で変動するようになってしまいました。
アナログ入力ピンに与える電圧値によって、消費電流値が変わるという、おかしな状況です。
ちなみに、「3」、「4」、「10」ピンについては、いずれも同様な結果になる一方、「0」、「1」、「2」の3ピンについては、このような問題は起きませんでした。
原因がわからないので、ためしに同等のプログラムをブロックエディタで作成してみたところ、可変抵抗のつまみを動かしても消費電流値は大きく変動しませんでした。
ブロックエディタでは問題が生じないため、今回の問題は、MicroPythonのプログラムに原因があることになります。
「0」、「1」、「2」ピンについては問題ないことから、LEDディスプレイとの共用が原因ではないかと推定しました。
display.off() でLEDディスプレイ機能をOFFにしておけば、アナログ入力に適切な設定になると思っていたのですが、そうではなさそうなので、ためしに set_pull というコマンドで、ピンの状態を明示的にユーザ設定してみました。
from microbit import *
display.off()
pin3.set_pull(pin3.NO_PULL)
while True:
v3 = pin3.read_analog()
sleep(10000)
この結果、「3」ピンに何もつながない場合で約1.5mA、「3」ピンに可変抵抗をつないだ場合で約1.8mAで、可変抵抗のつまみを動かしても、消費電流値は大きく変動しなくなりました。
この程度の消費電流値であれば、電池でも、数週間は連続稼働できそうです。
(2019/3/13追記)
set_pull コマンドを使った時の、設定内容と消費電流値の関係について、あらためて確認しました。
上述のプログラムを使い、set_pull コマンドの設定内容を変更し、それぞれについて消費電流値を測定しました。
回路構成は以下のとおりです。pin3を「入力なし」、「電源(a)」、「グランド(b)」、「中間電位(c)」のいずれかに接続しました。
それぞれの消費電流値は以下のようになりました。
set_pull コマンドを使えば、設定内容に関わらず、おかしな電流消費は生じないようです。
入力なし | 電源(A) | グランド(B) | 中間電位(C) | |
---|---|---|---|---|
set_pullなし | 1.89 | 1.89 | 10.58 | 2.03 |
PULL_UP | 1.89 | 1.89 | 2.10 | 1.99 |
PULL_DOWN | 1.89 | 2.10 | 1.89 | 1.94 |
NO_PULL | 1.89 | 1.89 | 1.89 | 2.08 |
ちなみに、それぞれの条件で採取したアナログ電圧値は以下のとおりです。
入力なし | 電源(A) | グランド(B) | 中間電位(C) | |
---|---|---|---|---|
set_pullなし | 378 | 1022 | 1 | 511 |
PULL_UP | 966 | 1022 | 18 | 654 |
PULL_DOWN | 6 | 974 | 1 | 360 |
NO_PULL | 138 | 1022 | 1 | 511 |
(参考)pin0 | 252 | 1022 | 1 | 511 |
上述のプログラムのとおり、「NO_PULL」で所望の値が採取できているようです。
なお、私がマイクロビットの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。
初心者向けから、比較的高度なものまで、さまざまな情報が記載されているだけでなく、子供向けの作例も多数掲載されていますので、「プログラミング教育」のための題材さがしなどにもおすすめです。