ラズパイでSPI通信できるようにするまで/ADコンバーターMAX1118

この記事では、ラズパイでSPI通信できるようにするまでの設定を紹介する。今回SPI通信でやりとりするのは、ADコンバーターのMAX1118となる。

MAX1118の拡大写真
MAX1118の拡大写真

MAX1118は、2チャネル、シリアル8ビットのADコンバーターだ。ADコンバーターを使えばラズパイからアナログ電圧を自由に読み取れる。SPIの設定はぜんぜん難しくないのでぜひ挑戦してみよう。

ラズパイは、Raspberry Pi zeroを使用するが、他のラズパイでも本記事と同様の方法でSPIの設定はできるはずなのでぜひ参考に。

ラズパイとADコンバーターMAX1118の配線

ADコンバーターMAX1118

MAX1118ピン端子の役割
MAX1118ピン端子の役割

ラズパイとMAX1118の配線は次の表のように接続した。

MAX1118名称役割Pi接続先
1Vdd正電源電圧+5V
2Ch0アナログ電圧入力--
3Ch1アナログ電圧入力--
4GNDグランドGND
5(REF)I.Cリファレンス入力3.3V
6CNVST変換/スタート入力SPIO CS0 (GPIO 8)
7DOUTシリアルデータ出力SPIO MISO (GPIO 9)
8SCLKシリアルクロックSPIO SCLK (GPIO 11)

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

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

リファレンス電圧とは?

ADコンバータで必ずでてくるリファレンス電圧(Vref)とは、ADコンバータにとっての基準電圧である。たとえば、8ビットの分解能を持っているMAX1118では、このリファレンス電圧を基準に256等分してアナログ電圧を読み取ることになる。つまりリファレンス電圧を3.3Vとしたので、3.3/256で計算すると、約0.013Vの精度で電圧が読み取れる訳だ。リファレンス入力がない場合は、リファレンス電圧が内部で決められているので、データシートをよく読んで確認しておこう。

ラズパイでSPIを使えるようにするための設定

それではラズパイでSPIを使えるように設定していこう。$ sudo raspi-config を実行してSPIの設定をしていく。

下の画面で5番のInterfacing Optionsを選択。

ラズパイでSPIを設定
ラズパイでSPIを設定

P4のSPIを選択。

ラズパイでSPIを設定
ラズパイでSPIを設定

「Would you like the SPI interface to be enabled?」をYESにする。

ラズパイでSPIを設定
ラズパイでSPIを設定

以上でSPI通信が使えるようになった。

次に、PythonからSPI通信ができるようにライブラリをインストールしておこう。Python 2.x系なら $ sudo pip install spidev で、Python 3.x系なら $ sudo pip3 install spidev でインストールする。そして、$ sudo rebootでラズパイを再起動しておこう。

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

Amazon

MAX1118のデータ送受信のフォーマット

Pythonプログラムを書く前に、ADコンバーターMAX1118の仕様を確認しておこう。MAX1118のデータシートを確認すると、CNVST に送る信号を変えることよって CH0CH1 のどちらからデータを読むかを選択できるようになっている。また、Dout からはアナログ電圧(8bit)のデータを読み取ることが可能だ。

CHO のフロー:

MAX1118のデータやりとり図
MAX1118のデータやりとり図

CH1 のフロー:

MAX1118のデータやりとり図
MAX1118のデータやりとり図

MAX1118データシートより

難しい話はさておき、実際にPythonでアナログ電圧を読み取ってみよう。手を動かしていくうちに、SPI通信のイメージがつかめるはずだ。

Pythonでアナログ電圧を読み取ってみる

それではPythonでアナログ電圧を読み取ってみる。話を簡単にするため、乾電池一本と抵抗で分圧した回路を用意した。

抵抗で分圧した回路図
抵抗で分圧した回路図

抵抗で分圧された地点をADコンバーターのCH0CH1 に接続して、それぞれの電圧をラズパイで読み取ってみよう。(GNDはRaspberry Piと共通にする。)

ラズパイとmax1118を配線した写真
ラズパイとmax1118を配線した写真

こんな感じで電圧値を読み取るPythonのプログラムを書いてみた。

# -*- coding: utf-8 -*-

import spidev
import time
import RPi.GPIO as GPIO


# MAX1118データシート
# http://akizukidenshi.com/download/ds/maxim/max111x.pdf


Vref = 3.335  # ラズパイの3.3V電源をテスターで実測

GPIO.setmode(GPIO.BCM)
GPIO.setup(8, GPIO.OUT)  # CNVST

spi = spidev.SpiDev()
spi.open(0, 0)  # bus0,cs0
spi.no_cs = True  # CSを使わない
spi.max_speed_hz = 1000000  # 1MHz
spi.bits_per_word = 8


def sendCNVST(CH):
    if CH == 0:
        GPIO.output(8, GPIO.LOW)
        GPIO.output(8, GPIO.HIGH)
        GPIO.output(8, GPIO.LOW)
    elif CH == 1:
        GPIO.output(8, GPIO.LOW)
        GPIO.output(8, GPIO.HIGH)
        GPIO.output(8, GPIO.LOW)
        GPIO.output(8, GPIO.HIGH)
        GPIO.output(8, GPIO.LOW)


def getVolts():
    adc = spi.xfer2([0x00])
    return adc[0] / 255.0 * Vref


try:
    while True:
        sendCNVST(0)
        v0 = getVolts()

        time.sleep(0.1)

        sendCNVST(1)
        v1 = getVolts()

        print("CH0: {:.3f}V".format(v0))
        print("CH1: {:.3f}V".format(v1))

        time.sleep(1.0)

except KeyboardInterrupt:
    spi.close()
    GPIO.cleanup()

spi.xfer2の詳しい解説はこちらを参考に

MAX1118ではCS端子を直接操作したいので、上のプログラムでは spi.no_cs = True のようにCSを使わない設定をしている。こうしないと GPIO.output(8, GPIO.LOW) のように出来なくなるので注意が必要だ。

実際にプログラムを実行した結果がこちら。テスターで測った電圧と1/100以上の精度で一致していた。

MAX1118で電圧値を表示
MAX1118で電圧値を表示

MAX1118を使って音に反応するセンサーを作ってみたので参考に

8ch、10bitADコンバーターMCP3008(SPI通信)の記事も参考に

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

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
写真や図解でよくわかる ラズパイ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

あとがき

今回は、ADコンバーターとフォトトランジスタの電子部品300円のために、往復3時間をかけて自転車で秋月電子まで買い物に行った。電車を使ってしまうと電子部品の買い物の値段より高くついてしまうのでなんだかバカバカしかったからだ。

秋葉原付近を自転車で移動すると、東京観光な感じで楽しかった。

Treckのクロスバイクとスカイツリー
Treckのクロスバイクとスカイツリー

普段は遠くからしか眺めないスカイツリーも、近くで見るとかなり迫力があって驚く。

下から眺めたスカイツリー
下から眺めたスカイツリー

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

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

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

あなたにおすすめ