秋月電子などで販売されている有機ELディスプレイ(i2c接続)をラズベリーパイPicoで使う方法を説明したいと思います。
秋月電子の説明書によりますと、 電源投入時(自分でイニシャライズするのをお勧めしますが)イニシャライズされると書いてあります。 また Arduino のサンプルプログラムも載っていますので、それを元にマイクロ Python でプログミングしてみました。
用意するもの
- Windowsパソコン
- ラズパイピコ
- SO1602有機ELディスプレイ
- ブレッドボード
ラズベリーパイと接続
1、3ピンはVSS接続。
4番ピンも今回VSSに接続したのでスレーブアドレスは0x3cになります。
2番ピンは3.3Vに接続。
7番ピンはSCLでラズパイピコのGP1に接続。
8番9番ピンはSDAでラズパイピコのGP0に接続。
SCL,SDAラインは、ラズパイピコにて内部ブプルアップなされているので、外部プルアップ抵抗は必要ありません。
残りのピンは未接続です。
下図が実際の写真です。
プログラム
これからプログラミングしていきます。
最初各種パラメータを設定します
svadrSo1602 = 0x3c #スレーブアドレス
dataSo1602 = 0x40 #データ送信コマンド
commdSo1602 = 0x00 #コマンド送信コマンド
DisplayON = 0x0c #ディスプレイ、オン 0cはカーソルなし、0eはあり,0dはブリンクかな
ClearDisplay = 0x01 #クリアー
ReturnHome = 0x02 #ホームポジション
i2c設定
まずはi2cの設定を行います。
今回SCLはピン1、SDAはピン0 周波数200KH(400kまで可能)です
import time
from machine import Pin, I2C
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=200000)
コマンド、データ送信設定
コマンドと、データを送信すプログラムです、秋月さんのデータによるとマイクロパイソンでは下記のようになります。
i2c.writeto_mem(svadrSo1602, dataSo1602, bytes([data & 0xFF])) #dataはまだ定義されてない
i2c.writeto_mem(svadrSo1602, commdSo1602, bytes([commd & 0xFF]))
i2c.writeto_mem のパラメータは(スレーブアドレス)、(コマンド、データ選択)、(送るデータ)です。
上がデータ送信、下がコマンド送信です。
コマンドで(0x80)を送信してデータを送れば1行目に表示、(0X20+0x80)を送信してデータを送れば2行目の表示です。
コマンドとデータが送信できれば8割がた完成です、あとは関数化(クラスでも)して使いやすくするだけです。
カタカナ表示
カタカナ表示表示ができるよう今回辞書型配列を使い、変換してみました。
下記が配列です
kana={"ア":177,"イ":178,"ウ":179,"エ":180,"オ":181,
"カ":182,"キ":183,"ク":184,"ケ":185,"コ":186,
"サ":187,"シ":188,"ス":189,"セ":190,"ソ":191,
"タ":192,"チ":193,"ツ":194,"テ":195,"ト":196,
"ナ":197,"二":198,"ヌ":199,"ネ":200,"ノ":201,
"ハ":202,"ヒ":203,"フ":204,"ヘ":205,"ホ":206,
"マ":207,"ミ":208,"ム":209,"メ":210,"モ":211,
"ヤ":212,"ユ":213,"ヨ":214,"ラ":215,"リ":216,
"ル":217,"レ":218,"ロ":219,"ワ":230,"ン":231,
"゜":242,"゛":241
}
関数化する
プログラムをこのようにまとめてみました。
import time
from machine import Pin, I2C
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=200000)
svadrSo1602 = 0x3c
dataSo1602 = 0x40
commdSo1602 = 0x00
DisplayON = 0x0c
ClearDisplay = 0x01
ReturnHome = 0x02
kana={"ア":177,"イ":178,"ウ":179,"エ":180,"オ":181,
"カ":182,"キ":183,"ク":184,"ケ":185,"コ":186,
"サ":187,"シ":188,"ス":189,"セ":190,"ソ":191,
"タ":192,"チ":193,"ツ":194,"テ":195,"ト":196,
"ナ":197,"二":198,"ヌ":199,"ネ":200,"ノ":201,
"ハ":202,"ヒ":203,"フ":204,"ヘ":205,"ホ":206,
"マ":207,"ミ":208,"ム":209,"メ":210,"モ":211,
"ヤ":212,"ユ":213,"ヨ":214,"ラ":215,"リ":216,
"ル":217,"レ":218,"ロ":219,"ワ":230,"ン":231,
"゜":242,"゛":241
}
def writeDataSo1602(data):
i2c.writeto_mem(svadrSo1602, dataSo1602, bytes([data & 0xFF]))
time.sleep_ms(1)
def writeCommdSo1602(commd):
i2c.writeto_mem(svadrSo1602, commdSo1602, bytes([commd & 0xFF]))
time.sleep_ms(1)
def clear_1602():
writeCommdSo1602(ClearDisplay)
time.sleep_ms(10)
def home_1602():
writeCommdSo1602(ReturnHome)
time.sleep_ms(1)
def on_1602():
writeCommdSo1602(DisplayON)
time.sleep_ms(1)
def write_1602(L,da):
if type(da) is int :
da=str(da)
ab=len(da)
for i in range(16-ab):
da+=" "
if L == 0:
writeCommdSo1602(0x80)
else:
writeCommdSo1602(0X20+0x80)
for i in da:
if ord(i) >= 12440:
writeDataSo1602(kana[i])
else:
writeDataSo1602(ord(i))
clear_1602()
on_1602()
home_1602()
write_1602(0,"123456abcdefg")
write_1602(1,"アイウエオカキクケコ")
動かしてみる
簡単に関数の使い方を説明して、実際に動かしてみたいと思います。
clear_1602() 画面クリアー
on_1602() 画面表示オン カーソルなし
home_1602() ホームポジション
write_1602には2つのパラメーターを設定しました、 1番目は表示する行です 、2番目は表示するデータとなります データは文字列または数字です。
扱える文字列は半角英数 または全角カタカナになります。
カタカナの濁音は2文字でで表します。
例えば濁音、ダ、の表示の場合カタカナの タ + ゛2文字で表します。
濁点の部分は漢字入力モードで、シフトキーと数字の2を押して、次もシフトキー押したままスペースキーを押して、全角記号゛を選びます。
破裂音の場合も パ の表示 パ + ゜2文字で表します゜の部分は漢字入力モードで、シフトキーと数字の7を押して、次もシフトキー押したままスペースキーを押して、全角記号゜を選びます。
厳密なチェックはしてません文字バケする時があるかもしれません。
名前を付けてファイルとして保存すれば、import で呼び出して使えます。
プログラムの見通しが良くなり、つかいやすくなると思います。