ラズパイでADコンバーターMCP3008の使い方/SPI通信
この記事では、8chで10bitの分解能を持つADコンバーターMCP3008をラズパイで使う方法を解説する。なお、MCP3008とはSPI通信でデータをやりとりしていく。
今回は、Raspberry Pi zero WHを使用した。
ラズパイでSPI設定が済んでない方は、こちらの記事を参考に
ラズパイとMCP3008の配線
MCP3008は8chで10bitの分解能を持つADコンバーターだ。
マイクロチップの10ビットADコンバータです。 ■主な仕様 ・8チャンネル ・16ピンDIP ・2.7V~5.5V動作(VREF=VDD固定) ・SPIインターフェース
AmazonMCP3008データシート
MCP3008のピン役割
MCP3008の各ピンの役割は次のようになる。
MCP3008 | 名称 | 役割 |
---|---|---|
1 | CH0 | アナログ電圧入力 |
2 | CH1 | アナログ電圧入力 |
3 | CH2 | アナログ電圧入力 |
4 | CH3 | アナログ電圧入力 |
5 | CH4 | アナログ電圧入力 |
6 | CH5 | アナログ電圧入力 |
7 | CH6 | アナログ電圧入力 |
8 | CH7 | アナログ電圧入力 |
9 | DGND | デジタルGND |
10 | CS/SHDN | チップセレクト/シャットダウン |
11 | Din | シリアルデータIN |
12 | Dout | シリアルデータOUT |
13 | CLK | シリアルクロック |
14 | AGND | アナログGND |
15 | Vref | リファレンス電圧 |
16 | Vdd | 電源電圧 (+2.7〜5.5V) |
Raspberry PiとMCP3008の配線
Raspberry PiとMCP3008を次のように配線した。
MCP3008 | 名称 | ラズパイ物理番号 | ラズパイ名称 |
---|---|---|---|
9 | DGND | 6 | GND |
10 | CS/SHDN | 24 | CS0 (GPIO 8) |
11 | Din | 19 | MOSI (GPIO 10) |
12 | Dout | 21 | MISO (GPIO 9) |
13 | CLK | 23 | SCLK (GPIO 11) |
15 | Vref | 17 | 3.3V |
16 | Vdd | 1 | 3.3V |
ラズパイではSPIで使われるCS・MOSI・MISO、SCLK、それぞれGPIO8・GPIO10・GPIO9・GPIO11に割り当てられているので注意しよう。
MOSIとMISO
MOSI と MISO はマスターから信号を送るか、スレーブから信号を受け取るかの違いで、MOSIはマスターアウトスレーブイン、MISOはマスターインスレーブアウトの略である。今回の場合、マスターはラズパイであり、スレーブはADコンバーターのMCP3008となる。ラズパイではSPIで使う端子が決まっているので、それに合わせて配線する。
チャネルをどうやって切り替えるのか?
MCP3008 ではコンフィギュレーションビットに送るデータによって、チャネルを選択できるようになっている。下の表はコンフィギュレーションビットの仕様の一部だ。
Single/Diff | D2 | D1 | D0 | CH |
---|---|---|---|---|
1 | 0 | 0 | 0 | CH0 |
1 | 0 | 0 | 1 | CH1 |
1 | 0 | 1 | 0 | CH2 |
1 | 0 | 1 | 1 | CH3 |
1 | 1 | 0 | 0 | CH4 |
1 | 1 | 0 | 1 | CH5 |
1 | 1 | 1 | 0 | CH6 |
1 | 1 | 1 | 1 | CH7 |
今回の用途ではSingle/Diffを1に固定しているが、0に設定すると differential となり、チャネル間での差分信号を読み取れるようである。
詳しくはMCP3008データシートを参照
MCP3008で温度センサーTMP36の電圧を読み取る
温度センサーTMP36のアナログ電圧を、MCP3008で読み取って温度を取得できるプログラムを書いてみた。ただしサンプリングレートを明示してあげないと、うまく動かず正しいデータが取り出せないので注意が必要。MCP3008のサンプリングレートはVddが5Vのとき最大で200ksps、2.7Vの時では75kspsまでとなっている。今回Vddは3.3Vなので、サンプリングレートを100kspsに設定した。
# -*- coding:utf-8 -*-
import time
import spidev
Vref = 3.334 # 電圧をテスターで実測する
spi = spidev.SpiDev()
spi.open(0, 0) # bus0,cs0
spi.max_speed_hz = 100000 # 100kHz 必ず指定する
def readAdc(channel):
adc = spi.xfer2([1, (8 + channel) << 4, 200])
data = ((adc[1] & 3) << 8) + adc[2]
return data
def convertVolts(data, vref):
volts = (data * vref) / float(1023)
return volts
def convertTemp(volts):
temp = (volts - 0.75) / 0.01 + 25.0
return temp
if __name__ == '__main__':
try:
while True:
data = readAdc(channel=0)
volts = convertVolts(data, Vref)
temp = convertTemp(volts)
print("CH0 volts: {:.2f}".format(volts))
print("temp : {:.2f}".format(temp))
# data = readAdc(channel=1)
# volts = convertVolts(data, Vref)
# print("CH1 volts: {:.2f}".format(volts))
time.sleep(2)
except KeyboardInterrupt:
spi.close()
プログラムの解説は次の記事を参考に
TMP36の使い方はこちらを参考
この記事で扱った関連製品はこちら
マイクロチップの10ビットADコンバータです。 ■主な仕様 ・8チャンネル ・16ピンDIP ・2.7V~5.5V動作(VREF=VDD固定) ・SPIインターフェース
AmazonRaspberry Piの参考書
本書は、全世界で多くのユーザーの支持を集めているマイコンボード「Raspberry Pi」を使いこなすためのレシピ集です。ハードウェアの基本、オペレーティングシステムの使い方、ネットワーク接続、Pythonプログラミングの基本を紹介した上デ、実際の作品製作に必要になる、高度なPythonプログラミング、GPIO(汎用入出力)、モーター、センサー、ディスプレイなどの使い方へと解説を進めていきます。
Amazon本書は、大人から子供まで、初心者の方でも、ラズパイZeroとラズパイZero WをIoTのデバイスとして使いこなせるようになることを目的とした入門書です。また、ラズパイZeroとラズパイZero WをUSBケーブル1本でパソコンに接続できる便利な「Zero over USB」について、日本で初めて詳しく解説しました。
Amazon最後まで読んでいただきありがとうございました。
「この記事が参考になったよ」という方は、ぜひ記事をシェアをしていただけるととても嬉しいです。
今後も有益な記事を書くモチベーションにつながりますので、どうかよろしくお願いいたします。↓↓↓↓↓↓↓