ラズパイでADコンバーターMCP3008の使い方/SPI通信

この記事では、8chで10bitの分解能を持つADコンバーターMCP3008をラズパイで使う方法を解説する。なお、MCP3008とはSPI通信でデータをやりとりしていく。

今回は、Raspberry Pi zero WHを使用した。

Raspberry Pi Zero W - ヘッダー ハンダ付け済み - ラズベリー・パイ ゼロ W ワイヤレス
Raspberry Pi Zero W - ヘッダー ハンダ付け済み - ラズベリー・パイ ゼロ W ワイヤレス

Amazon

ラズパイでSPI設定が済んでない方は、こちらの記事を参考に

ラズパイとMCP3008の配線


画像の拡大

MCP3008は8chで10bitの分解能を持つADコンバーターだ。

MCP3008 8チャネル 10ビット A/Dコンバータ(SPI接続)
MCP3008 8チャネル 10ビット A/Dコンバータ(SPI接続)

マイクロチップの10ビットADコンバータです。 ■主な仕様 ・8チャンネル ・16ピンDIP ・2.7V~5.5V動作(VREF=VDD固定) ・SPIインターフェース

Amazon

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)

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

ラズパイではSPIで使われるCS・MOSI・MISO、SCLK、それぞれGPIO8・GPIO10・GPIO9・GPIO11に割り当てられているので注意しよう。

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

MOSIとMISO

MOSIMISO はマスターから信号を送るか、スレーブから信号を受け取るかの違いで、MOSIはマスターアウトスレーブイン、MISOはマスターインスレーブアウトの略である。今回の場合、マスターはラズパイであり、スレーブはADコンバーターのMCP3008となる。ラズパイではSPIで使う端子が決まっているので、それに合わせて配線する。

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

MCP3008 ではコンフィギュレーションビットに送るデータによって、チャネルを選択できるようになっている。下の表はコンフィギュレーションビットの仕様の一部だ。

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


画像の拡大

今回の用途では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の使い方はこちらを参考

この記事で扱った関連製品はこちら

MCP3008 8チャネル 10ビット A/Dコンバータ(SPI接続)
MCP3008 8チャネル 10ビット A/Dコンバータ(SPI接続)

マイクロチップの10ビットADコンバータです。 ■主な仕様 ・8チャンネル ・16ピンDIP ・2.7V~5.5V動作(VREF=VDD固定) ・SPIインターフェース

Amazon
Raspberry Pi Zero W - ヘッダー ハンダ付け済み - ラズベリー・パイ ゼロ W ワイヤレス
Raspberry Pi Zero W - ヘッダー ハンダ付け済み - ラズベリー・パイ ゼロ W ワイヤレス

Amazon
正規代理店商品 Raspberry Pi 4 Model B (8GB) made in UK element14製 技適マーク入
正規代理店商品 Raspberry Pi 4 Model B (8GB) made in UK element14製 技適マーク入

Amazon

Raspberry Piの参考書

Raspberry Pi クックブック 第2版 (Make:PROJECTS)
Raspberry Pi クックブック 第2版 (Make:PROJECTS)

本書は、全世界で多くのユーザーの支持を集めているマイコンボード「Raspberry Pi」を使いこなすためのレシピ集です。ハードウェアの基本、オペレーティングシステムの使い方、ネットワーク接続、Pythonプログラミングの基本を紹介した上デ、実際の作品製作に必要になる、高度なPythonプログラミング、GPIO(汎用入出力)、モーター、センサー、ディスプレイなどの使い方へと解説を進めていきます。

Amazon
写真や図解でよくわかる ラズパイZeroを使い倒す本 Raspberry Pi Zero/Zero W対応
写真や図解でよくわかる ラズパイZeroを使い倒す本 Raspberry Pi Zero/Zero W対応

本書ではRaspberry Pi Zero / Zero Wの概要から必要な周辺機器の説明、OSの導入やセットアップなどといった準備、そしてLinuxに初めて触れる人に向けてLinuxの基礎やシェルの操作などを解説しています。また、準備が整ったら実際に電子部品をRaspberry Pi Zero / Zero Wで制御する方法も解説しました。

KindleAmazon
Raspberry Pi ZeroによるIoT入門- Zero W 対応
Raspberry Pi ZeroによるIoT入門- Zero W 対応

本書は、大人から子供まで、初心者の方でも、ラズパイZeroとラズパイZero WをIoTのデバイスとして使いこなせるようになることを目的とした入門書です。また、ラズパイZeroとラズパイZero WをUSBケーブル1本でパソコンに接続できる便利な「Zero over USB」について、日本で初めて詳しく解説しました。

Amazon

最後まで読んでいただきありがとうございました。

「この記事が参考になったよ」という方は、ぜひ記事をシェアをしていただけるととても嬉しいです。

今後も有益な記事を書くモチベーションにつながりますので、どうかよろしくお願いいたします。↓↓↓↓↓↓↓

あなたにおすすめ