I2C (Inter Integrated Circuit; アイ スクエア シー) はシリアル通信の方式の一つです。この規格に準拠したデバイス同士は、二本の信号線だけでデータのやりとりを行えます。デバイス同士は対等ではなく、マスターに一つ以上の I2C スレーブを接続します。これらスレーブは同じ種類の IC である必要はありません。各種センサー、LCD、モータードライバ、A/D コンバータなど、様々な IC が I2C に対応しています。
二つの信号線
また、似たインターフェースとして Raspberry Pi はシリアル通信の SPI 規格にも対応しています。
Raspberry Pi は I2C のマスターとして動作可能なデバイスです。既定では I2C が無効化されているため、初期設定が必要です。今回使用した Raspberry Pi は Model B+ です。リビジョンは以下のとおりです。
pi@raspberrypi:~ $ cat /proc/cpuinfo | grep Revision
Revision : 0010
または
pi@raspberrypi:~ $ sudo python
>>> import RPi.GPIO as GPIO
>>> GPIO.RPI_REVISION
3
NOOBS のバージョンは以下のとおりです。
pi@raspberrypi:~ $ cat /etc/issue
Raspbian GNU/Linux 8 \n \l
pi@raspberrypi:~ $ uname -r
4.1.19+
以下のコマンドで必要なライブラリをインストールします。
sudo apt-get update
sudo apt-get install i2c-tools
初期設定画面を起動します。
sudo raspi-config
本ページで利用している OS のバージョンは上述の通り 4.1.19+
です。その場合は以下の画像のように Advanced Options を選択してエンターを押します。ただし、下記フォーラムにも記載のとおり、最新の Raspbian を利用している場合は 5 Interfacing Options
を選択します。
advanced options I2C not showing
I have the same options to choose from in Advanced Settings as in your picture, but in 5 Interfacing Options I found the option P5 I2C
https://raspberrypi.stackexchange.com/questions/63076/advanced-options-i2c-not-showing
I2C を選択してエンターを押します。
Yes を選択して有効化します。
Yes を選択して既定で I2C を有効化するようにします。
Finish を選択してエンターを押します。
再起動します。
I2C の動作周波数は、低速モード、高速モード等、デバイスによって異なります。以下のコマンドを実行して i2c-dev
が記載されていることを確認します。
sudo vi /etc/modules
シリアル通信 baudrate を設定するために以下のコマンドを実行します。
sudo vi /boot/config.txt
最終行に dtparam=i2c_baudrate=50000
を追記して再起動します。
sudo reboot
設定が反映されていることを確認します。
dmesg | grep i2c
実行結果
[ 4.607918] i2c /dev entries driver
[ 12.712102] bcm2708_i2c 20804000.i2c: BSC1 Controller at 0x20804000 (irq 79) (baudrate 50000)
これは sudo raspi-config
を実行して I2C 設定を変更すると初期化されますので注意してください。
適切にインストールされた場合、例えば i2cdetect
コマンドが使用できるようになっています。以下のコマンドで I2C バス一覧を確認します。
sudo i2cdetect -l
実行結果
i2c-1 i2c 20804000.i2c I2C adapter
I2C バス 1 について、Raspberry Pi に接続された I2C デバイス一覧およびそれらのアドレスを確認します。
sudo i2cdetect -y 1
I2C デバイスには出荷時に 0x03 - 0x77
の範囲でアドレスが割り当てられています。I2C のマスターが複数のスレーブから適切な対象を識別して問い合わせるためにこれらのアドレスを用います。デバイスによっては検出できないものがあります。その場合はデータシートを参照して調べます。
ACM1602NI に文字列 XYZ
を表示するサンプルです。
この I2C デバイスは i2cdetect
でアドレスを取得できません。データシートを参照すると 0x50
であることが分かります。
Slaver address could only set to 1010000, no other slaver address could be set.
LCD のピンは左から順に 1-7 です。
ピン番号 | シンボル | 機能 | 備考 |
---|---|---|---|
1 | VSS | Ground | |
2 | VDD | 3.3V | Raspberry Pi から供給可能 |
3 | V0 | LCD contrast adjust | バックライトのコントラストを調整 (アナログ入力 0-3.3V) |
4 | SCL | SERIAL CLOCK INPUT | |
5 | SDA | SERIAL DATA INPUT | |
6 | BL+ | Power Supply for BL+ | デジタル入力 (ON/OFF) |
7 | BL- | Power Supply for BL- | グランド 0V |
Raspberry Pi のピン配置を参考に回路を組みます。SCHEMATICS.COM で作成しました。
gpio コマンドでバックライトの ON/OFF を試してみましょう。