19.SPIインターフェース (2020.8.18-2021.7.18)

SPIインターフェースはシリアル通信インターフェースの1つで、少ないピン数でデバイス間データ通信を実現します。次章で紹介するIIC(I2C)もSPIと同様の通信方式なので、順次説明したいと思います。まずはSPIインターフェースですが、こちらは信号線に3~4線を用いて、クロック信号に同期したデータ通信を行います。IICよりも高速通信が可能で、大抵は8ビット単位でデータの送受信が行われます。SPIインターフェースはRaspbianの初期状態では使えないようなので、使えるように設定を変更します。テキストの説明は古いので、こちらのやり方で話を進めたいと思います。もしかすると最初から使える状態になっているかもしれませんので、必要であれば実行して下さい。コマンドラインからSPIを使うツールも標準でインストールされているので、簡単に使い始められます。確認もかねて、LXTerminalを起動して次の手順で変更を行います。Raspbianのバージョンによっては、メニュー構成等が異なるかもしれません。

注)最新のOSではデスクトップメニューの「設定」→「Raspberry Piの設定」と進み、インターフェイスの項目でSPIを含めた機能の有効/無効が簡単に設定できるようになっていることを付け加えておきます。こうした点は改良によってどんどん簡単になっていてありがたいです。「31.自動ミニトマト栽培機(準備編)」では、その方法で設定しているので参考にして下さい。

上記を実行すると下図のようなメニューが表示されるので、5を選択して下さい。

次にSPIを選択します。

機能を有効にするか質問されるので「はい」を選択します。

機能が有効になりました。

LXTerminalからSPIインターフェースが使えるのか確認してみます。下図のような表示がされれば使える状態です。

テキストではA/DコンバーターのMCP3002を題材としています。2チャンネル10bit(1024レベル)のコンバーターで、入力したアナログ電圧をデジタル値に変換して、SPI通信を使ってRasPi側にデータを送ります。手元には同系統の上位デバイスに当たる4チャンネル12bit(4096レベル)のコンバーターMCP3204もあるので、これを使った「31.自動ミニトマト栽培機(準備編)」でも使用方法を紹介しています。ただし、そちらはSPI通信では無く別の方式(低レベル通信)を採用しています。もちろんSPIでも通信できますが、SPIを使えない場合もあることから、参考例として比較してみるのも良いでしょう。

MCP3002は1個150円程度で入手できました。デバイスは販売店によって価格が大きく異なるので、入手先は吟味する必要があります。amazonでもチェックしましたが、これらの部品は送料も含めるとかなり高額になってしまい断念した経緯があります。一方で昨今は特に半導体の偽部品が市場に出回っていたりと、信じられないような状況(メーカーでも偽物をつかまされるケースが実際に起きている)も耳にするので注意が必要です。MCP3002は2チャンネルあってコンパクトなので、使い勝手が良く色々と使い道がありそうです。SPI通信を行う際、RasPi側がマスターでMCP3002側がスレーブとなります。ピンアサインは下図を参照して下さい。

接続は次の通りです。
VDD/VREF → 3.3V
VSS → GND
_CS/SHDN → 24ピン(SPI_CE0_N)
CLK → 23ピン(SPIO_CLK)
DOUT → 21ピン(SPIO_MISO)
DIN → 19ピン(SPIO_MOSI)

CH0の電圧変化を読み取って表示するプログラムです。SPI通信を使用するため、必要なモジュールをインポートしています。

spi.open(0, 0)は、CE0(24番ピン)に接続したデバイスとの通信です。CE1(26番ピン)に接続したデバイスと通信する場合はspi.open(0, 1)と記述します。MCP3002のCH0を使用する場合はspi.xfer2([0x68, 0x00])、CH1を使用する場合はspi.xfer2([0x78, 0x00])とします。このプログラムは同じシリーズのMCP3004(4チャンネル)/3008(8チャンネル)でも同様に使うことができます。必要なチャンネル数に応じて使い分ければ良いと思います。