GPSのトラッカーを作るなら省電力が良いに決まってるよね!ということで、SPRESENSEの Low Power ライブラリを試してみました。今回はUSB給電でメインボードのみで測定してみました。

最初、簡易USB測定器で測ってみたのですが、なんと0.00Aにしかならず測定不能!さすが低消費電力をウリにしているSPRESENSEというべきか。うーん、困った。





で、手持ちのデジボルを見たら、精度はいかほどか不明ですが、μAレベルまで測れそう。





ということで、USBケーブルをバラシて、USBの電源ラインの間にデジボルを挟んで電流を測定することにしました。こんな感じです。





最初は基本性能から測定ということで、次のような単純なスケッチでを試してみました。


#include &ltLowPower.h>

//#define LOWPOWER_32MHz
//#define LOWPOWER_8MHz


void setup()
{
LowPower.begin();
#ifdef LOWPOWER_32MHz
LowPower.clockMode(CLOCK_MODE_32MHz);
#elif defined(LOWPOWER_8MHz)
LowPower.clockMode(CLOCK_MODE_8MHz);
#endif
}

void loop()
{
/* do nothing */
}


測定結果です。測定方法がかなりラフなので、誤差はかなりあると思いますが、周波数の設定を下げると消費電流も下がるので傾向を見ることはできそうです。


周波数消費電流

156MHz8.8 mA

32MHz4.6 mA

8MHz4.0 mA



次に、一秒ごとにシリアルを出力するスケッチを試してみました。sleep を入れて消費電力がどう変化するか、また、シリアル通信の消費電力を見るのが目的です。


#include &ltLowPower.h>

//#define LOWPOWER_32MHz
//#define LOWPOWER_8MHz


void setup()
{
Serial.begin(115200);
LowPower.begin();
#ifdef LOWPOWER_32MHz
LowPower.clockMode(CLOCK_MODE_32MHz);
#elif defined(LOWPOWER_8MHz)
LowPower.clockMode(CLOCK_MODE_8MHz);
#endif
}

void loop()
{
sleep(1);
Serial.print(".");
}


まずコンソールを開かない状態、つまりシリアル通信しない状態で電流値がどうなるか確認しました。

コンソールを開かない状態(シリアル通信なし)

周波数消費電流

156MHz7.3 mA

32MHz4.4 mA

8MHz4.0 mA



sleep も省電力に効くようですね!8MHz になるとほぼ誤差かな??

次に、シリアル通信の消費電力を見るために、PCのコンソール(Arduino IDE の Serial Monitor)を開いて測定した数値がこちら。

コンソールを開いた状態(シリアル通信あり)

周波数消費電流

156MHz16.2 mA

32MHz13.4 mA

8MHz12.9 mA



やなりシリアル通信をするとかなり電流を食いますね。+9 mA といったところです。GPSを使う場合、ATコマンドで他のホストマイコンと通信するのは消費電力面ではマイナスですね。

しかし、デバッグするには何か手段が必要ということで、LEDでどれだけ消費するか試してみました。次のスケッチで電流値がどうなるか見てみました。


#include &ltLowPower.h>

//#define LOWPOWER_32MHz
//#define LOWPOWER_8MHz


void setup()
{
Serial.begin(115200);
LowPower.begin();
#ifdef LOWPOWER_32MHz
LowPower.clockMode(CLOCK_MODE_32MHz);
#elif defined(LOWPOWER_8MHz)
LowPower.clockMode(CLOCK_MODE_8MHz);
#endif
}

void loop()
{
static int led_switch = HIGH;
sleep(1);
led_switch = (led_switch == HIGH) ? LOW : HIGH;
digitalWrite(LED0, led_switch);
}


LED点灯のテスト

周波数消費電流(LED無灯)消費電流(LED点灯)

156MHz7.3 mA9.2 mA

32MHz4.4 mA6.2 mA

8MHz4.0 mA5.9 mA



LED一つにだいたい 2mA 程度消費するようです。結構消費しますね…。

ということで、いよいよ GPS を動かしてみようと思います。次のスケッチを試してみました。シリアル通信なしで測定したいので、衛星を補足したことを知るためにLEDを点灯するようにしました。


#include &ltGNSS.h>
#include &ltLowPower.h>

//#define LOWPOWER_32MHz
//#define LOWPOWER_8MHz

static SpGnss Gnss;

void setup()
{
Serial.begin(115200);

LowPower.begin();
#ifdef LOWPOWER_32MHz
LowPower.clockMode(CLOCK_MODE_32MHz);
#elif defined(LOWPOWER_8MHz)
LowPower.clockMode(CLOCK_MODE_8MHz);
#endif

sleep(3);
Gnss.begin();
Gnss.select(GPS);
Gnss.select(GLONASS);
Gnss.select(QZ_L1CA);
Gnss.select(QZ_L1S);
Gnss.start(COLD_START);
Serial.println("GNSS is starting");
}

void loop()
{
if (!Gnss.waitUpdate(-1)) return;

SpNavData NavData;
Gnss.getNavData(&NavData);

if (NavData.posFixMode == FixInvalid || NavData.posDataExist == 0) {
Serial.print("No Position");
} else {
static int led_switch = HIGH;
sleep(1);
led_switch = (led_switch == HIGH) ? LOW : HIGH;
digitalWrite(LED0, led_switch);
Serial.print("Lat=" + String(NavData.latitude, 6) + ", ");
Serial.print("Lon=" + String(NavData.longitude, 6));
}
Serial.println("");
}


GNSS消費電力テスト(シリアル通信なし、LED無灯時、衛星補足時)

周波数消費電流(LED無灯時)

156MHz12.3 - 15.5 mA

32MHz6.9 - 9.0 mA

8MHz7.2 - 8.9 mA




GNSSを使っているときは、衛星の配置や受信環境に左右されるのか、電流値がかなりバラつきますが、8MHz と 32MHz については思ったほど差が出ませんでした。

GNSSを使うときは、32MHz がよさそうです。実験はしてみるものですね。
(^^)/~