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

番外編;SO1602

 SO1602はAQM1602と同じく、1行に16文字、2行表示のコンパクトなキャラクタ表示OLEDです。I2CでRaspberry Piと接続するだけで、認識して利用できます。

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

 2017年7月現在、秋月電子通商でSO1602は1,580円です。LCDと異なり文字が発光するので、視認性がよいです。消費電流が50mAと多いのが欠点です。

 配線は4本だけです。写真の状態で、左から1番ピンです。スレーブ・アドレス設定用のSA0(4番)は解放にしています。5番と6番および10番以上はNCなので、何もつなぎません。

RaspberryPi-GPIO SO1602
3.3V 1 2 Vcc
SDA 3 8と9 SDA
SCL 5 7 SCL
GND 6 1 と/CSの3番 GND

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

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

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

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

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

 I2Cのデータ転送速度のデフォルトは100kHzです。SO1602はデータシートから400kHzに対応していることがわかります。100kHzのときは設定を変更しないでよいのですが、400kHzに変更するときは、/boot/config.txtに、

dtparam=i2c_baudrate=400000

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

sudo nano /boot/config.txt

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

 SO1602ボードは、ブレッドボードに乗せて配線しました。

動作確認

 I2Cデバイスを利用するとき、ターミナルから、i2cdetectコマンドで、スレーブ・アドレスを確認します。 

 0x01が初期化です。0x48('H')、0x69('i')、0x21('!')は表示文字です。初期設定は内部で行われるらしいので、画面をクリアするだけで表示の準備ができます。

 正しく表示できました。

使用例

 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=0x3c #OLED
_command=0x00
_data=0x40
_clear=0x01
LCD_2ndline=0x20+0x80

#OLED SO1602
def command( code ):
i2c.write_byte_data(addr02, _command, code)
time.sleep(0.2)

def writeLCD( message ):
mojilist=[]
for moji in message:
mojilist.append(ord(moji))
i2c.write_i2c_block_data(addr02, _data, mojilist)
time.sleep(0.02)

#main
command(_clear)
writeLCD("CPU: ")

while 1:
command(LCD_2ndline)
res = subprocess.check_output(['vcgencmd','measure_temp'])
print res
writeLCD(str(res))
time.sleep(1)

 実行例です。GPIOの1番ピンの電圧を測っていると、OLEDの消費電流が多いので3.3V以下になります。ほかのデバイスとこの3.3V端子を共用すると、電圧が低くて正常に動作しないかもしれません。その場合、OLEDを別電源で動かすようにします。