[トップページへ戻る]

NOKIA3300-LCD/S1D15G10動作テスト

2012年5月
カラー液晶NOKIA3300-LCDの動作テストをしました。USB-シリアル変換とATtiny2313を使い、PC上の画像を表示するプログラムを公開します。LCDコントローラS1D15G10の初期化方法やコマンド/データの送り方など、参考になればと思います。


カラー液晶 NOKIA3300-LCD
aitendo LCDモジュール(128×128)[NOKIA3300-LCD] (2012/05)
データシートはリンク先からダウンロードできます。
(C)aitendo (C)aitendo
説明書の間違いについて
aitendoの商品に同梱されている説明書には間違いがあります。

図の(1),(10)が逆
図中で端子番号を示す白文字の(1),(10)が逆です。正しくは赤文字修正の通りです。横に書いてある、信号名と番号の対応は合っています。左の写真で基板に直接書かれている番号1,10に従って配線してください。

128x128pixels → 130x130pixels
このLCDモジュールの有効表示領域は130x130ドットです。LCDコントローラS1D15G10自体が持つ表示領域は132x132ドットで、これに乗っているLCDパネルの表示領域が130x130ドットです。描画時は上下/左右それぞれ2ドットずつ表示位置を調整する必要があります。

4096colors → 256colors
LCDコントローラS1D15G10の制御方法には、8bitパラレル制御、16bitパラレル制御、8bitシリアル制御、9bitシリアル制御があります。このうちパラレル制御では4096色が表示可能です。シリアル制御では4096色中の256色しか表示できません。NOKIA3300-LCDは9bitシリアル制御固定です。従って256色しか表示できません。

丸形端子の内容
長方形端子の上にある18個の丸形端子の内容は次のようになっていました。
18〜15 14〜5 4〜1
約9.8Vの電源出力 長方形端子に接続 約4.9Vの電源出力
長方形端子の1番(VCC)に3.3Vをかけて使用したところ、丸形端子の両端に4.9V,9.8Vが出ていました。
9.8Vはちょっと電圧を調整してバックライトに使えそう…とやってみましたが、全然パワーがなく、使えませんでした。チャージポンプで昇圧されたもののようです。LCDの回路(ロジック部)を動作させるために使うものでしょう。

データシートの用語について補足
画面内の表示位置はページアドレス、カラムアドレスで指定します。「ページ」は水平1ラインを指します。言葉のイメージから1画面分のバッファを想像してしまうかもしれませんが、そのような意味ではありません。「カラム」は桁位置を指します。つまり、ページ=Y座標、カラム=X座標、です。

描画方法
画面に何かを描画するとき、1ドットごとに座標を指定しながら点を打ったりはしません。
まず、ページ指定とカラム指定により、描画先の位置と大きさ(矩形領域)を決定します。次に、矩形領域の幅×高さのドット数分の色データ(パレットインデックスの指定。1byte:0bRRRGGGBB形式)を連続して与えます。するとLCDは、矩形領域の幅で自動的に折り返しながらドット単位で描画してくれます。
例えば8x8ドットの画像を描画するには、表示位置を決めて64ドット分の色データ(計64byte)を与えます。

通常、ドットはページ優先方向(水平方向)へ描画されて行きますが、カラム優先方向(垂直方向)へ描画することもできます。これは画像を90度回転して描画することに相当します。水平反転、垂直反転と組み合わせて、90度単位の回転ができることになります。※もっとも、PC側で自由に回転させてからデータを送るなら、LCD側の機能は関係ありませんが。

LCDの視野角(視線方向)
LCD(液晶画面)には視野角があります。PCモニタで言う「見える角度の範囲」ではなく、どの方向から見るものか(視線)を意味します。データシートには「Viewing Angle : 6 o'clock」などと書かれています。通常、6時方向か12時方向です。
適正な視野角の方向から画面を見ると、発色は良好です。反対側からだと全体が変色して見え、深い角度だと画面が真っ暗で見えなくなります。
LCDを何に使うかによって(視線の方向)、6時か12時か適当な視野角のLCDを選びます。「まず手元にLCDあり。これを何に使おうか」ということなら、何を作るにせよ視線に合う向きに設置してください。
LCDには画面を垂直反転、水平反転して表示することができるものがあります。ハード的にジャンパー設定だったり、ソフト的にコマンド指定だったり方法はまちまちです。

NOKIA3300-LCDの視野角は6時方向です。
壁に掛け、下から見上げる使い方は向いています。上から見下ろす使い方は向いていません。
机上に置き、手前から見る使い方は向いています。
壁に掛け、上から見下ろす使い方をする場合、視野角が12時方向のLCDを使います。一応、6時方向のLCDも使えます。LCDを逆さに設置し、表示を180度回転(垂直反転+水平反転)すればよいです。
※筐体にぶつかるなど物理的な問題で逆さに設置できないというのは別の話。
LCDを斜めに設置して正面から見る使い方には、6時方向のLCDが向いています。NOKIA3300はモバイル端末なので(すなわち手に持った角度で画面を見る)、まさにこの使い方です。
視野角が12時方向のLCDでも、やはり表示を180度回転すれば、6時方向のLCDと同様に使えます。
※筐体にぶつかるなど物理的な問題で逆さに設置できないというのは別の話。

