【Raspberry Pi】ADコンバータMCP3008の使い方【SPI通信】

【Raspberry Pi】ADコンバータMCP3008の使い方【SPI通信】
【Raspberry Pi】ADコンバータMCP3008の使い方【SPI通信】

この記事では、Raspberry Pi(以下ラズパイ)とADコンバータMCP3008を使ってアナログ電圧を読み取る方法をご紹介いたします。 MCP3008は、8chで10bitの分解能を持つADコンバータです。 Raspberry PiとMCP3008のやりとりはSPI通信で行います。

▼ I2C通信のADコンバータADS1115もおすすめ!

つかうもの

はじめに、この記事でつかうものをご紹介いたします。

ラズパイ

Raspberry Piは、Raspberry Pi zero WHを使用しましたが、お好きなRaspberry Piで構いません。

MCP3008

8chで10bitの分解能のADコンバータMCP3008です。

12bit分解能のMCP3208でも同様にお使いいただけます。

アナログセンサ

ADコンバータでアナログ電圧を読み取らせるために、温度センサTMP36を使用しました。

他のアナログセンサでも構いませんし、抵抗を使って分圧して電圧を作ってもらっても構いません。

その他の電子部品

その他、ブレッドボードやジャンプワイヤをお持ちでない方は、揃えておくと便利です。

また、Raspberry Piとブレッドボードを接続するには、オスメスの長めのジャンプワイヤーが必須となります。

MCP3008のピン役割

MCP3008のピン役割を説明します。

MCP3008のピンは次の図のように割り振られてます。

MCP3008のピン役割
MCP3008のピン役割

それぞれのピンの役割は次の表のとおりです。

MCP3008名称役割
1CH0アナログ電圧入力
2CH1アナログ電圧入力
3CH2アナログ電圧入力
4CH3アナログ電圧入力
5CH4アナログ電圧入力
6CH5アナログ電圧入力
7CH6アナログ電圧入力
8CH7アナログ電圧入力
9DGNDデジタルGND
10CS/SHDNチップセレクト/シャットダウン
11DinシリアルデータIN
12DoutシリアルデータOUT
13CLKシリアルクロック
14AGNDアナログGND
15Vrefリファレンス電圧
16Vdd電源電圧 (+2.7〜5.5V)

チャネルをどうやって切り替えるのか?

MCP3008では8チャネルのアナログ電圧を読み取ることができます。コンフィギュレーションビットの信号を変えることで、各チャネルを指定できます。

Single/DiffD2D1D0CH
1000CH0
1001CH1
1010CH2
1011CH3
1100CH4
1101CH5
1110CH6
1111CH7

コンフィギュレーションビット
コンフィギュレーションビット

Single/Diffビットは1に固定しましたが、0に設定すると differential モードとなり、チャネル間での差分信号を読み取ることが可能です。

詳しくはMCP3008データシートご覧ください。 MCP3008データシート - 秋月電子通商

Raspberry PiとMCP3008の配線

Raspberry PiとMCP3008を次のように配線します。

MCP3008名称ラズパイ物理番号ラズパイ名称
9DGND6GND
10CS/SHDN24CS0 (GPIO 8)
11Din19MOSI (GPIO 10)
12Dout21MISO (GPIO 9)
13CLK23SCLK (GPIO 11)
15Vref173.3V
16Vdd13.3V

ブレッドボードとジャンプワイヤを使って次のように接続しました。

Raspberry PiとMCP3008の接続のようす
Raspberry PiとMCP3008の接続のようす

SPIの設定

Raspberry PiでSPIを使うには、初期設定が必要です。こちらの記事を参考に設定してください。

また、Raspberry PiのSPIで使われるCS・MOSI・MISO、SCLKは、それぞれGPIO8・GPIO10・GPIO9・GPIO11にあらかじめ割り当てられてます。ご注意ください。

ラズパイGPIO役割図
ラズパイGPIO役割図

MOSIとMISO

MOSIMISO はマスターから信号を送るか、スレーブから信号を受け取るかの違いです。MOSIはマスターアウトスレーブイン、MISOはマスターインスレーブアウトの略です。今回の場合、マスターはRaspberry Piであり、スレーブはADコンバータのMCP3008になります。

Raspberry PiとMCP3008でアナログ電圧を読み取るプログラム

それでは実際に、Raspberry PiとMCP3008でアナログ電圧を読み取ってみましょう。温度センサTMP36の電圧を読み取ってみます。 次は、そのプログラム例です:

py
# -*- 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()

注意点としまして、サンプリングレートを明示してあげないと、うまく動作せず正しいデータが取り出せませんでした。また、MCP3008のサンプリングレートはVddが5Vのとき最大で200ksps、2.7Vの時では75kspsまでです。今回Vddは3.3Vなので、サンプリングレートを100kspsに設定しました。

spi.xfer2 関数の詳しくはこちら。

▼ 温度センサTMP36の使い方はこちら。

関連記事

 
最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

人気のArduino互換機
Arduinoで人気の周辺パーツ
あると便利な道具
Arduinoのオススメ参考書

▼ Arduino初心者向きの内容です。ほかのArduino書籍と比べて図や説明がとてもていねいで読みやすいです。Arduinoで一通りのセンサーが扱えるようになります。

▼ 外国人が書いた本を翻訳したものです。この手の書籍は、目からうろこな発見をすることが多いです。

▼ Arduinoの入門書を既に読んでいる方で、次のステップを目指したい人向きの本です。C言語のプログラミングの内容が中心です。ESP32だけでなく、ふつうのArduinoにも役立つ内容でした。

関連記事