I2C接続AQMシリーズのキャラクタ表示LCDをラズパイで使う (2) AQM1602
■表示面積が広くて使いやすい秋月電子通商扱いのAQM1602の仕様
前回、1行に8文字、2行表示のAQM0802をラズパイで利用しました。コンパクトですが、表示面積が狭いです。
AQM1602は、1行に16文字、2行表示のコンパクトなキャラクタ表示LCDです。I2CでRaspberry Piと接続すると、認識しません。こちらの記事を参照ください。秋月電子通商では、バス・リピータのPCA9515をブレッドボードで利用できるようにピン幅変換基板に搭載した製品「Raspberry Pi キャラクタ液晶ディスプレイモジュールキット
[AE-AQM0802+PCA9515]」が用意されています。AQM0802専用です。AQM1602用のセットものはありません(2017年7月現在)。
スレーブ・アドレスはAQM0802と同じく0x3eです。
2017年7月現在、変換基板の販売価格は500円、AQM1602XA自体は450円です。
ピンをはんだ付けして組み立てます。そのまま挿し込んではんだ付けしません。1~5番まではそのまま挿し込みますが、次のように一部配線をずらします。秋月電子通商はこのように使えることを保証していません。
AE-AQM0805+PCA9515 | AQM1602XA | ||
---|---|---|---|
Vlcd | 1 | - | Vo(Vlcd) |
Vout | 2 | 6 | Vout |
CAPin | 3 | 8 | CAPin |
CAPip | 4 | 7 | CAPip |
Vdd | 5 | 5 | Vdd |
Vss | 6 | 4 | Vss |
SDA | 7 | 3 | SDA |
SCL | 8 | 2 | SCL |
XRESET | 9 | 1 | RES |
LED A | 10 | - | - |
LED K | 11 | - | - |
AQM0802のように、LCDパネルを支えるリード線が使えないので、裏側で、グルーガンを使ってぐらつかないようにしました。
●Raspberry Piに入っているプログラムの確認
2017年7月現在、RASPBIAN JESSIE WITH DESKTOPのカーネルは4.9.39で、Pythonのバージョンは2.7.9です。python-smbus(バージョン3.1.1+svn-2)が入っています。
i2c-toolsも入っています。最初は、このツールを使います。
●AQM0802をRaspberry Piに接続して動作確認
Raspberry Piは、最初にI2Cを利用する設定が必要です。前回の説明を参照してください。
はんだ付けしたAQM1602ボードは、GPIOにそのままさせます。1と9ピンで電源を、3と5ピンでI2C信号を供給します。11ピンのリセット信号は使いません。
●動作確認
ターミナルから、i2cdetectコマンドで、スレーブ・アドレスを確認します。データシート通り0x3eです。
こちらのページにあるように初期化をします。この初期化はArduino用なので、5V動作をするため、ブースタをOFFの0x51を設定をしていますが、3.3Vで動作させるため、0x56を書き込みます。
0x38から0x0cまでが初期化です。0x41('A')、0x42('B')、0x43('C')は表示文字です。
正しく表示できました。
●使用例
RaspberryPiのCPUの温度は、次の命令で取得できます。
vcgencmd measure_temp
次のプログラムで、CPU温度を表示させます。
#!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))
time.sleep(0.5)
実行例です。最後のCの後ろにごみが付いています。気になるようなら削除してください。