下の写真はNOKIA3300-LCDの視線方向と見え方の違いを示しています。左端は法線方向から見た様子です。
6時方向からは発色良好。視線を水平に近付けると、輝度は上がりますが画像は見えます。
12時方向からは明らかに色味がおかしく見えます。視線を水平に近付けると真っ暗になり、画像が見えなくなります。

※元にした画像はメガてりやきのニュースリリースより。

カラーパレットについて
NOKIA3300-LCDのコントローラS1D15G10は、8bit/16bitパラレル制御モードのとき4096色が表現できます。
R:G:B=16:16:16階調 → 16*16*16=4096色。
コントローラに対する色指定では色値を直接与えます。具体的には1ドットにつきRGB各4bit、計12bit(パディングして16bit(2byte))のデータを与えます。※2ドット単位で12*2=24bit(3byte)のデータを与える方法もあります。
R:G:B=16:16:16階調の色
. 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F
R
G
B
フルカラー画像(1677万色)を原画とする場合、RGB:256階調を単純にRGB:16階調にスケーリングし、その値(上の表の値)をコントローラに送ればよいです。

NOKIA3300-LCDは9bitシリアル制御モードに固定されています。このモードは4096色表示ができません。上記RGB:16階調の色からR:G:B=8:8:4色を選び、その組み合わせで256色が表現できます(8*8*4=256色)。
どの色を選ぶかは開発者の自由です。選んだ色はパレット色としてコントローラに設定します。従ってコントローラに対する色指定も、色値を直接与えるのではなくパレット値で与えます。具体的には1ドットにつきR:G:B=3:3:2bitのパレットインデックス、計8bit (0bRRRGGGBB形式)のデータを与えます。

ちなみにWindowsの256色表現もパレット方式ですが、そちらは1677万色から自由に選んだ256色をパレット化しており、パレットインデックス0〜255番でダイレクトに色を指します。LCDコントローラS1D15G10の256色表現のパレットとは仕組みが異なります。

さて、そうするとRGB:16階調の中からどうやって8:8:4色を選べばよいかが問題になります。表示する画像の色成分によって毎回最適に選んだパレットを用意するのがベストですが、色を決める処理は複雑です。思い切ってオールマイティに対応できそうなパレットを1つ決めておくのが手っ取り早いと思います。例えば次のようにパレットを決めます。
R:G:B=16:16:16色から8:8:4色を選んだパレット
. 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F
R . . . . . . . .
G . . . . . . . .
B . . . . . . . . . . . .
赤と緑は均等に、青もほぼ均等に選びました。黒寄りの色はカットしても画像の見た目にそれほど影響しません。
※青が4色という制限は厳しく、選び方に困ります。

このパレットでは、自然写真のように無数の色を使っている画像はまずまずの再現度で表示できます。しかしアニメ塗りのように色数が少ない画像だと再現性が劣ります。極端な例では、B=0x0C,0x0D,0x0E,0x0Fの4色で描かれた青いグラデーション画像は再現できません。※処理次第ですが、0x0Bの1色か、0x0Fの1色か、その2色かで塗られた画像になります。

再現性を上げるには、やはり、画像の色味に合わせてR:G:B=8:8:4色を選び、最適化されたパレットを作るしかありません。…というわけで、そのようなプログラムを組みました。
原画 最適化パレット 標準パレット
.
上の表は、敢えて青成分の多い画像で実験した結果です。
パレットを最適化した画像は原画と比べて空、樹木、地面ともに色の再現性が高いように思います。空の右側、白っぽい部分が若干黄色がかっているのが残念です。これは、画像内に青成分が0x0Fとなる部分はここと樹木の先端部しかなく、その他多くの領域では青成分が0x0Fより数段暗いからです。多くの領域に使われる色の再現性を優先するため、狭い領域でしか使わないB=0x0Fをパレット色に採用しなかったということです。
標準パレットの画像は原画と比べて全体的に明るい青寄りの色味へシフトしています。具体的には、空と地面が原画よりも青過ぎ、樹木も青寄りの白になっています。色の再現性が高いとは言えません。
ただ、どちらの画像が正解ということはありません。色味の善し悪しの判断は、見る人の好みにもよります。
※上記PNG画像は、LCDへ転送するパレットデータをさらにWindows表示用に変換したものなので、実際のLCD画面に表示される画像とは違った色味になっています。最適化パレットの画像もLCD上では黄色っぽさはなく、原画に近い色で見えます。

