ラズパイでコマンドラインからI2C接続LCDを制御する

エンジニアブロガーのプロコアラです。

10年間エンジニアとして働き、ラズパイコンテストで賞をとったこともあるラズパイマニアです。

I2Cって何?
Inter-Integrated Circuitの略で
アイ・スクエアー・シー、または アイ・ツー・シーと読みます。
フィリップス社が開発したシリアルバス。
SDA(シリアルデータ)信号とSCK(シリアルクロック)信号の2線でICを制御します。

 

今回は、ラズパイからI2C接続のLCDを制御したいと思います。

この記事を読むことでキャラクタLCDの制御ができるようになります。

 

今回は、ラズパイからI2C接続のLCDを制御したいと思います。

この記事を読むことでキャラクタLCDの制御ができるようになります。

 

今回使用するもの

ラズパイは何のシリーズでも大丈夫です。他の用途にも色々使用する予定のため、性能の良いラズパイ3を購入しました。

私は家にあったLCDを使いましたが、買うならバックライト付のものがおすすめ

ブレッドボードを使えば半田付けが不要なので、試作などにおすすめです。

ラズパイとの接続にはオスメスのコードが必要です。

 

組み立て

LCDモジュールの「MI2CLCD-01」は半完成品ですので、組み立てが必要です。

mi2clcd

 

配線

以下のように配線してください。 ブレッドボードを使うと便利ですよ。

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」の取扱説明書をアップします。

image

image

image

image

image

image

 

動作チェック

LCDに文字が表示されました。わーい!

DSC01848

 

まとめ

I2CはCLKとデータの2線だけで通信できるため、LCDなどのデバイスには有効です。

数珠つなぎで色々なデバイスを接続することができるため、センサーなどを接続することもできます。

ではでは! (^^)/

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です