YAS's VB.NET Tips
 
ラズベリーパイ活用
ラズベリーパイ活用 >> 記事詳細

2019/08/12

MCP3002とLM335Zで温度を測る

| by:YAS
 ADコンバータのMCP3002と,温度センサーのLM335Zで気温を測ってみます。
 spidevとgpiozeroでテストコードを作ってみましたが,どうも2つの値が一致しません。交互に測ってもgpiozeroで計測した方が,生の値で1大きくなる傾向がありました。基準電圧にラズパイの3.3Vを使っていますし,コンデンサーも省略しているので,処理によって微妙に基準電圧がゆらいでいるのかもしれません。
 基準電圧が3.3Vなので,3.3 * 100 - 273.15 = 56.85℃ まで測れます。気温計に使うには十分です。
 また,3.3 * 100 / 1023 ≒ 0.32℃ 刻みの測定になります。LM335Zは非校正時には2℃の誤差があることを考えれば精度は十分ですが,0.1℃刻みで測定したい気もします。0.1℃刻みにするには,3.3 * 100 / 0.1 = 3300 なので,12bit(=4095)のMCP3204あたりを使う必要がありそうです。(パッケージの小さい12bit2chのMCP3202は秋月にもないみたい。)

☆材料
 ブレッドボード BB-801 × 2 秋月 P-05294400円 
 ラズベリーパイ用ブレッドボード接続キット 秋月 K-08892450円 
 10bit 2ch ADコンバータ MCP3002-I/P 秋月 I-02584 160円 
 精密級高精度温度センサーLM335Z 秋月 I-1115875円 
 カーボン抵抗 1/4W 1kΩ 秋月 R-25102 (100本)100円 
 ブレッドボードジャンパーワイヤセット 秋月 C-05159 (60本)220円 
 合計  1,405円 

☆回路図


☆できあがり


☆テストコード
 ①spidevを使ってMCP3002に繋いだLM335Zの値を読む。
import spidev
import time

# spidevの設定
SPI_BUS = 0
SPI_DEVICE = 0
SPI_MAX_SPEED = 200000 # 200kHz

# MCP3002の設定
MCP3002_VREF = 3.3 # 基準電圧
MCP3002_START = 0b01000000 # スタートビット
MCP3002_SGL = 0b00100000 # シングルエンド入力
MCP3002_DIFF = 0b00000000 # 差動入力
MCP3002_ODD_CH0 = 0b00000000 # チャンネル0
MCP3002_ODD_CH1 = 0b00010000 # チャンネル1
MCP3002_MSBF =0b00001000 # MSBファースト
MCP3002_LSBF =0b00000000 # LSBファースト

while True:
    spi_values = []
    spi_values.append(MCP3002_START | MCP3002_SGL | MCP3002_ODD_CH0 | MCP3002_MSBF)
    spi_values.append(0x00)
    spi = spidev.SpiDev()
    spi.open(SPI_BUS, SPI_DEVICE)
    spi.max_speed_hz = SPI_MAX_SPEED
    result = spi.xfer2(spi_values)
    data = int.from_bytes(result, byteorder='big') & 0x3FF
    print ("{0} {1}℃".format(data, data * MCP3002_VREF / 1023 * 100 - 273.15))
    spi.close()
    time.sleep(1)
>>> %Run MCP3002_LM335Z_spidev.py

  934 28.140322580645147℃
  934 28.140322580645147℃
  934 28.140322580645147℃
  934 28.140322580645147℃
  934 28.140322580645147℃
  934 28.140322580645147℃
  934 28.140322580645147℃
②gpiozeroを使ってMCP3002に繋いだLM335Zの値を読む。
  何と簡単!
  でも,raw_valueがspidevを使ったときの値より1大きい気がする。
from gpiozero import MCP3002
import time

ch0 = MCP3002()

while True:
    result = ch0.raw_value
    print("{0} {1}℃".format(result, result * ch0.max_voltage /1023 * 100 - 273.15))
    time.sleep(1)
>>> %Run MCP3002_LM335Z_gpiozero.py

  935 28.462903225806485℃
  935 28.462903225806485℃
  934 28.140322580645147℃
  935 28.462903225806485℃
  935 28.462903225806485℃
  935 28.462903225806485℃
  935 28.462903225806485℃

17:00