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を別電源で動かすようにします。