秋月カラー液晶の実験

だいぶ前から秋月で300円の詳細カラー液晶 が販売されていました。
(最近はバックライト用インバーターとセットで1000円もあるみたいですね。)
で、販売開始直後に購入したはいいけど、なかなか手を出せていなかったものを ようやく重い腰を上げて手を出してみました。
正確に言うと、4年になりサークルをほぼ引退状態になったため、細かいものを作る時間ができた っていうのが本音です^^;
なお、この液晶を動かすにあたって
naruさん :フルカラーLCDモジュールの解釈
長船さん :TURQUOISEの製作
xcrOSgS2wYさん:秋月カラーグラフィックLCDモジュールの解析
のサイトを参考にしました。表示方法に関しては上記のサイトで十分な説明が行われているので、 そちらを参考にしてください。ここでは上記サイトではあまり触れられていない、表示するに当たって 必要になる回路と、プログラムについて説明したいと思います。

大まかなことはブログ に書いてあるので、そこを参照してもらうとして、 ここでは回路の説明とプログラムの説明をしたいと思います。

08/05/12 暫定公開
08/05/14 画像追加
08/05/18 ソース追加

回路編

ブログにも書いたとおり、この液晶を動かす上で、面倒なことの筆頭に電源があります。 細かいことは不明ですが、±5〜15[V]程度が必要なようです。 この電圧は高いほうが液晶の発色がよいようです。長船さんによると±15[V]が標準ではないか、ということでした。
ということで、まずは電源を用意しないといけません。この液晶に必要な電源をおさらいすると
となります。
実際はロジック系電源もアナログ回路とかもあって分かれてるんですが、とりあえず全部同じ規格でそろえれば問題ないようです。
手っ取り早く実験したいときは、バックライトとのセットを買ってきて、12[V]のACアダプタを電源にすることです。 ロジック系の電源は7805からでも簡単に取れるし、液晶駆動の負電圧は秋月で売ってるLT1054を使うと簡単に作れます。 要するに12[V]から5[V]と-12[V]を作る方法です。
ただし、この場合、インバータが5[V]仕様のため、7805から電源を取ることとなり、7805が結構発熱します。
インバータは200〜300[mA]程度流れるので、損失P[W] は (12[V] - 5[V]) * 300[mA] = 2.1[W]となります。 熱いわけですね。破壊に至るほどではありませんが、きちんとした放熱をしたほうがいいでしょう。

