Raspberry Pi 備忘録 / Mbedもあるよ!

Raspberry Pi であれこれやった事の記録

温度センサーを試す

アナログ温度センサーを試す。

アナログな出力を、ADコンバーターを介して、SPIで受け取る。

MCP9700

MCP9700/01 のデータシート曰く、

特徴
小型アナログ温度センサー
使用パッケージ : SC70-5
広い温度測定範囲 : -40°C  ~ +125°C
精度 : ±4°C (max.), 0°C  ~ +70°C
アナログディジタルコンバータ (ADC) に最適 :
- MCP9700: 10.0 mV/°C (typ.)
- MCP9701: 19.5 mV/°C (typ.)
広い動作電圧範囲 : 
- MCP9700: V DD = 2.3V  ~ 5.5V
- MCP9701: V DD = 3.1V  ~ 5.5V
低い動作電流 : 6 μA (typ.)
高負荷容量の負荷ドライブに最適

とのこと。

MCP9700-E/TO データシート 曰く、
f:id:pongsuke:20160108113817j:plain
とのこと。 Bottom View なので、間違えないようにしよう・・・。

MCP3008

10-bit の ADコンバーター
2の10乗 = 1024

MCP3008 データシート曰く、
f:id:pongsuke:20160108115210j:plain f:id:pongsuke:20160108115057j:plain
らしい。

RPI 3.3v を Vdd(16), Vref(15) に接続、
RPI GND を AGND(14),DGND(9)に接続

手元の Raspberry Pi2 では、

GPIP 8 (CE0)
GPIO 9 (MISO) Master Input Slave Output
GPIO 10 (MOSI) Master Output Slave Input
GPIO 11 (SCLK) Serial Clock

と成っているので、

MCP3008 CLK -> Raspberry Pi GPIO 11 (SCLK)
MCP3008 DOUT -> Raspberry Pi GPIO 9 (MISO)
MCP3008 DIN -> Raspberry Pi GPIO 10 (MOSI)
MCP3008 CS/SHDN -> Raspberry Pi GPIP 8 (CE0)

に、配線する。

通電しないから変だと思ったら、
コンバーターが奥まで刺さっていなかった!

サンプルスクリプト

こちらをそのまま使用させていただいた。

qiita.com

#!/usr/bin/env python

import time
import sys
import spidev

spi = spidev.SpiDev()
spi.open(0,0)

def readAdc(channel):
    adc = spi.xfer2([1,(8+channel)<<4,0])
    data = ((adc[1]&3) << 8) + adc[2]
    return data

def convertVolts(data):
    volts = (data * 3.3) / float(1023)
    volts = round(volts,4)
    return volts

def convertTemp(volts):
    temp = (100 * volts) - 50.0
    temp = round(temp,4)
    return temp

if __name__ == '__main__':
    try:
        while True:
            data = readAdc(0)
            print("adc  : {:8} ".format(data))
            volts = convertVolts(data)
            temp = convertTemp(volts)
            print("volts: {:8.2f}".format(volts))
            print("temp : {:8.2f}".format(temp))

            time.sleep(5)
    except KeyboardInterrupt:
        spi.close()
        sys.exit(0)

そして実行すると、

# ./temp.py 
adc  :      248 
volts:     0.80
temp :    30.00
adc  :      249 
volts:     0.80
temp :    30.32

随分暖かく表示される。
実際には 23℃くらいしか無いはず。

校正

データシートに

MCP9700/01は温度が相対変化するような計測の応用に安価なソリューションを提供します。  
+25°Cからの相対温度を計測するときの精度は、0°C から+70°Cの範囲で±1°C (typ.)を実現できます。  
この精度は、システムを+25°Cで校正したときに実現できます

って、書いてある。

そして、センサーの変換関数は

Vout = 係数 * 温度 + V0(ゼロ度の場合のボルト)

MCP9700では、
Vout = 10 * 温度 + 0.5

とある。

係数は、実数だろうから、温度が2度上がれば、2度分の変化が取れるはずだから、
温度を変えて測定して、その Vout と 温度の差が、係数になる?

volts:     0.75
temp :    25.95

volts:     0.81
temp :    31.13

とか出てたので、(0.81 - 0.75) / (31.13 - 25.95) で、係数は 0.0115 と成った。

0.75 = 0.0115 * temp + V0 なのだが、とりあえず、別の室温計を見たら、21.7度だったので、 v0 = 0.0115 * 21.7 - 0.75 = 0.50045 = 500.45mv と出ました。