SPI通信でADコンバータの値を読み込む (Raspberry Pi, MAX1118)



ADコンバータを使ってRaspberry Pi(以下ラズパイ)でSPIでの通信接続を試してみる。

ADコンバータは秋月電子で購入できるMAX1118を使用した。
MAX1118 は、2チャネル、シリアル8ビットのADコンバータで、SPI通信でデータのやり取りを行う。
SPI通信は不慣れなのでここでしっかり覚えてみたいと思う。

またラズパイは、Raspberry Pi zeroを使用した。





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)

5番のリファレンス入力は+1V〜Vddの範囲の電源に接続する。



ラズパイでSPIを使えるようにする


$ sudo raspi-config を実行してSPIの設定を変更していく。

5番のInterfacing Optionsを選択。


P4のSPIを選択。


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


これでSPI通信が使えるようになった。

次に、PythonのSPIモジュールを入れておく。
Python 2.x系なら $ sudo pip install spidev で、Python 3.x系なら $ sudo pip3 install spidev でインストールする。

必要ではないかもしれないが、ここまでで一応リブートしておこう。
$ sudo reboot



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


データシートを確認すると、MAX1118 では、CNVST に送る信号によって CH0CH1 が切り替わる仕組みになっている。
そしてDoutからは、8bit分のアナログ電圧のデータを取り出すことができる。

CHO のフロー


CH1 のフロー

MAX1118データシートより



Pythonで動作確認


動作確認として、乾電池一本と抵抗で分圧した回路を、CH0CH1 を使って電圧を読み取ってみよう。ただし、GNDはRaspberry Piと共通にすること。





以下が、動作確認で作ったPythonのプログラムだ。



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


実行結果はこちら。テスターで測った電圧と1/100以上の精度で一致していた。



ところで、ADコンバータとフォトトランジスタの電子部品300円のために、
ざわざ往復3時間をかけて自転車で秋月電子まで買い物に行った。
これはこれでなかなか楽しいものだ。


スカイツリーも近くで見ると迫力があるなぁ、などと思いながら。





参考


校正が簡単な照度計
RaspberryPiで照度計をつくろう
MAX1118データシート
ラズパイでSPI通信を行う
SPIの基本を学ぶ
ラズパイでアナログ電圧を扱う (5) MCP3208のプログラム①


あなたにおすすめ