Raspberry Pi Picoをバッテリーで動作させる環境を作成してみました。本体OFFのスタンバイ状態から通常動作、DeepSleep、シャットダウン、充電ステートを含めた簡易的ではありますが統合的なパワーマネージメントを、一般的に入手可能な部品のみを使った外部追加回路との組み合わせで実装してみました。
Raspberry Pi Pico バッテリー動作環境 |
Raspberry Pi Picoのバッテリー動作関連機能
バッテリー動作環境構築の説明の前に、Raspberry Pi Picoには通常のマイコンボードには標準装備されてないようなバッテリー動作を支援する機能が搭載されているのでこれらについて説明します。バッテリー動作環境を構築するために、これらの機能をフル活用します。ステップアップ、ダウン両対応のDC/DCコンバータ
RICHTEK社 RT6150B-33GQW |
一般的なマイコンボードにはUSB 5Vからのステップダウンで3.3Vを生成するDC/DCコンバーター、あるいは単なるLDOが搭載されていることが多いです。しかし、Li-poバッテリーの使用を想定した場合、標準電圧は3.7Vで、満充電時4.2Vから過放電手前の電圧2.9V程度の範囲の電圧が供給される可能性があり、3.3Vを生成するには、ステップアップ、ダウン両対応のDC/DCコンバータが必要です。Raspberry Pi PicoにはRICHTEK社のRT6150B-33GQWが搭載されており、入力電圧として1.8V~5.5Vがサポートされています。また800mAまでの電流出力をサポートしているので、Raspberry Pi Pico本体のみならず、周辺回路にもこのDC/DCコンバータから供給することが可能です。またこのDC/DCコンバータとの連携として以下の機能もRaspberry Pi Picoボードでサポートされており、バッテリー動作時に非常に役立ちます。
- Raspberry Pi Picoボードの37ピン 3V3_ENによるDC/DCのEN (動作/停止) 制御
DC/DCのEN制御 |
DC/DCのEN制御に関しては3V3_ENピン未接続時はプルアップによりDC/DCが常時イネーブルとなります。
- GPIO23によるDC/DCのPS (動作モード) 設定
DC/DCのPS設定 |
PS設定に関してはPS = 0にて効率優先モード (PFM Mode)、PS = 1にてリップル低減モード (PWM Mode: 低負荷時に効率悪化)となり、デフォルトではPS = 0です。
USB電源の接続検出
USB電源接続検出 |
GPIO24をGPIO入力として使用することで、High検出 = USB電源接続、Low検出 = USB電源未接続が検出できます。
バッテリーチャージャーとの接続サポート
バッテリーチャージャー接続 |
pico-datasheet.pdfのUsing a Battery Chargerセクションを参照するとバッテリーチャージャーとの接続例が示されています。この回路の通りにP-ch MOSFETを接続すれば、USB電源未接続時はバッテリー電源を使用し、USB電源接続時はバッテリーを充電しながらDC/DCコンバータ側にはUSB電源が供給されるようにすることができます。上記図内で赤色で示された部分はRaspberry Pi Picoボードに未実装なので回路の追加が必要です。この部分はP-ch MOSFETを通常のハイサイドスイッチの使用法とは少し異なった使い方をしており勉強になるので後ほど回路図のところで別途コメントします。
電源電圧検出
VSYS電圧検出 |
GPIO29_ADC3をADC3入力として使用することで電源電圧が検出できます。VSYS端子の電圧をADCにて計測することができますので、上記のバッテリーチャージャーを接続した状態ではUSB電源の電圧、バッテリー動作時にはバッテリーの電圧が計測されます。この電圧測定により例えば4.3V以上ならUSB電源接続、4.3V未満ならバッテリー動作を認識するというようなこともできそうですが、判断電圧基準値は別途吟味が必要なので、上記のGPIO24を用いた検出が簡単で確実そうです。ADC3入力はVSYSからの200Kohmと100Kohmの分圧により定常的な分圧電圧を測定するようになっているので、(1) 微小ではあるが定常的な電流消費がある(15uA以下)、(2) ADCへの出力インピーダンスが高く測定誤差の原因になりうる、の2つの問題点があり、より正確かつ定常的な電流消費をしない方法としてはアクティブな回路を構成して必要なタイミングでのみ計測する方法もありますが、おおよその電圧を測定するにはRaspberry Pi Picoボードの実装方法で充分であるとも言えると思います。
DeepSleep機能
SDK側では、DeepSleep状態に該当するdormant状態への遷移がpico-extrasのpico_sleepにて準備されています。RP2040自体の電源はONを維持した状態で消費電力を極力抑える方法として有効です。CPU自体は休止状態となりますが、GPIOの状態は保持されます。dormant状態からの復帰にはGPIOピンによるレベル検出 (High/Low) またはエッジ検出 (立ち上がり/立ち下り) の指定が可能です。SDKではdormant状態への移行とwake upの条件設定はサポートされていますが、dormant状態に入る前の動作状態(例:クロック設定、PWM使用、タイマー等の割込みの設定)の復元については別途に自前の手続きをする必要があります。パワーマネージメントの全体構成
機能要件
今回製作したバッテリー動作環境の機能要件については以下を考えました。- DC/DCがOFFの待機状態を設けること(スタンバイ状態)
- 1つまたは2つのスイッチを使ってをPowerステートをコントロールできること
- RP2040のdormant状態を活用したDeepSleepステートへの移行、復帰ができること
- 完全にプログラム制御下でDeepSleepステートまたはスタンバイ状態への移行を行うこと
- DeepSleepステートではDC/DCがON状態になるが、その他の周辺デバイスへの電源はOFFにできること
- バッテリーの電圧監視を行い、しきい値電圧を下回った場合はスタンバイ状態に移行すること
- USB電源接続時はDC/DC ONを維持すること(プログラム書き換え時のため)
- サンプルとしての確認用のためOLEDディスプレイにて動作状態を表示
Powerステート遷移
簡易的なパワーマネージメントを実現するために以下のPowerステートを準備します。ステート間の遷移はサンプルプログラム上で実装されたものを記載していますが、遷移条件を変更することで異なる運用の仕方への対応も可能です。Powerステート遷移図 |
Stand-by状態
- Raspberry Pi Picoボード上のDC/DCコンバータがOFFの状態で電力消費の非常に小さい状態
- RP2040および周辺デバイスへの電源供給OFF
- Powerスイッチ長押しでNormalステートに遷移
- USBを接続した場合はChargeステートに遷移
Normalステート
- このプロジェクトでは通常動作状態を示すためにRaspberry Pi Picoボード上を点滅させる
- Userスイッチを押すことで周辺デバイスへの電源供給をトグル (OLED ON/OFF)
- USBパワーによる動作かバッテリーによる動作かを判別可能 (OLEDに表示)
- Userスイッチの長押しでDeepSleepステートに遷移
- Powerスイッチの長押しまたはバッテリーの低電圧検出でShutdownステートに遷移
DeepSleepステート
- pico-extrasのpico_sleepでサポートされているdormantモードを活用
- 周辺デバイスへの電源供給を停止することでDeepSleepステートでの消費電力を最小化する
- Powerスイッチを押すことでNormalステートに復帰
Shutdownステート
- OLEDにShutdownステートであることを表示し3秒後にChargeステートに遷移
Chargeステート
- USBから電源供給されている場合、OLEDにChargeステートであることを表示し3秒後にdormantモードに入る
- USBから電源供給されていない場合、またはUSBからの電源供給が停止した場合に、H/W的にStand-by状態に入る
- Powerスイッチを押すことでNormalステートに遷移
- プログラム書き換えはこのステート上で実施される
外部追加回路
バッテリー動作環境を機能させるための外部追加回路を提示します。SMD部品を使用した最適化回路と、ブレッドボード上での確認のためできるだけSMD部品を使用しない回路の2つを用意しました。SMD部品を使用した最適化回路 |
ブレッドボードテスト用回路 |
サンプルプログラム
Githubにサンプルのプログラムを置いておきました。https://github.com/elehobica/pico_battery_op
今回は一旦ここまでで終了して次回は外部追加回路とサンプルプログラムの内容について説明します。
Raspberry Pi Picoのバッテリー動作環境 その2
Raspberry Pi Picoのバッテリー動作環境 その2
0 件のコメント:
コメントを投稿