エンジニアブロガーのプロコアラです。
10年間エンジニアとして働き、ラズパイコンテストで賞をとったこともあるラズパイマニアです。
Inter-Integrated Circuitの略で
アイ・スクエアー・シー、または アイ・ツー・シーと読みます。
フィリップス社が開発したシリアルバス。
SDA(シリアルデータ)信号とSCK(シリアルクロック)信号の2線でICを制御します。
今回は、ラズパイからI2C接続のLCDを制御したいと思います。
この記事を読むことでキャラクタLCDの制御ができるようになります。
今回は、ラズパイからI2C接続のLCDを制御したいと思います。
この記事を読むことでキャラクタLCDの制御ができるようになります。
今回使用するもの
ラズパイは何のシリーズでも大丈夫です。他の用途にも色々使用する予定のため、性能の良いラズパイ3を購入しました。
私は家にあったLCDを使いましたが、買うならバックライト付のものがおすすめ
ラズパイとの接続にはオスメスのコードが必要です。
組み立て
LCDモジュールの「MI2CLCD-01」は半完成品ですので、組み立てが必要です。
配線
以下のように配線してください。 ブレッドボードを使うと便利ですよ。
LCD側 | ラズパイ側 |
MI2CLCD-01 CN1 1pin (VDD) | Raspberry Pi 1pin (+3.3V) |
MI2CLCD-01 CN1 2pin (GND) | Raspberry Pi 6pin (GND) |
MI2CLCD-01 CN1 3pin (SDA) | Raspberry Pi 3pin (SDA) |
MI2CLCD-01 CN1 4pin (SCL) | Raspberry Pi 5pin (SCL) |
MI2CLCD-01 CN1 5pin (RST) | MI2CLCD-01 CN1 (VDD) |
※ RSTピンは電源投入直後にVDD信号から少し遅れてLowにアサートされる必要がありますが VDD信号と直結してもパワーオンリセットされるため問題ないみたいです。
※ SDAとSCKは、プルアップ抵抗を接続する必要がありますが ラズパイは内部に1.8kΩのプルアップ抵抗があるため接続する必要はありません。
I2C Tools
それでは、I2C Toolsを使っていきます。
I2C有効化
ラズベリーパイでI2Cを使用するためには事前に有効にしておく必要があります。 raspi-configを実行します。
$ sudo raspi-config
以下の手順に従って、I2Cを有効に設定してください。
・「5 Interfacing Options」を選択。
・「P5 I2C」を選択。
・「Would you like the ARM I2C interface to be enabled?」と聞かれます。
→ 「Yes」を選択。
・「Finish」を選択し、終了。
インストール
インストール下記コマンドでインストールできます。
使い方
I2C Toolsは、コマンドが4つあります。
I2cdetect
I2Cバスを走査してデバイスが使用しているアドレスを特定します。
I2cset
指定したアドレスのデバイスに値を書き込みます。
I2cget
指定したアドレスのデバイスから値を読み込みます。
I2cdump
I2Cデバイスのレジスタをまとめて読みだします。
アドレスの特定
まずは、I2Cバスを下記コマンドで確認します。
コマンドの結果から、I2Cバス1に接続されていることが分かりました。
$ ls /dev/i2c* /dev/i2c-1
i2cdetectコマンドでアドレスを特定します。
-y:確認メッセージをパス 1:I2Cバスを指定
アドレスが0x3eだということが分かりました。
$ 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: -- -- -- -- -- -- -- --
制御プログラム
制御するプログラムをエディタで作成します。
#!/bin/sh# LCDの初期化 i2cset -y 1 0x3e 0 0x38 0x39 0x14 0x78 0x5f 0x6a i # -y: 確認メッセージをパス # 1: I2Cバスを指定 # 0x3e: アドレスを指定 0x3eに対してのデータ # 0: RS=0で、データではなくコマンド? # 以下コマンド(詳細は後ろのLCD取扱説明書の制御コマンド一覧を参照) # 0x38: 機能設定コマンド 8bitモード、2行表示、通常フォント、命令テーブル0 # 0x39: 機能設定コマンド 8bitモード、2行表示、通常フォント、命令テーブル1 # → ビットモードは、2度設定しないと反映されないらしい # → 命令テーブル1のコマンドを仕様するため、命令テーブル1を選択 # 0x14: 内部OSC周波数セット # 0x78: コントラストセット # 0x5f: コントラストセット # 0x6a: フォロアコントロール # i: 連続書き込みモード sleep 0.3 i2cset -y 1 0x3e 0 0xc 0x1 i # 0x0c: ディスプレイ表示ON # 0x01: ディスプレイ表示内容をクリア DDRAMメモリに0を設定 sleep 0.3i2cset -y 1 0x3e 0 0x6 i # 0x06: エントリモード設定 書き込み後にカーソルを右へ移動するように設定 sleep 0.3 # 文字を出力(1行目) i2cset -y 1 0x3e 0 0x80 b # 0x80: Write Data to RAM # b: バイトでの通常書き込みモード i2cset -y 1 0x3e 0x40 0x48 0x65 0x6c 0x6c 0x6f 0x2c i # 0x40: RS=1でコマンドではなくデータ? # 以下データ(詳細は後ろのLCD取扱説明書の表示文字コード表を参照) # 0x48: H # 0x65: e # 0x6c: l # 0x6c: l # 0x6f: o # 0x2c: , # 文字を出力(2行目) i2cset -y 1 0x3e 0 0xc0 b # 0xc0: Read Data from RAM リードしたら改行される? i2cset -y 1 0x3e 0x40 0x57 0x6f 0x72 0x6c 0x64 0x21 i # 0x57: W # 0x6f: o # 0x72: r # 0x6c: l # 0x64: d # 0x21: !
※LCDは一定のコマンドで初期化しないと機能しません。 制御コマンドで初期化する必要があります。
制御コマンドは互換性を保つためか、伝統的に同じ制御コマンドです。
プログラムを実行します。
chmod 755 hello_world_lcd.sh ./hello_world_lcd.sh
キャラクタLCDモジュール 取扱説明書
今回制御するキャラクタLCDモジュール「MI2CLCD」の取扱説明書をアップします。
動作チェック
LCDに文字が表示されました。わーい!
まとめ
I2CはCLKとデータの2線だけで通信できるため、LCDなどのデバイスには有効です。
数珠つなぎで色々なデバイスを接続することができるため、センサーなどを接続することもできます。
ではでは! (^^)/