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])