Raspberry PiでI2C機器を使う記事で、毎回準備の段階についてあれこれ書くのは煩わしいので、記事を用意することにしました。本記事では、I2Cの概要と、実際にRaspberry Piで使う際に必要なことをまとめます。
I2Cについて
Raspberry Piで電子工作を始めると、I2Cという言葉をやたらと見るようになりますが、とっかかりの段階ではどうにも謎めいた言葉なので、まずI2Cについてから書きます。
まず、Raspberry Piで標準的に外部の機器とやり取りしようと思ったら、GPIOを利用します。GPIOピンは 0 or 1 のデジタル信号を入出力します(1は具体的には3.3V)。LEDをチカチカさせるだけならそれでもよいのですが、たとえば温度センサから温度を読み取りたいとなると、それだけだとちょっと厳しいものがあります。そこでI2Cを使います。
I2CはInter-Integrated Circuitの略で、外部デバイスとやり取りするためのプロトコルの一つです。データ通信とクロック送受信の2本線でやり取りします(実際は、他に電源用にVとGNDで2本使います)。非常にシンプルなプロトコルといえます。しかも、線を繋いでいくと機器を数珠繋ぎに接続できます。少ない線で多くのデバイスとやり取りできるわけです。やってみるとこれがとてもお手軽で有り難い。
しかし、データ通信を1本の線で行ういわゆる半二重通信のために、データの転送速度という点には制約があり、あまり早くはありません。なので、ADコンバータや液晶ディスプレイのように、転送速度が必要なものは、4本の線を用いて全二重通信ができるSPI(Serial Peripheral Interface)という通信方法が用いられるものがけっこうあります。
とはいえやはり線の少ないI2Cのシンプルさは使いやすく、環境系のセンサなどはI2Cが多いように思えます。実際、よく使うことになるでしょう。Raspberry Piにおいては、GPIOピンの一部を、I2C用のピンとして割り当てることができます。本記事では、その割り当て方と、割り当てた後に機器と接続して確認するまでの手順を書きます。
ソフトウェアの準備
ここでは、3.18以降の新しいカーネルを使った、対話的な方法について記述します。3.10以前の古いカーネル、あるいは非対話的に有効化する場合は、後述の参考記事を参照。
カーネルのバージョンを確認
Raspberry PiでI2Cを使えるようにします。カーネルのバージョンによってやり方が変わるので、古い本を参考にしている人は要注意です。uname -r コマンドでカーネルのバージョンがわかります。3.18以降か、3.10以前かが境目です。バージョンが古い場合、rpi-updateで最新版にアップデートします。
$ uname -r
$ sudo rpi-update
$ uname -r
-> 3.18 以降であることを確認
それにしても、ラズパイ系のコマンドはだいたいraspi-hogehogeが多いのに、なぜこれだけrpi-なんでしょう。
raspi-config からI2Cを有効化
Raspberry Piはデフォルトの状態ではI2Cが有効化されていません。後述のピン配列を見るとわかるのですが、I2C通信のために使われるピンは、デフォルトではGPIOピンとして機能しています。GPIOピンが多いほうがよかろうということなんでしょうね。ですので、有効化させる必要があります。古いカーネルでは設定ファイルをあれこれ変更する必要がありましたが、現在はraspi-configで簡単に有効化させられます。
raspi-configは対話的なコマンドです。最初に領域拡張やタイムゾーンの設定などを行うと思いますが、そのときについでにやってしまうと手間が多少省けます。
$ sudo raspi-config
「8 Advanced Option」→「A7 I2C」より、I2Cを選択して、有効化させます。デフォルトで有効化する?とか色々聞かれますので、Yesと答え、終わったら再起動です。
ソフトウェアのインストール
I2C機器とのやりとりで使うだろうソフトウェアをインストールします。
$ sudo apt-get install i2c-tools python-smbus
参考記事
参考にしました。ありがとうございます。また、古いカーネルで行う方法、非対話的な方法については、下記記事が参考になります。
- Raspberry Pi の I2C を有効化する方法 (2015年版) - 意識低い開発者のBlog
- Raspberry Pi の I2C を有効化する方法 (旧版) - 意識低い開発者のBlog
- RaspberryPi - Raspberry Pi 2とセンサーデータで遊ぶための初期設定 - Qiita
ハードウェアの準備
Raspberry Piと導線があればできます。現実的には、ジャンパワイヤとブレッドボードが第一歩になるでしょう。
ケーブルの準備
ケーブルを準備します。Raspberry Piで使うには、オス-メスのジャンパワイヤとブレッドボードを使うのが一番簡便でしょうか。まぁ、電気的に繋がればなんでもよいです。
配線の確認
I2C機器との接続で使うRaspberry Piのピンは、電力供給用のVとGND、およびデータ通信用のSDAとクロック信号のSCLの4本です。Raspberry Piでは、3.3Vおよび5Vの出力が可能です。使用する機器によって使用する電圧のピンを変えることになりますが、まぁだいたい3.3Vを使うことになると思います。5Vを使う場合、データシートより耐電圧が5V以上であるかどうかを確認します。
Raspberry Pi は、初代かバージョン2かでピン配列が違います。旧型モデルでは26ピン、2ではさらに拡張された40ピンです。配置は「RPi Low-level peripherals - eLinux.org」にあるとおり。I2Cで使われるところは一緒です。
左側のPin3,5がデータ通信、クロック用のピンで、電源用に3.3Vまたは5Vのピンと、GNDのピンのどこかを使うことになります。前述のとおり、だいたいは 3.3V を使うと思います。
接続と確認
準備したケーブルを用いて、Raspberry PiとI2C機器を実際に繋げます。通常ArduinoなどでI2C機器を使うときは、プルアップやプルダウンが必要であったりするようですが、Raspberry Piでは基板上にそれらが実装されているので、特に準備する必要はありません(参考:「PiRT-UnitによるI2Cデバイスの利用 | OpenRTM-aist」、「Raspberry PiのGPIOは起動直後から内部プルダウンされている - hnwの日記」)。なおプルアップというのは、入力がないときに電位がHighになるような配線で、「プルアップ ‐ 通信用語の基礎知識」の解説がわかりやすいと思います。逆にLowに固定するものはプルダウンと呼ばれます。周囲の環境などからくるノイズによる意図しない入力が発生しないようにする、安定化の術ですね。
さて、実際に接続したら、Raspberry Piで認識されているかどうかを以下のコマンドで確認します。
$ i2cdetect -y 1
i2cdetectコマンドにより、I2Cデバイスを見つけられます。-yというのは、非対話的なモードでというオプションで、1は1chのI2Cバスでということです。最初の頃の古いRaspberry Piだと、0chを使うものがありますが、今はまず1chと考えてよいでしょう。I2Cデバイスは、7ビットのスレーブアドレスで表現されます。つまり、最大7ビット分のデバイスを接続できるということです。SDA、SCLをそれぞれ数珠つなぎにすれば、複数台認識され、それぞれのデバイスに割り当てられているスレーブアドレスより個別に制御できます。
コメント