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

番外編;ACM1602NI

 ACM1602NIはAQM1602と同じく、1行に16文字、2行表示のコンパクトなキャラクタ表示LCDです。I2CでRaspberry Piと接続しても、そのままではi2cdetectでは認識しません。

 スレーブ・アドレスは0x50コマンドの書き込みは0x80です。

 2017年7月現在、秋月電子通商でACM1602NIは1,280円です。

 配線の量を減らしたかったので、バックライトは使いません。Voはコントラストの調整電圧入力です。3.3VとGND間に10kから20kΩの半固定抵抗をつないで調整します。きれいに見える範囲は狭いです。

RaspberryPi-GPIO ACM1602NI
3.3V 1 2 V+
SDA 3 5 SDA
SCL 5 4 SCL
GND 6 1 GND
    3 Vo

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

 2017年7月現在、RASPBIAN JESSIE WITH DESKTOPのカーネルは4.9.39で、Pythonのバージョンは2.7.9です。python-smbus(バージョン3.1.1+svn-2)が入っています。

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

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

 Raspberry Piは、最初にI2Cを利用する設定が必要です。連載1回目の説明を参照してください。

 I2Cのデータ転送速度のデフォルトは100kHzです。Raspberry PiにACM1602NIをつないだときデータ転送速度を遅くしないと通信できないことが知られています。変更するときは、/boot/config.txtに、

dtparam=i2c_baudrate=50000

 50kHzを設定します。設定変更は、

sudo nano /boot/config.txt

でテキスト・エディタnanoを立ち上げ、dtparam=i2c_baudrate=50000を最後の行に追加します。CTRL+O、リターン、CTRL+Xで終了し、rebootします。

 ACM1602NIボードは、ブレッドボードに乗せ、半固定抵抗とともに配線します。

動作確認

 I2Cデバイスを利用するとき、ターミナルから、i2cdetectコマンド用いてスレーブ・アドレスを確認するのが一般的ですが、ハングアップするので、実行しないでください。もし実行してしまったときは、LCDのV+をいったん電源から抜き、再度つなぎます。 

 0x38から0x0fまでが初期化です。0x48('H')、0x69('i')、0x21('!')は表示文字です。AQMシリーズとは異なり拡張命令をもっていないので、データのやり取りを8ビットで行い、画面をクリアし、ディスプレイをONにするだけで表示の準備ができます。

 正しく表示できました。

使用例

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

vcgencmd measure_temp

 次のプログラムで、CPU温度を表示させます。前回のAQM1602のようにI2Cでブロック転送をすると、最初のデータは正常ですが、そのあとの文字が表示できなかったので、関数writeLCD()は1データずつ送るように変更しました。

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

def data( code ):
i2c.write_byte_data(addr02, _data, code)
time.sleep(0.2)

def writeLCD( message ):
for moji in message:
i2c.write_byte_data(addr02, _data, ord(moji))
time.sleep(0.02)

def init ():
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(1)

 実行例です。

 温度表示の最後にごみが表示されています。次のように切り出すと、表示されなくなります。

writeLCD(str(res)[0:11])