では、手っ取り早くなくやる方法とはどんなんでしょうか。
今回、自分が実験に使用した電源は5[V]の単電源です。ようはUSBからの給電だけで動かしたかった^^;
ロジック、インバーターはそのまま取ればいいので楽チンですが、液晶駆動用が問題になります。 負電圧を反転して作るにしても、まずは5[V]を昇圧しなくてはいけません。 そこで考えたのが同じく秋月で売ってるMAX662です。こいつはプログラマブルデバイスの書き込み電圧作成用ICで、 5[V]から簡単に12[V]を作ることができます。しかも外付け部品は0.1[uF]のコンデンサのみ!
早速ブレッドボードで実験してみましたが、見事に失敗しました。出力電圧が落ちまくっています。 naruさんとこの掲示板で液晶駆動電流が10[mA]を切るような話も出ていたので期待していたのですが、 負電圧の大本にもするには荷が重すぎたようです。
そこで今回はNJM2360というICを使用することにしました。 こいつは発信回路と1.5[A]出力可能なスイッチを備えたスイッチング電源用ICです。
データシートを読んでみると昇圧に必要な回路は載ってるし、その回路に必要な計算式もすべて載っていたので 簡単に回路設計をすることができました。
購入は秋葉原のラジオデパート2階、サンエレクトロにて100円。鈴商にて300円。
NJM2360を使えば負電圧も作れるんですが、外付け部品がそこそこあるので、負電圧はLT1054で行くことにしました。
ということで電源周りの回路図です。
この液晶は各色6bitの計18bitを高速に操作する必要があるので、IO数の多いATmega644Pを選択しました。 別に面実装のデバイスでもよかったんですが、ブレッドボードで実験していた関係でDIPの手に入る644Pにしました。 電源回路以外はマイコンと液晶が直結しているだけなので非常に簡単な回路ですね。
ついでに回路の写真も。
今は実装していませんが、今後のためにシリアル通信用の端子とUSBシリアル変換ICのスペースは空けてあります。
あと、苦労したのは0.5mmピッチのコネクタ。ICだったら足の上にウレタン被膜線を半田付けできますが、 このコネクタは足の長さが短い上に、コネクタ部分が長く熱がどんどん逃げてしまい、なかなかうまく半田付けできませんでした。
そこで今回はサンハヤトのエクステンション基板を利用しました。 これは単純に0.5mm間隔でまっすぐにランドが引かれているシートタイプ基板なのですが、 これを利用することでウレタン被膜線を半田付けするのに十分な足の長さを確保できました。
写真をクリックすると原寸大に拡大できます。6Mピクセルなんで注意してください。というか、そんなに半田付けはうまくないので…
この部分のウレタン被膜線にはφ0.23mmを使っています。 基板の色が白いのでブリッヂしてるかしないかがわかりにくいのでテスターであたるのが無難だと思います。
ちなみにFPCケーブルを手に入れることができないor実験だけ簡単に済ませたいというなら、 液晶側のコネクタを取り去って直接ウレタン被膜線を半田付けするのが簡単です。
こっちはランドの大きさも大きいので割合簡単に半田付けできます。
細かい半田付けをするときのよくあるのがひたすら細いこてを使おうとする人。 実は場所によっては余計に半田付けしにくくなります。細いことはこての先端の熱容量が小さいので、 配線なんかを半田付けしようとするとすぐにさめてしまいます。 自分はgootのこて(PX-201)で最初についてきた太さのものですべて半田付けしています。 長年つかっているってのもありますが、これが一番使いやすい。

直接回路とは関係ありませんが、悩んだことのメモ
プログラムもとりあえず動きそうなものができて、画面を映してみると、なんかもにょもにょしてる。 毎スキャンごとに色の濃淡が変わっている感じ。最初はプログラムがおかしいのかとも思ったけど、 そんなはずもなく。naruさんと長船さんに助けを求めたところ、液晶の裏面にある調整用抵抗をいじって解決することがわかりました。 後からxcrOSgS2wYさんの記事をよくよく読んでみたら、液晶裏の半固定抵抗で液晶駆動電圧の平均値を調整しているそうな。
液晶というのは、駆動電圧の平均値が0[V]になるように動かさないと壊れてしまいます。そのため、電源電圧等が変わった場合は 駆動電圧の平均値を調整してあげないといけないわけですね。考えたら半導体デバイスの授業で習いましたよ。寝てたけどorz
というわけでもにょもにょはだいぶ薄くなりましたが、リフレッシュが遅いので感激するほど綺麗にはなりません。

プログラム編

