LoginSignup
7
5
お題は不問!Qiita Engineer Festa 2023で記事投稿!

Raspberry Pi Pico Wで、ADC3を使った電源電圧を取得する

Last updated at Posted at 2023-07-04

はじめに

Raspberry Pi Pico Wを電池で使うにあたって、電源電圧を監視できるといいなと思った。

Pico/Pico Wは5つのADCを持っていて、そのうち1つ(ADC3)がVSYSにつながっている。1
つまり、なにも追加しなくても、そのまま電源電圧が測定できる!はず!

しかし、全然取得できなかった。LEDのせい。

(環境はMicroPythonです。)

取得できなかった状況

起動したら、電源電圧を測定して、WiFiでレポートする装置を作りたかった。

  • Pico WのADC3の線は、(Picoと違い、)2つの役割を持っている。
    • 1つは目当ての電圧測定(ADC3)
    • もう1つは、通信モジュールのクロック(GPIO29)
  • これの切り替えは、GPIO25で行う。(highにしたら電圧測定モードになる)
    • デフォルトではhigh
      • 通信モジュールを有効化すると、lowになる。
    • つまり、通信モジュールの使用を開始したら、電圧測定できない。
    • Picoでは、GPIO25は基盤のLEDに接続されていた。
      • Pico Wでは、基盤のLEDは、通信モジュールのGPIOに接続されている。

なるほど?つまり、電圧を取得した後、通信モジュールを有効にすればいいわけね?
→電圧取得できない!!!

原因

LEDのせい。

Pico Wでは、基盤のLEDは、通信モジュールのGPIOに接続されている。

Pico Wで基盤のLEDを使うには、こうやる。

led = Pin("LED", Pin.OUT, value=0)

使うGPIO(LED含む)を、全部コードの最初の方で初期化した。
Pico Wでは、基盤のLEDは、通信モジュールのGPIOに接続されている。
LEDの初期化をした時点で、通信モジュールが有効化され、電圧計測できなくなる。

解決

まず最初に、電源電圧を取得するためのgpioのみ初期化して、電源電圧を取得する。

Pin(29, Pin.IN)
battery_adc = ADC(3)
battery_volt = battery_adc.read_u16() * 3 * 3.3 / 65535

そのあと、各種初期化する。
電圧取得とLEDの操作は共存できない。

GPIO25がhighになっている必要があるが、デフォルトでhigh

電源電圧を取得するには、GPIO29をINにする必要がある。
GPIO29とADC3はおなじところなので、↓これでもいい。(この方がかんたん)

battery_adc = ADC(Pin(29, Pin.IN))

ADCは、掛かる電圧0~3.30~65535として得られる。
つまり、電圧に変換するには、65535で割って3.3を掛ける。

ADC3には、VSYSの1/3が掛かるようになっているため、ADC3の値にさらに3を掛ければ、VSYSの電圧になる。
(VSYSには、3.3v以上掛けても良いため、こんな感じに分割されている?)

あと、若干電圧降下してる気がする。それとも測定誤差かもしれない。

  1. ユーザがいろいろ接続できるのは3つで、残りの1つは内臓の温度計につながっている。

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5