PoC(実証実験:Proof-of-Concept)をクリアし実運用に耐えうるシステムを構築・展開していく中で「エッジの低消費電力化」が強く求められています。電源ケーブルの敷設やバッテリーの頻繁な交換を必要としないため、山岳・森林・海上といった遠隔地のデジタル化(デジタル・トランスフォーメーション:DX)の推進に絶大な効果を発揮できるためです。
また、電源設備の整ったFA分野、Industrial IoT(IIoT、Industry4.0)分野も低消費電力なエッジを必要としています。エッジが電力を効率的に活用することにより、瞬間的な電源異常(瞬停、瞬電)に対して巨大な補助電源装置を使うことなく、少量の電力を蓄積できるスーパーキャパシタ(大容量のコンデンサ)のみで電源の喪失を回避することができます。24時間365日稼働し続けなければならないFAの現場に対応できる、高い信頼性を備えたサービスを構築可能です。
こうした低消費電力化を推進する動向と、高スループットを達成するために多数の演算ユニットを統合したマルチコア・アーキテクチャを採用する動向は、背反するように感じられますが、実は両立することができます。
今回の初心者講座マルチコア編では、汎用コンピュータが採用している電力低減技術(電力削減技術)をはじめ、マルチコア・アーキテクチャのSPRESENSEが低消費電力を達成するために採用した技術、実際にデバイスが動作している最中の電力解析やその結果について詳解いたします。
電力低減技術の紹介
汎用コンピュータに採用されている電力低減機能
SPRESENSEをはじめとするIoTエッジの低消費電力技術や電力解析手法を解説する前に、一般的に使われている汎用コンピュータの電力低減技術を紹介いたします。
休止状態(ハイバネーション)
WindowsやmacOS、Linuxといった汎用OSが当たり前のように使っている「スリープ」機能や「ハイバネーション(休止状態)」機能は低消費電力化の技術を理解するための最初の手がかりとなります。これらの機能は、大きな電力を消費し続ける内蔵機器への給電を停止することにより、システムの電力低減に貢献します。
ハイバネーションは、メモリへの電源供給を停止する機能です。メモリはあらゆる機能に必要とされていますが、電力を大量に消費することから、メモリを停止させることで劇的に電力を低減することができます。揮発性ストレージであるメモリ(SRAM・DRAM)上の情報は給電が停止すると消失してしまうため、ハイバネーション機能は、電力遮断前にメモリ上の全データを不揮発性ストレージへ移動(バックアップ)し、電源復帰後に不揮発性ストレージからメモリへデータを復元(リストア)することで、メモリ上の情報を維持したまま電力低減を実現します。
Intel Turbo Boost Technology
すべてのプログラムが、マルチコア・アーキテクチャのCPUコアすべてを活用できるわけではありません。例えば、システムに6個のCPUコアを搭載されていたとしても、データ間の依存性が極めて高いアルゴリズムを実行している間は、同時に2個のCPUコアしか利用できず、他の4個のCPUコアが未使用状態となることがあります(図1中央)。
ターボ・ブースト・テクノロジーは、未使用のCPUコアを停止することにより余った電力・熱設計電力(TDP)を動作中のCPUコアへ移譲し、クロックアップする機能です。これにより消費電力と発熱量を安全域に保ちながら並列度の低い処理を短時間で完了させることができます(図1右、高い動作周波数のCPUコアは大きな電力を必要とします)。
PCI Express Architecture Power Management
マルチコア・アーキテクチャとして複数のCPUコアが集約されると、同時に大量のデータを処理できるようになるため、ペリフェラル(周辺機能)とそれらを接続するバス(通信経路)の高速化が求められます。そのため、ペリフェラルやバスも大量の電力を消費します。
PCI Expressは高速な通信路の代表例です。高機能・高いスループットで動作するペリフェラルと低レイテンシでアクセスできるメモリを結合するための高速なネットワークです。高速通信を実現するために高い周波数の信号を扱うため、大きな電力を消費します。そこでPCI Expressは電力低減機能として、周辺デバイスへの電力供給の管理(D*ステート)や、利用されていない通信リンクの管理(L*ステート)を規格として定義。未使用部への給電をダイナミックに制御することで、電力を効率的に活用します。
Intel|PCI Express Architecture Power Management
SPRESENSEが採用している消費電力の低減手法
次に、本初心者講座の学習機材「SPRESENSE」が取り入れている消費電力の低減手法を紹介いたします。大別して4種類の機能があります。ここでは要点のみを抜粋して紹介します(詳細については下記の記事をご参照ください)。
CPUコア/メモリタイル単位の給電制御機能
SPRESENSEは内蔵の電力制御コントローラにより、6個のCPUコアと128KBx12個のメモリタイルのうち、利用されていないハードウェアへの給電を自動的に遮断します。
電源ドメイン毎の給電制御機能
SPRESENSEの核となるLSI「CXD5602/CXD5247」は、機能別に4個の電源ドメインに分割されています(図2)。内蔵の電力制御コントローラが、未使用機能に対応するドメインへの給電を自動的に遮断することにより、電力の浪費を防ぎます。
- Application Domain
- System and IOP Domain
- Sensor Domain
- GNSS Domain
スリープ機能
SPRESENSEは、定常状態に加えて、3種類のスリープ状態「Hot-Sleep(2020年1月現在:非対応)」「Cold-Sleep」「Deep-Sleep」を定義しています(機能の差異については後述)。アプリケーションがAPIを使ってデバイスをスリープ状態へと遷移させることにより、システムの電力を大きく低減することができます。その後、特定のイベントを検出すると定常状態へと復帰します。
動作クロックの上限を管理する機能
SPRESENSE SDKの提供するAPIを使うことにより、SPRESENSEの動作クロックの上限を「High」または「Low」に設定可能です。本APIを活用することにより、消費電力と処理性能(レイテンシ)のバランスをダイナミックに調整することができます。
Spresense SDK Library|up_pm_acquire_freqlock
はじめての電力解析
続いて、消費電力を解析する方法について紹介いたします。
シャント抵抗(直列)を使って電力を計測する
SPRESENSEで開発する際には、開発用PCとSPRESENSEをUSBで結合し、USB-UARTを介して実行するプログラムを転送、USBバスパワー(約5V)により必要な電力を供給します。そのため、USBの給電ラインの電流値を計測することにより消費電力の算出が可能です。電力を計測するためのソリューションは数多くありますが、今回はUSBの給電ラインにシャント抵抗を直列接続し、シャント抵抗の両端の電圧値から電流値を算出、消費電力量を推定します。
なお、今回の計測には2種類のシャント抵抗「0.025Ω」「10Ω」を利用しました。
小さなシャント抵抗(0.025Ω)を利用する場面
大きな電力を必要とするデバイスの電力解析には、小さな抵抗値のシャント抵抗が適しています。小さなシャント抵抗を使うことにより、大電流が通過した場合でも電圧降下を小さく抑えられるため、実際の運用環境に近い条件で電力を解析できます。ただし、出力電圧の幅も狭くなるため精度の高い電圧計が必要となります。
大きなシャント抵抗(10Ω)を利用する場面
一方で、消費電力のわずかな変動を可視化するには、大きな抵抗値のシャント抵抗が適しています。微小な電流の変化を、広い振幅の電圧変化に変換できるため、消費電力の遷移を簡単に可視化できます。また、RCローパスフィルタ(後述)の時定数も大きくできることからノイズの除去にも高い効果を発揮します。
ローパスフィルタにより電源ノイズを除去する
USB電源など、他の回路に隣接していてノイズ(スパイク状の電流変動)が発生しやすい電力源を解析する場合、ノイズの除去が不可欠です。今回の計測では、直列シャント抵抗と電解コンデンサより構築したRCローパスフィルタで高周波成分を除去。電力解析に不可欠な本質的な消費電力の推移を計測します。
SPRESENSEと他のプラットフォームの消費電力
それでは、電力解析をはじめましょう。
まず、SPRESENSEの消費電力と、他のマルチコア・プラットフォームの消費電力を比較します。比較対象には、クラウドとの接続が簡単なことからIoT分野を中心に人気の高い「Raspberry Pi 3 Model B+(※1)」と、安価にAIを実行できる組み込み向けプラットフォーム「Jetson Nano(※2)」を選択しました。
※1:SPRESENSEが、LTEをはじめとするネットワーク通信機能を提供しているため、選択。
※2:SPRESENSEがDNNRTとしてDeep-Neural-Networkのモデルを実行できる機能を備えているため、選択。
USBの給電ラインに0.025Ωのシャント抵抗を直接接続し、定常状態における電流の最大値を計測した結果を図3に示します。Cortex-AシリーズのマルチコアCPUを搭載したのRaspberry Pi 3とJetson Nanoと、Cortex-MシリーズのマルチコアCPUから構成されたSPRESENSEを比較すると、SPRESENSEはわずか\(\tfrac{1}{30} \)の電力で駆動できることがわかります。
SPRESENSEのメインコアに加えて、1個のサブコアを起動し合計2コア構成とした場合でも必要とされる最大電流はわずか0.612mAです。そのためSPRESENSEは、電源ケーブルの敷設が困難な場所にバッテリーを電源として配置することや、排熱の難しい狭い空間や密閉空間への設置、持ち運びを前提としたウェアラブルデバイスへの採用が可能です。
消費電力の推移、精密な電力解析
続いて、USBの給電ラインに測定器を接続し、電流の推移を計測、処理中の消費電力を解析した結果を紹介いたします。本計測ではノイズの影響を取り除くため、シャント抵抗10Ωと電解コンデンサ1000uFから構成されたRCローパスフィルタを利用しています。
POR(Power-On-Reset)後の消費電力の推移を解析する
まず、電源投入直後における消費電力の推移を解析した結果を図4に示します。SPRESENSEのmicro-USBコネクタにUSBケーブルを接続すると、SPRESENSEのPower-On-Reset(POR)が開始されます。PORでは、最初にSPRESENSEの核となるLSI(CXD5602/CXD5247)が起動しペリフェラルを初期化。これと並行して、USBの信号線(D+/D-)とCXD5602のUART通信を中継しているUSB-UARTブリッジデバイス(CP2102N-A01-GQFN24R)が起動します。
SPRESENSEのPORが完了し、UART通信の無い状態が一定時間続くと、USB-UARTブリッジは通信状態から超低消費電力となるリセット状態へと遷移します(図5、スタートアップのプログラムにNuttShellを選択した場合の例)。これによりSPRESENSEの核となるLSI(CXD5602/CXD5247)の消費電力を推定することができます。
USB-UARTの消費電力は、製品化されたエッジには不要な電力
SPRESENSE Main BoardにはUSB-UARTブリッジとしてSilicon LabsのCP2102N-A01-GQFN24Rが搭載されています。エッジを開発している最中は、NuttShellでの操作をはじめ、デバッグ出力の表示などにUSB-UARTブリッジを利用しますが、開発が完了し製品化されたエッジがUSB-UARTブリッジを使うことはほぼありません。そのため、以降はUSB-UARTブリッジの消費する電力量(7.5mA相当)を除外し消費電力を考察します。
Silicon Labs|USB-UARTブリッジ(CP2102N-A01-GQFN24R)
さらに不要なデバイスを除去する
SPRESENSEは、極限まで素子を除去、停止させることによりuAオーダーまで、電力を低減することができます。上記では最も大きな影響を及ぼすUSB-UARTブリッジを対象として話を進めてきましたが、給電中に常時点灯するPower LED(Blue)
などを取り除することにより消費電力をさらに削減可能です(図6)。
Deep-Sleep時の消費電力を6μAまで削減する方法
ここでは、SPRESENSE Main Boardのハードウェアに手を加え、Deep-Sleep時(後述)の消費電力を6μAまで削減する方法を紹介いたします(※3)。本手順は「How to achieve 6µA current consumption on Mainboard|SPRESENSE Hardware Documents(英語版)」に詳細が掲載されています。「動作確認用の素子」「電気にデバイスを保護する素子」「USB給電を可能にするための回路(※4)」を除去し、消費電力を削減します。
- POWER_LED(図6)を接続する抵抗 R11を除去します。
- 電力供給を保護するダイオード D1を除去します。
- 電気的な保護を担うロードスイッチIC IC8(TCK112G)を除去します。
- ロードスイッチ除去後のA1、A2、B1、B2端子をショートします。
- SPRESENSE Main Board外部からのリセット信号(XRS_PWON)を受ける抵抗 R28を除去します。
- UARTの制御信号(UART_DTR)ピンに接続されているコンデンサ C76を除去します。
※3:SPRESENSE Main Board上の部品の除去や配線変更を行った場合、SPRESENSEはメーカー保証対象外となります。ご注意ください。
※4:変更後のSPRESENSE Main Boardはバッテリー用端子からの給電が必要となります。
電源ドメイン
続いて、SPRESENSEが提供する自動給電制御機能について紹介いたします。この機能は、利用していないハードウェアや電源ドメインへの給電を遮断し、消費電力を低減できる機能です(図2)。
活性化状態のCPUとメモリタイルのみに電力が供給される
図8は、メインコア上でNuttShellが実行されている状態から、コマンドアプリケーションを起動し、SPRESENSE SDKが自動生成したASMPワーカーのプログラムを1個のサブコアが実行、ASMPワーカーの処理が完了するまでの消費電流の推移です。
前述の通りNuttShellを操作している間はUSB-UARTブリッジが115200bpsの通信を中継するため、7.5mAがUSB-UARTブリッジにより消費されます。そのため、メインコアとその周辺のハードウェアの消費電力は8.0mA×5V、サブコア1個の消費電力は2.5mA×5V(10.5mA-8.0mA)となります。サブコアは合計5個搭載されていますが(合計消費電力:2.5mA×5V×5個)、CPUコアへの給電を自動的に遮断する機能により電力が浪費されることはありません。
非活性状態のドメインの消費電力を抑える
次に、利用されていない電源ドメインへの給電を自動的に遮断する機能の効果を紹介いたします。図9は、GNSSを使用していない状態(図8相当)と、GNSSにより位置情報を収集している状態の消費電力を比較したグラフです。GNSSドメインは位置情報・時刻情報の取得と算出を担当するハードウェアです。このグラフよりGNSSドメインの消費電力は9.5mAx5Vであることがわかります。
必要なタイミング(一定時間周期あるいはイベント契機)のみでGNSSを利用するようにプログラミングすることにより、GNSSを利用するアプリケーションであっても、ほとんどの時間において9.5mAx5Vの電力を低減することができます。
Cold-SleepとDeep-Sleep
スリープ機能は、エッジの消費電力を抑える方法の中で、最も効果的な機能です。SPRESENSEはスリープ機能として、汎用コンピュータのハイバネーションに相当する「Cold-Sleep」機能と、電源のON/OFFに相当する「Deep-Sleep」機能を提供しています。
Cold-Sleep
Cold-Sleepは、システムの状態を維持したまま消費電力を低減できる機能です(図10)。メインメモリの内容をSPIフラッシュメモリ(不揮発性ストレージ、SPRESENSE Main Board背面に搭載済)へバックアップした後、CPUとメモリへの給電を停止。トリガーイベントの発生後、SPIフラッシュメモリからメモリへ情報をリストアし、Cold-Sleep前の状態に復帰させます。今回はトリガーイベントの注入にRTC Clockを使用しました。
Cold-Sleepへ突入した/Cold-Sleepからの復帰した際の消費電力の遷移を図11に示します。
NuttShell (NSH) NuttX-7.22 nsh> alarm 10 # 10秒後にイベントを発生させる nsh> poweroff --cold # この間CPUはCold-Sleep状態 # alarmイベントが発生すると復帰する NuttShell (NSH) NuttX-7.22 nsh>
製品化時に不要となるUSB-UARTブリッジの電力を除くと、Cold-Sleep機能により消費電力をわずか2.5mAx5Vまで抑えることができます。定常時(8.5mAx5V)と比較して、わずか約30%の電力で各種イベントの発生を待つことができます。なお、Cold-Sleep状態への遷移時はメモリの情報をSPIフラッシュメモリへバックアップすることから、コマンド実行直後に消費電力量が一時的に増加します(スパイク状になる)。
SPRESENSE SDKチュートリアル|省電力機能と組み合わせて使用する
Deep-Sleep
Deep-Sleepは、汎用コンピュータのシャットダウン動作に相当します(NuttShellもshutdown
という名前で状態遷移用のコマンドを提供しています)。Deep-Sleepからの復帰した後は、メモリ上のデータは消失し、POR直後に近い状態となります。Deep-Sleepへ突入した/Deep-Sleepからの復帰した際の消費電力の遷移を図12に示します(トリガーイベントの注入にはRTC Clockを使用)。
製品化時に不要となるUSB-UARTブリッジの電力を除くと、Cold-Sleep機能により消費電力をわずか2.5mAx5Vまで抑えることができます。また、メモリデータのバックアップ(SPIフラッシュメモリへの書き込み)処理が無いため、Cold-Sleepのようなスパイク状の電力消費も発生しません。
NuttShell (NSH) NuttX-7.22 nsh> alarm 10 # 10秒後にイベントを発生させる nsh> shutdown # この間CPUはDeep-Sleep状態 # alarmイベントが発生すると復帰する NuttShell (NSH) NuttX-7.22 nsh>
CPUシステムクロックの制御
最後に、クロックを制御し消費電力を削減する方法を紹介いたします。SPRESENSEに搭載されている「CPUシステムクロック」は、CPUや、SoC内蔵のペリフェラルブロック(GNSSやSCUなど)の動作タイミングの基準となる発振器です。SPRESENSEのCPUシステムクロックは3種類のモードを備えることにより(下表)、高い動作周波数による高速処理はもちろん、低い動作周波数による積極的な低消費電力化を実現します。
Mode | CPU Clock | Core Volatge | 用途 |
HV (High Voltage) モード | PLL 156MHz | 1.0V | USB通信機能、SDカード制御機能、Audio機能に必須 |
LV (Low Voltage) モード | PLL 32MHz | 0.7V | GNSS機能、Camera機能に必須 |
RCOSC モード | RCOSC 約8MHz | 0.7V |
動的周波数設定の有効化
CPUシステムクロックはNuttXにより管理されています。NuttXのコンフィグレーション(カーネルのコンフィグレーション)で「Dynamic clock control」を有効にすると、NuttXが実行状態を監視、動作周波数が低くても問題ないと判断したタイミングで、動作周波数を、自動的に最も低消費電力であるRCOSCモード(約8MHz)へと切り替ります。
一定の動作周波数を維持したい場合は、NuttXのAPI、up_pm_acquire_freqlock(&lock);
を「lock.flag = PM_CPUFREQLOCK_FLAG_HV;
」や「lock.flag = PM_CPUFREQLOCK_FLAG_LV;
」を引数として呼び出すことにより、動作周波数をHVモードあるいはLVモードにロックできます。動作周波数のロックはup_pm_release_freqlock(&lock);
により開放できます。
Deep-Sleepとの組み合わせにより待機時の超低消費電力化を達成可能
前述したDeep-Sleep状態の間も、周辺回路(ペリフェラル)からの起床イベントを検出するため、CPUシステムクロックは動き続けています。また、SPRESENSE Main Boardには、「TCXO」と呼ばれるGNSS等の一部の機能に必要な外部発信器が搭載され、通常は発振し続けています。
外部からの起床イベントを受けて復帰するまでのDeep-Sleep中は、CPUをはじめ、多くのハードウェアブロックは停止しています。そのため、CPUシステムクロックが高速である必要はなく、ボード上の外部クロックも不要です。そこで、Deep-Sleepへ遷移する前に「CPUクロックをRCOSCモードに変更(HVモード、LVモードのロックを解除)」し「TCXOを切断(board_xtal_power_control(false)
)」の設定を行うことにより、Deep-Sleep中の消費電力を大きく削減することができます。
効果は、下記URLをご参照ください。
クロックモードについて|SPRESENSE Arduino 開発ガイド
まとめ
今回紹介した内容から、省電力化に寄与するハードウェア機能を搭載したデバイスを選択することにより「マルチコア・アーキテクチャであっても、低消費電力のシステムを構築できる」ことを確信できたかと思います。
消費電力の計測データと、電力低減機能の動作、自身が求めるシステムの特性を把握し、高速・多機能・低消費電力なシステムの設計・構築にご活用ください。
計測内容 | 消費電力(概算) |
定常状態 | 8.0mAx5V = 40mW |
1個のサブコアを使用 | (8.0mA+2.5mA)x5V = 52.5mW |
全サブコアを使用 | (8.0mA+2.5mA×5個)x5V = 102.5mW |
スリープ状態(RTC on) | 2.5mAx5V = 12.5mW |
Raspberry Pi 3の待機電力(参考) | 530.24mAx5V = 2651.2mW |
SONY SPRESENSE
SPRESENSEは、Arm Cortex-M4コア(FPU機能搭載)を6コア搭載したシングルボードコンピュータです。マルチコアによる豊富な演算能力をはじめ、魅力的なペリフェラルを多数搭載しながら、電池のみでも駆動できる超低消費電力な製品です。本格的なエッジコンピューティングを是非ご体験ください。システムの試作はもちろん、PoC、製品化にもご活用いただけます。
開発者向けサイトを見る Switch-Scienceで購入する
APS学習ボード(SPRESENSE™ Extension Board用)
APS学習ボード(SPRESENSE™ Extension Board用)は、初心者講座の内容をはじめ、SPRESENSE SDKの提供するオーディオ入力機能やLCDドライバをはじめとする各種機能を、回路設計をすることなく簡単にお試しいただけるよう開発したAPSオリジナルの評価基板です。Web記事と併せてお楽しみください。
取扱説明書|APS学習ボード Switch-Scienceで購入する(ボード単体)
Switch-Scienceで購入する(部品キット)
こちらも是非
“もっと見る” マルチコア|SPRESENSE編
SPRESENSE×Neural Network Console:第4回|推論モデルを最適化し、エッジAIによるオリジナルの音声識別システムを構築する
今回の初心者講座では、SPRESENSEの「ハイレゾオーディオ入力」と「DNNRT機能」により「Neural Network Console」で生成したディープニューラルネットワーク(DNN)の推論モデルを統合。エッジ単体で完結するオリジナルの音声識別システムを構築する技法を解説いたします。
SPRESENSE×Neural Network Console:第3回|オーディオ解析に必要な学習用データを採取し、PC上で学習・推論を実行する
今回の初心者講座では、SPRESENSEに搭載されたハイレゾオーディオ入力を活用し、環境音を録音し、ディープニューラルネットワークによる音声分類に不可欠な学習用データと検証用データを生成する方法について解説します。また、PC上で動作するNeural Network Consoleによって生成した推論モデルをエッジ・デバイスへ統合するために解決すべき課題を紹介します。
SPRESENSE×Neural Network Console:第2回|異常検知に活用できるニューラルネットワークで波形の扱い方を学ぶ
SPRESENSEのDNNRT機能が扱うことのできるデータは画像だけでなく、産業分野を中心に人気が高まっている「異常検知・故障予知」に活用できる加速度センサーや大気圧センサーなどから収集した波形データも解析することができます。さらにSPRESENSEに内蔵されたハイレゾオーディオ録音機能も周辺環境を可聴域の波形データとして記録することができる優れたセンサーとして利用可能です。そこで、今回の初心者講座では、まず簡単な波形データの解析方法を例に、DNNRT機能から波形データを扱うシステムの構築方法について解説。DNNRT機能を活用した製品開発に必要となる技術を紹介いたします。