回路図とテストアプリ
回路図

テストアプリ
ダウンロード lcdS1D15G10com.zip AVR ファームウェア(HEXファイルとCのソース)
Windows テストアプリ(EXEファイルとC#のソース)

配線の例 ヘルプ画面 雪原画像で実行した様子

動作電圧
NOKIA3300-LCDをAVR(ATtiny2313)で動かします。PCとの通信にはUSB-シリアル変換デバイスを使用します。
NOKIA3300-LCDに必要な電源は3.3Vです。ということはAVRも3.3V駆動だと都合がよいです。信号線3本がレベル変換なしで直結できます。同様に、USB-シリアル変換デバイスのTXD/RXD線も3.3Vだと都合がよいです。
その点でUSB-シリアル変換デバイスは秋月電子のFT232Rモジュールがお勧めです。ジャンパーの差し替えでI/Oピン(TXD/RXD)を3.3V入出力に設定でき、さらに3.3Vの電源出力ピンもあります。ここにAVRとLCDを接続すれば、あとはLCDのバックライト用7Vないし9Vを用意するだけです。006Pの乾電池で構いません。

LCDのリセットとバックライトの配線について
電源投入後、任意のタイミングでLCDにリセットをかける使い方をする場合、「2:RESET#」はVCCではなくATtiny2313の任意のI/Oピンに接続しておき、負論理で制御します。
バックライト(LED)はロジック部から独立しています。「10:LED V+」の電源投入タイミングは、ロジック部より先・後どちらにずれても構いません。「8:LED GND」はロジック部のGNDに接続しても・しなくても構いません。

テストアプリの使い方
NOKIA3300-LCDに画像を表示するアプリです。用意する画像は縦横任意サイズ、JPEGであること。自動的にリサイズ/減色/センタリングして表示します。
表示完了後、使用したパレットがPC画面に表示されます。このときカーソルキー[↑][↓]でLCD画面の明るさが変わります。その他のキーを押すとアプリは終了します。

実行方法とオプションの説明
コマンドラインから最低限、「画像ファイル名(パスを正しく)」「COMポート番号」を指定してlcdS1D15G10com.exeを実行します。オプションの記述順は自由です。
[Usage]
>lcdS1D15G10com.exe imagefile.jpg -com<n> [-n] [<savepath>]

画像は最適化したパレットで描画されます。「-n」オプションを指定すると、このアプリでの標準パレット(先述の通り)を使用します。また、任意のフォルダパスをオプションに加えると、減色した画像をそこに保存します。
[Options]
-com<n> : (必須) COMポート番号 例: -com2
-n : (任意) 標準パレットを使用する(パレットを最適化しない)
<savepath> : (任意) 減色画像の保存パス 例: c:\mypic

プログラムの説明:ファーム
USARTのボーレートは、ATtiny2313内蔵8MHzで最高速の500kbpsです。※FT232Rモジュールの最高速は460kbps.
動作内容は、LCDのコマンド/データの区別を表す1byteと、続いてそれらの実値をPCから受信し、ATtiny2313のUSI機能を利用してLCD(S1D15G10)に送っています。※余談ですが、他のプロジェクトのソースを使い回したので冗長なところがあります。
USI使用時、クロックパルスの出力時間は最速で 8MHz/2=4MHz → 250ns です(Hi/Lo1回をノーウェイトで出力する場合)。LCDのタイミングチャートより、各項目の最短時間(項目により10〜110ns)の条件を満たす”遅さ”なので、パルス出力処理にウェイトは入れていません。

プログラムの説明:テストアプリ
COMポート相手に通信コマンドとLCDのデータを送信しています。S1D15G10の初期化手順はデータシートの説明通りとし、電源投入直後のデフォルト値のままとするものは一部省略しています。その他の説明はソース中のコメントを参照してください。※やや雑な作りですが、テストアプリなのでご勘弁。
AVR-LCD間の通信は高速ですが、PC-AVR間は文字データ通信なので500kbpsといえども描画は遅くなります。そのため送信データはRLE圧縮し、さらに”ささやかな”小細工をしています。それでも1枚の画像描画に1〜2分かかります。
高速化するにはシリアル通信ではなくV-USB技術を用いるしかないでしょう。送信内容を文字データに変換する無駄が省け、転送量が減ります。通信速度も1.5Mbpsになります(USB1.1 ロー・スピード)。


◆ ◆ ◆
とりあえず動かすだけならデータシートを隅々まで読めば何とかなります。
初期化シーケンスが通るところまで作れたら後は好きなように作り込むだけです。
データの転送効率を上げたり、減色アルゴリズム/パレット最適化を考えて楽しんだりです。


(C) 『昼夜逆転』工作室 [トップページへ戻る]
inserted by FC2 system