I2C接続AQMシリーズのキャラクタ表示LCDをラズパイで使う (1) AQM0802

Raspberry Piの電源電圧は3.3V

 Raspberry Piは、いずれのモデルも3.3Vで動作します。GPIOのポート数は現在40ピンです。I2Cは、プリント基板内でのシリアル接続インターフェースとして使われるメジャーな規格です。Raspberry Piは、クロックSCLとデータのSDAの2本で制御できる手軽なインターフェースを二組GPIOピンに用意しています。バス1は、3.3V電源の横に信号が出ているので手軽に使えます。

 電子工作では表示部分にキャラクタ表示のLCDが使われてきました。GPIOのピン数がそれほど多くないので、2本で接続できるI2C接続のキャラクタ表示LCDが望まれていました。キャラクタ表示のLCDの内部は、HD44780という相当古いコントローラ・コンパチブルのICで制御されているので、カーソルを移動することや文字を表示するコマンドは、どの製品もほぼ同じです。

 しかし、I2Cのインターフェースは独自の製品が多く、特に、スレーブ・アドレスは様々です。

安価な秋月電子通商扱いのAQM0802の仕様

 AQM0802は、1行に8文字、2行表示のコンパクトなキャラクタ表示LCDです。I2CでRaspberry Piと接続すると、認識しません。こちらの記事を参照ください。秋月電子通商では、バス・リピータのPCA9515をブレッドボードで利用できるようにピン幅変換基板に搭載した製品「Raspberry Pi キャラクタ液晶ディスプレイモジュールキット
[AE-AQM0802+PCA9515]」が用意されています。

 スレーブ・アドレスは0x3eです。

 2017年7月現在、販売価格は820円です。

 ピンをはんだ付けして組み立てます。

Raspberry Piに入っているプログラムの確認

 2017年7月現在、RASPBIAN JESSIE WITH DESKTOPのカーネルを確認します。

uname -a
4.9.39

 インストールされているPythonのバージョンを調べます。

python -V
2.7.9

 インストールされているPython用I2Cライブラリを調べます。smbusはintelの呼び名で、Philipsの呼び名はI2Cです。

dpkg -l
python-smbus 3.1.1+svn-2

 i2c-toolsも入っています。最初は、このツールを使います。

AQM0802をRaspberry Piに接続して動作確認

 Raspberry Piは、最初に、I2Cを利用する設定が必要です。メニューのPreferencesから、Raspberry Pi Configurationを開きます。

 I2CのEnabledにチェックを入れ、再起動します。

 AQM0802ボードは、GPIOにそのままさせます。1と9番ピンで電源を、3と5番ピンでI2C信号を供給します。7番ピンは、バックライトのLED点灯電源です。11番ピンのリセット信号は使いません。

 ターミナルから、i2cdetectコマンドで、スレーブ・アドレスを確認します。データシート通り0x3eです。 

動作確認

 こちらのページにあるように初期化をします。この初期化はArduino用なので、5V動作をするため、ブースタをOFFの0x51を設定をしていますが、3.3Vで動作させるため、0x56を書き込みます。

 0x38から0x0cまでが初期化です。0x61('a')から0x41('A')は表示文字です。

 正しく表示できました。

使用例

 RaspberryPiのCPUの温度は、次の命令で取得できます。

vcgencmd measure_temp

 次のプログラムで、CPU温度を表示させます。表示上Tabがなくなってしまうので、スペース8文字に置き換えています。

#!usr/bin/env python
# -*- coding: utf-8 -*-
import smbus
import time
import subprocess
i2c = smbus.SMBus(1) # 1 is bus number
addr02=0x3e #lcd
_command=0x00
_data=0x40
_clear=0x01
_home=0x02
display_On=0x0f
LCD_2ndline=0x40+0x80
#LCD AQM0802/1602
def command( code ):
i2c.write_byte_data(addr02, _command, code)
time.sleep(0.1)

def writeLCD( message ):
mojilist=[]
for moji in message:
mojilist.append(ord(moji))
i2c.write_i2c_block_data(addr02, _data, mojilist)
time.sleep(0.1)
def init ():
command(0x38)
command(0x39)
command(0x14)
command(0x73)
command(0x56)
command(0x6c)
command(0x38)
command(_clear)
command(display_On)
#main
init ()
command(_clear)
writeLCD("CPU: ")
while 1:
command(LCD_2ndline)
res = subprocess.check_output(['vcgencmd','measure_temp'])
print res
writeLCD(str(res)[4:11])
time.sleep(0.5)

 実行例です。