概要
SO2002AWWB-UA-WB-Uというパラレル接続有機LEDキャラクタディスプレイを使った実験です。
I2C接続の有機ELキャラクタディスプレイの実験はこちらから。
データシートを読んでいくと、LiquidCrystalライブラリがほぼそのまま利用できることがわかりました。ただ、このOLEDのすべての機能を実装しているわけではなく、また、ディスプレイ上のRAMのアドレスが異なるようです。LiquidCrystalライブラリに実装されているけれども実際は使えない機能もあるようなので、このOLEDに特化してみました。
液晶と違い、とてもきれいです。
目的
SO2002AWWB-UA-WB-Uという有機LEDディスプレイをArduinoから制御できるようにします。標準的なLCDディスプレイの日立のHD44780用のLiquidCrystalライブラリは利用できないとのことなので、Arduinoから利用できるようにしてみます。
このページでは、HD44780との違いを中心にSO2002AWWB-UA-WB-Uの特徴などを記述していきます。
データシート
SO2002AWWB-UA-WB-Uのデータシートを参照して、どのようなものかを調べました。
概要
SO2002AWWB-UA-WB-Uの仕様の概要は以下の通りです。
項目 | 値など |
---|---|
入力電圧(絶対定格) | 5.5V |
入力電圧 | 3.6V |
コントローラ | US2066もしくは同等品 |
通常は3.6Vまでしかかけないほうがよさそうです。ということで、今回は、3.3Vで動作するArduino Dueで試してみました。Arduino Unoなど、5Vで動作するもので利用する場合は自己責任でお願いします。レベル変換を行うパーツなどがあるようです。
また、コントローラには、US2006というチップが使われているということなので、あわせて、US2006のデータシートも少し眺めてみました。
ピンは14本あります。意味と今回の実験のときに接続したArduinoのピン番号は以下の通りです。
OLEDディスプレイのピン | 意味 | Arduinoのピン |
---|---|---|
1 | VSS | GND |
2 | VDD | 3.3V |
3 | コントラスト調整 | - (コントラスト調整用の20キロΩの抵抗を接続) |
4 | レジスタ選択 | 33 |
5 | Read/Write | 31 |
6 | Enable Signal | 30 |
7 | データビット0 | 29 |
8 | データビット1 | 28 |
9 | データビット2 | 27 |
10 | データビット3 | 26 |
11 | データビット4 | 25 |
12 | データビット5 | 24 |
13 | データビット6 | 23 |
14 | データビット7 | 22 |
US2066のデータシートによると、US2066は8ビットのパラレルインターフェイス以外にもI2Cのインターフェイスやシリアルインターフェイスを持っています。パラレルインターフェイスは、8ビットだけではなく4ビットのデータ転送にも対応していて、かつ、6800と8080の双方に対応しているようです。ただし、この設定は、US2066のピンを使った設定であり、SO2002AWWB-UA-WB-Uを使った場合には、設定はできず、8ビットパラレル(6800)で制御することになります。Arduinoのピンを一番消費するモードです。
なお、「IC-736 LCD代替手順」というページでは、4ビットパラレルで利用できるように改造した事例が紹介されています。
LiquidCrystalライブラリで提供されているAPIは実現可能でした。以下に今回実装したAPIを示します。
LiquidCrystalライブラリで提供されているAPIは実現可能でした。以下に今回実装したAPIを示します。
項番 | API | 意味 | HD44780との比較 |
---|---|---|---|
1 | コンストラクタ | オブジェクトを作成する。引数に、I2Cアドレスを指定する。 | 意味は同じだが、SO2002Aでは、データ線は必ず8本必要。 |
2 | begin() | ライブラリを初期化する。 | 同じ。 |
3 | clear() | OLEDの表示を消し、カーソルを(0,0)に移動させる。 | 同じ。 |
4 | home() | カーソルを(0,0)に移動させる。 | 同じ。 |
5 | setCursor() | カーソル位置を指定する。 | 意味は同じだが、DDRAM(Display Data RAM)のアドレス体系が異なるようです。下記参照。 |
6 | cursor()/noCursor() | カーソルを表示する。 | 同じ。 |
7 | blink()/noBlink() | カーソルを点滅させる。 | 同じ。 |
8 | display()/noDisplay() | 表示を行う。 | 同じ。 |
9 | scrollDisplayLeft()/scrollDisplayRight() | 表示されている文字を左右に1文字ずらす。 | 同じ。 |
10 | autoscroll()/noAutoscroll() | 自動スクロールを行う。 | 同じ。 |
11 | leftToRight()/rightToLeft() | 文字の表示方向を設定する。 | 同じ。 |
12 | createChar() | ユーザ定義の文字を作成する。 | 同じ。 |
13 | singleHeightFont()/doubleHeightFont() | フォントの高さを設定する。 | 追加。 |
14 | selectCharacterRom() | フォントセットを選択する。 | 追加。下記参照。 |
15 | setScrollQuantity() | スクロール量を指定する。 | 追加。 |
16 | setContrastControl() | コントラストを調整する。 | 追加。 |
17 | setFadeOutAndBlinking() | フェードアウトとブリンク。 | 追加。 |
DDRAMアドレス
SO2002AWWB-UA-WB-UのDDRAM(Display Data RAM)のアドレスは、SO2002AWWB-UA-WB-Uのデータシートには明記されていませんでしたが、試してみたところ以下のようになっているようです。アドレスは16進数です。
列→ | 1 | 2 | 3 | 4 | 5 | … | 18 | 19 | 20 |
---|---|---|---|---|---|---|---|---|---|
1行目 | 00 | 01 | 02 | 03 | 04 | … | 11 | 12 | 13 |
2行目 | 20 | 21 | 22 | 23 | 24 | … | 31 | 32 | 33 |
US2066のデータシートによると、5ドットフォントの2行表示の場合の2行目は0x40から始まるようですが、SO2002AWWB-UA-WB-Uでは、5ドットフォントの3行もしくは4行表示のアドレス体系となっているようです。
左に1文字ずらした後のアドレスは以下の通りです。
列→ | 1 | 2 | 3 | 4 | 5 | … | 18 | 19 | 20 |
---|---|---|---|---|---|---|---|---|---|
1行目 | 00 | 01 | 02 | 03 | 04 | … | 11 | 12 | 13 |
2行目 | 21 | 22 | 23 | 24 | 25 | … | 32 | 33 | 00 |
右に1文字ずらした後のアドレスは以下の通りです。
列→ | 1 | 2 | 3 | 4 | 5 | … | 18 | 19 | 20 |
---|---|---|---|---|---|---|---|---|---|
1行目 | 00 | 01 | 02 | 03 | 04 | … | 11 | 12 | 13 |
2行目 | 33 | 20 | 21 | 22 | 23 | … | 20 | 21 | 22 |
フォントセット
SO2002AWWB-UA-WB-Uは、フォントセットを3種類持っています。括弧内は、selectCharacterRom()の引数に渡すマクロです。
種類 | 概要 |
---|---|
ROM A(SO2002A_CHARACTER_ROM_A) | 何の文字かわからず |
ROM B(SO2002A_CHARACTER_ROM_B) | 何の文字かわからず |
ROM C(SO2002A_CHARACTER_ROM_C) | カタカナ入り |
ソース
SO2002Aというクラスを作成しました。Arduino Due以外でコンパイルしたときはエラーが出るようにしてあります。Arduino Due以外で使う場合は、SO2002A.hの最初のほうを自己責任でいじってください。
Githubのリポジトリはこちら。
その他
今回は20列×2行のOLEDを利用しましたが、16列×2行のOLEDも販売されています。おそらく同一のソースで動くのではと考えているのですが、試していただける方がいらっしゃるとありがたいです。
バージョン
Hardware: | Arduino Due |
Software: | Arduino IDE 1.5.2 |
最終更新日
July 14, 2024