【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 名称 役割
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)

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

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

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データシートご覧ください。

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

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

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の電圧を読み取ってみます。

次は、そのプログラム例です:

# -*- 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の使い方はこちら。

▶︎ 類似した記事を探す #ADコンバータ #アナログセンサー
 

この記事が参考になりましたら
シェアをよろしくお願いします!

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

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

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

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

関連記事