Raspberry PiにI2C液晶をつける

Raspberry Piは、GPIOピンの一部をSPIやI2Cインターフェースとして使用できます。
これを利用して、Strawberry Linuxで販売されているI2Cキャラクタ液晶Raspberry Piに取り付けてみました。

配線

Raspberry PiのGPIOのピン配置は下記で分かります。
RPi Low-level peripherals - eLinux.org


これを見ながら、下記のように接続します。I2C用のプルアップ抵抗も不要です*1。液晶のRST端子は開放でOKです Vddに直結しておかないと動作が不安定になることがあります。

RaspberryPi I2C液晶
01 3.3V 5 VDD
03 SDA 3 SDA
05 SCL 2 SCL
06 GND 4 GND


こんな感じのアダプタのようなものを作ってみました。ピンヘッダにそのまま刺せます。

ソフトウェア

I2Cの使い方は下記サイトを参考にさせていただきました。
Raspberry Pi I2C How-To ガイド by @azarashi55 | GVC : Global Versatile Controller


1. /etc/modules に以下一行を追加

i2c-dev

2. /etc/modprobe.d/raspi-blacklist.conf の以下一行をコメントアウト

# blacklist i2c-bcm2708

3. モジュールをロードする(もしくは再起動。)

$ sudo modprobe i2c-bcm2708 

4. i2c-toolsをインストー

$ sudo apt-get install i2c-tools

5. 液晶が正しく検出されるかをチェック

$ sudo i2cdetect 0   # => 3e (液晶のアドレス) が表示される

6. 下記の液晶コントロールシェルスクリプトを i2c-disp.sh として保存。(アプリケーションノートを眺めながら適当に作ったものです。アイコン表示などに対応させても面白いかも。)

#!/bin/bash
function usage {
    echo "Usage: $0 [-ic] [-p pos] message" > /dev/stderr;
    exit 1
}
[ $# = 0 ] && usage

while getopts "icp:" flag; do
    case $flag in
	\?) usage ;;
	i)  i2cset -y 0 0x3e 0 0x38 0x39 0x14 0x78 0x5e 0x6c i
	    sleep 0.25
	    i2cset -y 0 0x3e 0 0x0c 0x01 0x06 i
	    sleep 0.05
	    ;;
	c)  i2cset -y 0 0x3e 0 0x01 ;;
	p)  i2cset -y 0 0x3e 0 $((OPTARG+128)) ;;
    esac
done
shift $((OPTIND-1))
[ $# = 0 ] && exit

LANG=C
MSG=`echo -n "$1" | perl -pe '$_=join" ",map{ord }split//'`
#echo $MSG
i2cset -y 0 0x3e 0x40 $MSG i

7. 実行してみる。初回は -i オプションを指定し、液晶を初期化する必要があります。
また、-pオプションを使うと明示的に表示位置を指定することができます。なお1段目は 0x00 から、2段目は 0x40 から始まります。
何も指定しないと前回の続きから引数の文字を表示させます。

$ sudo ./i2c-disp.sh -i 'Hello! I2C LCD'
$ sudo ./i2c-disp.sh -p 0x41 ' & Raspberry Pi'

余談

※ちょっと失敗してせっかく買ったケースのふたが閉まらなくなるという問題があったので、改造して最終的に収まるようにしました。

*1:Raspberry Piが内蔵プルアップ/プルダウン機能を持っているため