温度センサーを試す
アナログ温度センサーを試す。
アナログな出力を、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 データシート 曰く、
とのこと。
Bottom View なので、間違えないようにしよう・・・。
MCP3008
10-bit の ADコンバーター。
2の10乗 = 1024
MCP3008 データシート曰く、
らしい。
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)
に、配線する。
通電しないから変だと思ったら、
コンバーターが奥まで刺さっていなかった!
サンプルスクリプト
こちらをそのまま使用させていただいた。
#!/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 と出ました。