はじめてのI2C通信【ラズパイ/ADコンバータMCP3425】



この記事ではラズパイを使って、ADコンバータMCP3425とI2C通信するやり方を説明していく。
SPI通信よりI2C通信の方が簡単だったので、初心者の方にはオススメする。
ぜひこの記事を参考にADコンバータなどにも挑戦してみて欲しい。

本記事では、Raspberry Pi zeroを使用するが、他のラズパイでも構わない。
また、ADコンバータは秋月電子のMCP3425を使用する。
» MCP3425(16Bit ADC I2C 基準電圧内蔵)搭載モジュール: 半導体 秋月電子通商-電子部品・ネット通販






I2Cとは?


Inter-Integrated Circuitの略で、フィリップス社が開発した組み込みシステムなどで使われるデータ規格である。
ラズパイ周辺のセンサーモジュールなどは、このI2CかSPI通信でやりとりするのがスタンダードかと思う。

信号線は2本だけで、シリアルデータ (SDA) とシリアルクロック (SCL)で通信を行う。



ラズパイでI2Cを使えるようにする設定


ラズパイでI2Cを使えるようにするにはとても簡単で、i2c-tools というライブラリをインストールすればよい。

$ sudo apt-get update
$ sudo apt-get install i2c-tools


インストールが終わったら、$ sudo raspi-config で設定画面を開きI2Cを有効にしておこう。


  • 1. 設定画面の 5.Interfacing Option へ進む
  • 2. P5 I2C へ進み Yes を選択する


これでI2Cが使えるようになった。



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


ラズパイでI2Cが使える状態になったのでところで、今度はI2Cデバイスをラズパイに接続しよう。
使うデバイスはADコンバーターのMCP3425なので、次のような配線となる。



MCP3425役割ラズパイ接続先ラズパイ物理ピン
1Vin+(センサーへ)--
2VssGND6番
3SCLGPIO35番
4SDAGPIO23番
5Vdd+3.3V1番
6Vin-(センサーへ)--


ラズパイではSCLとSDAのピンがすでに決まっているので、上の表の通り合わせないとうまく動作しないので要注意だ。


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

Amazon



I2Cデバイスが認識されているか確認する


ここまでの設定で、ラズパイとI2Cデバイスが正しく接続されていれば次のようにしてI2Cデバイスのアドレスが表示されるはず。

$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --      


ADコンバーターMCP3425を使ったのでアドレスが68と表示されたが、接続するデバイスによって数字は異なる。
とにかく何かしらアドレスが表示されれば、I2Cの接続に成功しているということだ。


MCP3425が認識されない場合

MCP3425では、Vin+とVin-にセンサーなどがつながれてないとI2C通信がエラーになってしまう。
とりあえずラズパイに認識されているか確認したい場合、MCP3425の1番と6番ピンをアース(ラズパイのGND)に落としてから、「$ sudo i2cdetect -y 1」を実行してみよう。



PythonでI2Cを使えるようにするライブラリ


次にPythonでもI2Cを使いやすくするために python-smbus というライブラリをインストールしておこう。
ちなみにこのライブラリ、Python2でないと動かないようなのでPython3を使ってる方は要注意。

$ sudo apt-get install python-smbus






ADコンバータMCP3425の仕様




いよいよADコンバータとI2C通信していく。
ADコンバータMCP3425のデータシートを確認しておこう。
ポイントのみ理解できればよいので解説していく。

MCP3425データシート

» http://akizukidenshi.com/download/ds/microchip/mcp3425.pdf



データシートによると MCP3425 は、ゲインなどの初期値をプログラミングから変更できるようになっている。
その設定はコンフィギュレーションレジスタに、8bitのデータを送り込むことで可能だ。




コンフィギュレーションレジスタ

次の表はコンフィギュレーションレジスタにおける各ビットの役割である。

bit0/1 bit2/3 bit4 bit5/6 bit7
PGA サンプルレート 変換モード 未使用 RDY


【bit0/1】チャネルの入力ゲイン (PGA)

コンフィギュレーションレジスタのbit0とbit1では、4種類の入力ゲインの倍率を設定できる。
読み取りたいアナログ電圧が小さい場合にこの設定が使えるが、今回はとくにその必要がないので入力ゲインを1倍に設定する。

bit0/1 ゲイン
00 1倍
01 2倍
10 4倍
11 8倍



【bit2/3】ビットレートとサンプリングレート

コンフィギュレーションレジスタのbit2とbit3では、ビットレートとサンプリングレートを変更できる。
解像度(ビットレート)が高いと、一秒間にサンプリングできる回数が減るようになっている。
サンプリング周波数をあげたい場合は、ビットレートを下げるしかない。

今回は、サンプリングレートを16bit、サンプリングレートを15SPSで行っていく。

bit2/3 ビットレート サンプリングレート
10 16bit 15 SPS
01 14bit 60 SPS
00 12bit 240 SPS


ここまでで、bit0からbit4は 1000 となる。

また、bit4からbit7までは今回は気にする必要ないので、1001 として設定しておけば良い。


  • つまりこれらを合わせると、コンフィギュレーションレジスタに書き込む値は「10011000」である。







ラズパイでアナログ電圧を読み取るPythonプログラム


それでは最後に、ADコンバータMCP3425を使って、ラズパイでアナログ電圧を読み取ってみよう。

MCP3425は差動入力なので、アナログ電圧Vinは次のように計算される。

$$ V_{IN} = V_{IN+} - V_{IN-} $$

(ただしVin+とVin-に入力できる電圧は、GNDを基準にプラスマイナス約2Vの範囲まで。)


次のようにラズパイの3.3V電圧を抵抗で分圧をして、アナログ電圧を作ってみた。



今回は話を簡単にするため、Vin+のみを使うことにして、Vin-はGNDへ落とすことにした。


上の回路図では3.3Vを10kΩで2等分しているので、1.65V程度の電圧が読み取れれば成功となる。
本当にそのようになるか確かめてみよう。



上のPythonプログラムはこちらの記事を参考にさせてもらった。


プログラムの実行結果はこのようになった。
1.6055


テスターで測ったところ1.657Vだったので0.05Vほどの誤差があるが、大きくずれてはいないので今回はこれで良しとしよう。


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

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

Amazon



あなたにおすすめ