![]()
20.IICインターフェース (2020.2.27-2020.8.17)
I2Cとも呼ばれるシリアル通信インターフェースです。前章のSPIインターフェースが通常3~4本の信号線を使うのに対して、IICではたった2本の信号線で、複数のデバイスと通信できます。IICインターフェースはRaspbianの初期状態では使えないようなので、使えるように設定を変更します。テキストの説明は古いので、こちらのやり方で話を進めたいと思います。もしかすると最初から使える状態になっているかもしれませんので、必要であれば実行して下さい。コマンドラインからIICを使うツールも標準でインストールされているので、簡単に使い始められます。確認もかねて、LXTerminalを起動して次の手順で変更を行います。Raspbianのバージョンによっては、メニュー構成等が異なるかもしれません。 → 現在はRaspberry Piの設定から簡単に変更できます。

上記を実行すると下図のようなメニューが表示されるので、5を選択して下さい。

次にI2Cを選択します。

機能を有効にするか質問されるので「はい」を選択します。

機能が有効になりました。

LXTerminalから実際にIICインターフェースが使えるのか確認してみます。下記のような表示がされれば使える状態です。IICを使うハードが結線されている場合は、表の中に数値が入ります。下図はまだ未接続のため全て「- -」が表示されています。
テキストではPythonのsmbusライブラリをインストールするように促されていますが、現在(私が使用しているNOOBS 3.3.1)では既にインストールされていました。準備完了です。
IICはメジャーな通信方式らしく、様々な種類のICが市販されています。今後I/Oの拡張として考えているI/Oエキスパンダ(MCP23017)もこの通信方式を採用していて、実験の際に改めてテーマを掲載する予定です。とりあえず手元に何か使えそうなものがないか確認したところ、以前に入手していたパーツ類(OSOYOO製のラズベリーPi3 初心者キット)の中に、IICを利用する16×2のLCDがありました。amazon等でも販売されているものです。個別に揃えるよりも安価なので、興味ある方は検討すると良いでしょう。私はキット一式をジャンク品ということで入手したものですが、明らかに未使用品でした。メーカーサイトには実験ガイドとテストプログラムも用意されているので、それらを使って実験することにします。
回路はブレッドボードとLCDの間を4本のリードで接続するだけの簡単なものです。SDAとSCLは直接RasPiに接続するため、LCDの電源5Vは少々心配でしたが、どうやら内部で電圧変換されているようです。逆に3.3VではLCDは正常に駆動できませんでした。

上述したように既にIICの使用準備はできているため、下図のようにターミナルにコマンドを入力していきます。LCDの接続によって先のインターフェースの表示に数値が現れるのを確認します(私の環境だとコマンドの引数の-y 0ではエラー)。IICのアドレスは27Hになっているようです。次にプログラムをダウンロードして保存します。これをターミナルから実行すると、LCDには用意された文字列が一定間隔で表示されます。


無事表示が確認できたので、今度は任意の文字列を表示してみます。そのためには、今回のテストに使用したプログラムを調べる必要があります。同時にIICの使い方もプログラムから読み解きます。
改変したテストプログラムはこちらを参考にして下さい。便宜上拡張子をtxtにしていますが、pyとすればPythonのプログラムファイルとなります。LCDに表示する文字列を変数(S1~S4)にして、プログラムの上部にある設定の中に定数として記述しました。この定数の内容を変更することで簡単に表示文字を変えることができます。2種類の文字列を各行に表示することで1セットとし、2セット分を各3秒ずつ表示して切り替えています。下図がテストプログラムを実行した結果になります。

プログラムの主要部分はオリジナルを踏襲しています。大部分はLCDを駆動するための手続きで、他でも流用できると便利です。追って他のプログラムから呼び出して、任意の文字列を表示するようなモジュールを考えてみたいと思います。
ところで、プログラムmain()の中に見慣れない記述があったので簡単に補足しておきます。
if __name__ == '__main__':
調べたところ、冒頭でファイルをimportする際に、読み込みと同時に実行してしまわないようにするための記述のようです。どうやらPython独特のもののようで、「とりあえず必要なおまじない」とでも理解しておくことにします。
プログラムの冒頭では、IICインターフェースを使うためにsmbusライブラリをimportします。
import smbus
SMbusはテキストにも書かれていますが、PCにも使われている規格です。PCのデバイスマネージャーを調べると、システムデバイスの中にsmbus関連のドライバーが入っていることがわかります。
プログラム内ではSMBusオブジェクトのインスタンスを生成して使います。
bus = smbus.SMBus(1) # Rev 2 Pi uses 1
引数には拡張コネクタのリビジョンが入るようで、現在テストに使っているRaspberry Pi 2シリーズでは1になります。
次にI2Cデバイスと通信するアドレスを定義します。
I2C_ADDR = 0x27 # I2C device address, if any error, change this address to 0x3f
今回使用するLCDの通信のアドレスは27Hです。コメントには動作時にエラーになった場合は3fHに変更するように指示されています。
最初にLCDを初期化し、Raspberry Piとの通信準備をします。後は必要に応じてデータを送り、LCDに文字列を表示するわけです。これらの処理はデバイスによって異なるため、デバイスに付属する説明書を参照してプログラムすることになります。
![]()