I2C通信

AQM0802はI2C通信でやり取りをします。 Raspberry PiでI2C通信を使えるようにしましょう。

追加ソフトをインストール

Raspberry PiでI2Cという通信規格でデータのやり取りをおこなうためにはi2c-toolsという追加ソフトが必要になります。

$ sudo apt-get install i2c-tools

apt-getでインストール後にraspi-configでI2Cを有効化して一旦シャットダウンしたら、液晶モジュールを取り付けて再度起動します。

液晶取り付け

lsmodでカーネルモジュールi2c_bcm2708とi2c_devがロードされていることが確認できればI2C通信が利用できる状態になっています。

pi@raspberrypi:~ $ lsmod
Module                  Size  Used by
cfg80211              407532  0 
rfkill                 16036  1 cfg80211
bcm2835_rng             1763  0 
i2c_bcm2708             4920  0 
bcm2835_gpiomem         2860  0 
uio_pdrv_genirq         2944  0 
uio                     7753  1 uio_pdrv_genirq
i2c_dev                 5671  0 
snd_bcm2835            19802  0 
snd_pcm                73474  1 snd_bcm2835
snd_timer              18848  1 snd_pcm
snd                    50779  3 snd_bcm2835,snd_timer,snd_pcm
ipv6                  340825  37

液晶モジュールが認識されているかどうかはi2cdetectで確認します。アドレス3eの場所に3eと表示されていればOK。

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

これでI2C通信を始めることができます。ちなみにi2cdetectのオプションは現行のRaspberry Piならこのままでいいです。初期のものはi2cdetect -y 0になるようです。

I2C通信のこと

ところでI2C通信って何ですかね?ってことですが、物理的にはプラスとマイナスの2本一組の線を使ったデジタル通信です。

複数のマスタースレーブ間で情報のやり取りをするので各スレーブには個別のアドレスを振って、通信先を特定しています。今回の例で言えばAQM0802液晶には0x3e(0xは16進数を表す接頭辞)というアドレスが振られています。

というわけで、マスターであるRaspberry Piから液晶モジュール3eに対してi2c-toolsのi2csetコマンドを使って様々な命令を送って操作してみます。

SWITCH SCIENCEと表示してみた

スイッチサイエンスのブログにあるコードを何も考えずに入力すると「SWITCH(改行)SCIENCE」と表示されました。

i2csetは次のようなオプションをとります。

i2cset オプションスイッチ I2Cバス番号 チップアドレス データアドレス データ モード
パラメータ 内容 今回の値
オプションスイッチ 対話モード無効(直接操作モード) -y
I2Cバス番号 Raspberry PiのI2C通信バス番号を指定。Pi2は1番。 1
チップアドレス スレーブ側の固有アドレス。0x03から0x77まである。AQM0802液晶は0x3e。 0x3e
データアドレス スレーブ機器に書き込まれるデータの書き込み先。0x00から0xffまである。AQM0802液晶は各種操作命令の0x00とキャラクタ表示命令の0x40のふたつがある。 0x00または0x40
データ スレーブ機器に書き込まれるデータ。AQM0802の場合、0x00に続くものは各種制御命令コード、0x40に続くものは表示キャラクタの文字コード。 適宜様々
モード スレーブ機器に与えるデータのモード。b,w,s,iの4種類ある。

  • b…1バイト(8ビット)のデータ
  • w…1ワード(16ビット)のデータ
  • s…SMバスのデータブロックサイズ
  • i…I2Cのデータブロックサイズ
i

またSMバスとかよくわからない単語が出てきましたが気にしない。I2Cバスの一種らしいです。