この液晶には制御回路は乗っていません。つまり各画素について毎回色の指定をしてやらないといけません。 具体的には上のリンクの方々のサイトを見ていただくとして、やらなきゃいけない操作は を出すことです。
クロックの立下りエッヂで色や同期信号を取り込むらしいです。それさえわかればひたすらクロックにしたがって データを送り続ければいいだけです。これを連続的に書けば といった感じです。とっても簡単。そうなんです。やること自身はとっても簡単なんです。
では何が問題かというと、必要なクロックの速度です。この液晶は400*96画素なので、合計で38400画素あります。 これを一秒間に60回更新しようとすると(PCのモニタはこの速度)、約2.3[MHz]のクロックが必要になります。 20[MHz]が原発のmega644では10命令でループさせても間に合わない計算になりますね。つまり無理だということになります。
ということで、この液晶をマイコンで動かしている人たちは、リフレッシュレートをあきらめてとりあえず動かすことにチャレンジしている人が多いです。 ここでもその方式で行きたいと思います。
まずは表示データをどうするかという問題ですが、ただ模様を出すだけなら適当にポートの値をいじってやれば簡単にできるので、 そこそこな速度で表示できます。しかし、ここはカラー液晶。ぜひとも画像データを表示したい。 今回はがんばってC#を勉強してPC上でbmpファイルをC言語の配列に変換するプログラムを組んで見ました。 WinAVRの問題で配列は8bit*3の形でしか用意できなかったため、フル画素で表示しようとすると
400*96*8*3=921600[bit]=115.2[KByte]
もの容量になってしまいます。外部メモリなんかに表示データをおけば格納できますが、 ただでさえ遅いリフレッシュレートがさらに遅くなるのは明白です。
なので今回はデータの横を半分にして、表示するときに引き伸ばすという方法でごまかしました。 そうすると、115.2/2=57.6[KByte]となるのでフラッシュロム領域が64[KByte]のmega644に収まります。 表示するプログラム自体は簡単なループだけなので1[KByte]もあれば収まるだろうという希望の元での話ですが^^;
そんなこんなでできたのがこのプログラム
bmpコンバーター 実行ファイル
bmpコンバーター ソース
ATmega644pソース
表示データ(455KBもあるんで、メモ帳で開くと時間かかります。)
ATmega644pヘッダ
単にループするだけでは芸が無いので、少しだけでもリフレッシュレートがあげられるように、小細工がしてあります。 まぁそんなに大げさなことをしているわけではなく、水平同期と垂直同期の有効無効を条件分岐で行うのではなく、 ある場所決めうちで出すというものです。クロックループの中にif文がなくなるのでそこそこ速くなります。
また、無駄領域(表示されない領域)をxcrOSgS2wYさんのサイトを元に一番狭くしてあります。 そのおかげで7[FPS]程度は出ているようです。でも遅い。 なんでこんなに遅いのかと思ったら、表示データを取りに行くのに時間がかかっているようです。 8bitマイコンなんで、長い配列になると時間がかかるんですね。
PORTA = prog_read_byte[]
の一行だけで30命令近くの時間がかかってます。ためしにここをPORTA=0xFF;見たいに埋めてやると速くなります。 AVRStudioはソフトウェアデバッガで実験できるので楽チンですね。
ためしにprog_read_byteに変わるアセンブラ関数を書いてみましたが、あまり時間は変わりませんでした。 配列のおき方を工夫するともう少しはやくなりそうな感じですね。
今回は簡単に済ませたかったのでC言語でやりましたが、チューンするならALLアセンブラで書くことです。 というか、書きたい。どれくらい速くなるのかな。まぁそれでも10[FPS]が山になるのかなぁ。

覚書
プログラム領域にデータを埋め込むときはを使う。
AVRStudio(WinAVR?)では配列の長さはint分(32768)まで。それ以上は正確なデータを得られなかった。

総括

以上長々とレポートを書いてみましたが、この実験が生まれて初めてのカラー液晶表示になります。 いやぁ楽しかった。いろいろ悩んだけど楽しかった。
ぜひともFPGAかCPLDを使えるようになって長船さんのように滑らかな動画表示ができるようになってみたいですね。
あとはnaruさんがマイコンでも高速表示できるように画策しているようなので、こちらもその線で考えてみるのも 非常に面白そうです。



このページはstrvによって製作されたものであり、著作権はstrvに帰属します。
そのためこのページ内の写真や文章の無断引用、コピーなどを禁止します。
また、コンテンツの関係上、さまざまな会社の製品を取り扱いますが、
それらの会社とstrvは一切関係ありませんので、ご了承お願いいたします。
なお、このページにおいて著作権などの問題がある場合はメールをしてください。対処します。