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-05294 | 400円 |
ラズベリーパイ用ブレッドボード接続キット | 秋月 K-08892 | 450円 |
10bit 2ch ADコンバータ MCP3002-I/P | 秋月 I-02584 | 160円 |
精密級高精度温度センサーLM335Z | 秋月 I-11158 | 75円 |
カーボン抵抗 1/4W 1kΩ | 秋月 R-25102 | (100本)100円 |
ブレッドボードジャンパーワイヤセット | 秋月 C-05159 | (60本)220円 |
合計 | | 1,405円 |
☆回路図
☆できあがり
☆テストコード
①spidevを使ってMCP3002に繋いだLM335Zの値を読む。
import spidev import time
SPI_BUS = 0 SPI_DEVICE = 0 SPI_MAX_SPEED = 200000
MCP3002_VREF = 3.3 MCP3002_START = 0b01000000 MCP3002_SGL = 0b00100000 MCP3002_DIFF = 0b00000000 MCP3002_ODD_CH0 = 0b00000000 MCP3002_ODD_CH1 = 0b00010000 MCP3002_MSBF =0b00001000 MCP3002_LSBF =0b00000000
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℃
|