Raspberry PiとI2C接続のキャラクタ・ディスプレイ その3 LCDのAQM1602A

I2Cの規格は厳密

 I2CのStandard Modeでは、HighとLowの電圧規定は次のようになっています。Vdd=3.3Vとします(http://www.nxp.com/documents/user_manual/UM10204_JA.pdf)。

  • VIL(Low Level Input Voltage) :-0.5V~0.99V(1.5V固定の例外もある)
  • VIH(High Level Input Voltage):最小2.31V(3V固定の例外もある)

 smbusでは少し異なります(http://pmbus.org/Assets/PDFS/Public/SMBus_3_0_20141220.pdf)。

  • VIL:~0.8V
  • VIH:1.35V~VDD

 Raspberry PiにはI2Cバスにプルアップ抵抗1.8kΩが実装されています。8ビット・マイコンのサンプルでは10kΩが使われていたので、ずいぶん小さな抵抗値です。

キャラクタLCDモジュールのAQM1602Aをつなぐ

 ラズパイのI2CインターフェースにAQM1602Aをつなぎます。電源電圧は3.1~5.5Vなので、3.3Vで利用します。消費電力は3.3V時に1mAと省エネ・デバイスです。1行に16文字、2行の表示ができます。これは、前に使ったSO1602Aと同じ表示文字数です。

 変換基板のI2Cラインにはプルアップ抵抗10kΩは実装されていますが、デフォルトではつながっていません。

I2Cツールで接続を確認

i2cdetect -y 1

 何も表示されません。何十回か繰り返すと、3eの表示が出ることがあります。SDAラインがLowレベルを満たしていないため、簡易的に、2.2k~3kΩでGNDにプルダウンする対応策がネット上で紹介されています。3kΩをつなぐと、3eに存在することが確認できます。

 プログラムです。データシートを参考にしながら、初期化のコードを送ります。一つのコードを送ると少し時間を置きます。これは、LCDの内部処理に時間がかかるからです。Pythonの利用方法は、

  Raspberry PiとI2C接続のキャラクタ・ディスプレイ その2 Pythonでプログラム

を参照ください。繰り返しLCDへ書き込んでいる0x31はアスキ・コードの'1'です。

#!usr/bin/env python
# -*- coding: utf-8 -*-
import smbus
import time

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 AQM1602
i2c.write_byte_data(addr02, _command, 0x38)
time.sleep(0.2)
i2c.write_byte_data(addr02, _command, 0x39)
time.sleep(0.1)
i2c.write_byte_data(addr02, _command, 0x14)
time.sleep(0.1)
i2c.write_byte_data(addr02, _command, 0x73)
time.sleep(0.1)
i2c.write_byte_data(addr02, _command, 0x56)
time.sleep(0.2)
i2c.write_byte_data(addr02, _command, 0x6c)
time.sleep(0.2)
i2c.write_byte_data(addr02, _command, _home) # マニュアルは 0x38
time.sleep(0.1)
i2c.write_byte_data(addr02, _command, _clear)
time.sleep(0.1)
i2c.write_byte_data(addr02, _command, display_On)
time.sleep(0.1)

#test
while 1:
         i2c.write_byte_data(addr02, _data, 0x31)
         time.sleep(0.2)

 i2c-01.pyというファイル名で保存します。sudo chmod 755 i2c-01.pyで実行権を付けます。python i2c-01.pyと入力して実行すると、ずっと'1'を表示し続けます。

 この様子をオシロスコープで観測します。

 マスタ(ラズパイ)からアドレス03exを送ると、スレーブのAQM1602AがACKで応答します。ACKが中途半端な電圧になっているのがわかります。3kΩでGNDへ引っ張らないと、もっと高い電圧なので、ACKとして認識されず、i2cdetectで表示されなかったのでしょう。Highの電圧も規格を満たすぎりぎりです。

電圧レベルを調整するためにバス・リピータを入れる

 簡易的に3kΩの抵抗でSDAラインのLow電圧を確保しましたが、バス全体に影響を与えてしまうので、ほかのデバイスをつないだときに正常に動作しない可能性を残しています。

 たくさんのI2Cデバイスをつなげるとき、ラインにぶら下がる容量の増加などで波形がなまったり、速度が出ないことを避けるのが目的でバス・リピータがNXPから販売されています。下記のパーツを秋月電子通商から購入しました。

  • I2CバスリピーターPCA9515AD I-10882
  • SOP8(1.27mm)DIP変換基板 金フラッシュ (9枚入)P-05154
  • 基板用リードフレーム SS2.54-6SN (25本入)C-07011

はんだ付け

 プリント基板を一つだけ切り離します。

 プリント基板の上にPCA9515ADを載せます。この方向で載せると、PCA9515ADの1ピンがDIPになったときの1ピン・マークとつながるのをテスタで確認しました。

 幅を数ミリにカットしたテープで固定します。

 1ピンだけはんだ付けをし、横から観測し、浮いていたらICをしっかりと押し付けてはんだで温めます。

 すべてのピンをはんだ付けし終わったら、リード・フレームを挿し込み、はんだ付けします。これも、1ピンだけはんだ付けをし、浮きやゆがみがあれば修正します。

 はんだ付けが完了しました。不要な部分を切り離し、リード線のゆがみを修正します。

バス・リピータを介してラズパイとAQM1602Aをつなぐ


 1ピンはNC=No Connectionなので、リードを根元からカットします。LCD側でプルアップ抵抗を有効にします。ランドにはんだをもってショートさせます。

 python i2c-01.pyと入力して実行すると、ずっと'1'を表示し続けます。

 このときの電圧をオシロスコープで観測します。どのレベルも規格内に入っています。