はじめに
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に接続されている。
- デフォルトではhigh
なるほど?つまり、電圧を取得した後、通信モジュールを有効にすればいいわけね?
→電圧取得できない!!!
原因
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.3
が0~65535
として得られる。
つまり、電圧に変換するには、65535で割って3.3を掛ける。
ADC3には、VSYSの1/3が掛かるようになっているため、ADC3の値にさらに3を掛ければ、VSYSの電圧になる。
(VSYSには、3.3v以上掛けても良いため、こんな感じに分割されている?)
あと、若干電圧降下してる気がする。それとも測定誤差かもしれない。
-
ユーザがいろいろ接続できるのは3つで、残りの1つは内臓の温度計につながっている。 ↩