Site cover image

Site icon image電子工作 ~ 50歳の手習い

本職はソフトウェアエンジニア。最近組み込みの仕事がよくあるので勉強がてら楽しんでます。

MicroPython で Raspberry Pi PicoのRP2040内蔵温度センサーから温度を取得

こんにちは「MAKO」と言います。

今回は、MicroPython で Raspberry Pi PicoのRP2040内蔵温度センサーから温度を取得する方法について書いてみます。

ただし、Raspberry Pi Picoの内蔵温度センサーは搭載されたマイコンチップ RP2040の内部にあるためマイコンチップの温度の影響を受けるため、室温とは結構誤差が出ます。

温度測定を行いたい場合は、外付けで温度センサーを接続して測定することをお勧めします。

それではコードを書いてみます。

from machine import ADC
import time

# 内蔵温度センサーのADCチャンネル
TEMP_SENSOR_CHANNEL = 4

# 温度センサーのADC値を温度に変換する関数
def convert_to_temperature(adc_value):
    # 温度を計算する式はRP2040のデータシートから取得します
    conversion_factor = 3.3 / (65535)
    voltage = adc_value * conversion_factor
    temperature_celsius = 27 - (voltage - 0.706) / 0.001721
    return temperature_celsius

# ADCオブジェクトの作成
adc = ADC(TEMP_SENSOR_CHANNEL)

# メインループ
while True:
    # ADCから温度センサーの値を読み取る
    sensor_value = adc.read_u16()
    
    # 温度に変換
    temperature = convert_to_temperature(sensor_value)
    
    # 温度を出力
    print("Temperature: {:.2f} °C".format(temperature))
    
    # 1秒待つ
    time.sleep(1)

RP2040 には電圧出力の温度センサーが内蔵されていて4つ目の ADC(アナログデジタルコンバータ)から電圧を取得して計算することになります。

計算式については、マイコンチップRP2040の以下のリンクのデータシートのPDFの
https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf

4.9.5. Temperature Sensor
をもとに作成しています。

temperature_celsius = 27 - (voltage - 0.706) / 0.001721

上記の voltage の値を計算する際に ADCから取得した値に対し

conversion_factor = 3.3 / (65535)

を乗算している理由ですが、

ADCの値は0から65535の範囲でこの値はADCのビット数に依存しますが、RP2040のADCは通常16ビットとなってます。

また、RP2040のADCのリファレンス電圧は通常3.3Vであり、それを踏まえて以下の計算式から電圧が決定されるためです。

電圧=ADCADCの最大値×リファレンス電圧=ADC2ビット数1×リファレンス電圧=adc_value2161×3.3=adc_value65535×3.3電圧 = \frac{ADC値}{ADCの最大値} \times リファレンス電圧 = \frac{ADC値}{ 2 ^ {ビット数} - 1} \times リファレンス電圧 = \frac{adc\_value}{2^{16} - 1} \times 3.3 = \frac{adc\_value}{65535} \times 3.3

はい、では、実際にプログラムを動かした結果です。。。。

Temperature: 27.98 °C
Temperature: 27.98 °C
Temperature: 27.98 °C
Temperature: 27.98 °C
Temperature: 28.45 °C
Temperature: 27.98 °C
Temperature: 27.98 °C

その時の室温は以下の画像の通り、、、思いっきりずれてますね(+_+)

Image in a image block