AVR 汎用I/Oポートで直接LCDを駆動する

AVR LCD target hardware 液晶表示器(LCD)には消費電力の少なさ、表示の鮮明さ、たくさんの情報を表示できるなど、他の表示器に比べて多くのメリットがあります。 特に、電卓、時計、家電製品の表示装置として製造されているセグメント型LCDには、数字以外にも特殊なアイコン用意されている場合が多く、少ない表示面積でユーザーに分かりやすいインターフェースを提供しています。 使わなくなった家電製品などから、これらのLCDを取り出して自作の工作に利用できればユーザー・インターフェースの設計に幅が広がるのではないかと思います。

今回は、専用ICを使わずにセグメント型LCDをマイコンで駆動する実験を行ってみたいと思います。


LCDについて

LCDのしくみ

TN液晶の動作原理図
TN型液晶の動作原理図 (クリックで拡大)

LCDには色々なタイプがあります。 今回の実験で使用するのはパッシブ型の反射型液晶(多くの場合、TN、またはSTNタイプ)です。 ガラス上に配置された透明電極の間に液晶物質をサンドイッチした比較的簡単な構造になっており、二つの電極の電圧、つまり電極間の電界の強さによって液晶分子の構造を変化させ、それによって生じる光学的変化を表示に利用しています。

(注意)液晶自身は発光しないので厳密には適切ではないかもしれませんが、この記事中では便宜上、LED表示器などと同様に「点灯」「消灯」という言葉を使用します。 光学特性が電気信号により変化してセグメントの形状を視認できる状態を「点灯」、その逆の状態を「消灯」と呼びます。


LCDの駆動方法

セグメント型のLCDでは共通電極(コモン)と各セグメントの電極の電圧を制御することで特定のセグメントの点灯/消灯を切り替えます。 しかし、液晶物質に直流の電界を加えると電気分解などの作用により液晶が劣化してしまうので、電極に加える制御電圧は直流成分をゼロにした交流でなければなりません。 30Hz〜150Hz程度の周波数で駆動することが多いようです。

スタティック駆動では、たとえば、図のような電圧を加えることにより点灯・消灯をセグメントごとに制御します。 点灯時のセグメントーコモン間の電位差は±Vとなり、消灯時のセグメントーコモン間では0となっています。


7セグメントLEDによる数字表示と同様に、桁数が多くなると必要な端子数が比例して多くなります。 少ない配線、ポート数で制御するため、多桁のセグメント型LCDのほとんどは3本以上のコモン電極を使ってダイナミック駆動により制御します。

ダイナミック駆動では、少々複雑な駆動電圧を要します。

まず、複数のコモン電極には、位相の異なる交流電圧を加えておきます。 このコモン電圧に対して、点灯したいタイミングでは電位差が高くなるように、消灯したいタイミングすべきでは低くなるように制御した電圧をセグメント電極に加えます。 LCD専用のコントローラーICでは、点灯時と消灯時の電圧の比を大きくして高いコントラストを得るために、電極に印加する電圧は何段階かに分割して細かく制御することができます。

デューティとバイアス

LCDの制御用語として、時間軸方向の分割を「デューティ」と呼び、電圧方向の分割を「バイアス」と呼びます。 LCDコントローラーやLCDC内蔵マイコン(AtMega169など)のデータシートなどをみると、この駆動波形が描かれていることがあります。 下図は、今回実験した「1/3デューティ、1/2バイアス」、および「1/3デューティ、1/3バイアス」の駆動電圧の例です。


波形を見るとちょっと複雑に見えますが、位相単位での点灯・消灯に注目して考えると理解しやすいと思います。 どちらの方式も、点灯するセグメントには大きな電力が加わるように、同時に、消灯するセグメントでは小さな電力になるようになっています。


バイアス電圧の出力

ここでは、アンプやアナログスイッチを使用せずに、以下のような方法で簡易的な分割電圧の出力を行っています。

  • AVRの汎用ポートをつかってアナログ出力(1/2バイアス)を得る
  • 1/2バイアスでは、0, 1/2, 1の三つの電圧が必要となります。 LCDはインピーダンスが非常に高く駆動電流をほとんど必要としませんので、下記のような回路でポートをハイ・インピーダンス状態にすると、1/2バイアス出力を汎用ポートから取り出すことができます。

    AVR port 1/2 bias output
    1/2バイアス用の回路
    PORTxn DDxn 出力
    0 1 0 (Low)
    1 1 1 (High)
    0 0 1/2 (ハイ・インピーダンス)
    AVR port 1/2 bias waveform
    1/2バイアス出力のテスト波形

  • AVRの汎用ポートをつかってアナログ出力(1/3バイアス)を得る
  • 1/3バイアスでは、0, 1/3, 2/3, 1の四つの電圧が必要となります。 AVRの汎用ポートの内蔵プルアップ抵抗がビット単位で操作できることを利用して、1/2バイアスと同様に下記のような回路で1/3バイアス出力を得ています。

    データシートによると内蔵プルアップ抵抗 Rpu の値は20kΩ〜50kΩとなっています。今回の実験では、約30kΩとして計算しています。

    AVR port 1/3 bias output
    1/3バイアス用の回路
    PORTxn DDxn 出力
    0 1 0 (Low)
    1 1 1 (High)
    0 0 1/3 (ハイ・インピーダンス)
    1 0 2/3 (プルアップ)
    AVR port 1/3 bias waveform
    1/3バイアス出力のテスト波形

実験に用いた部品

ジャンクLCDの加工

今回実験に使ったLCDは正体不明のジャンク品から取り出したものです。 そのままでは接続できませんので、基板上のコントローラーとLCDの配線を切断したのち、LCD電極へ接続するためのコネクタを取付け、UEW線で配線しました。 また、LCDのガラス面の電極と基板を接続している異方性導電ゴム(特定方向にのみ電気を通すようになっているプラスチック)がしっかり固定されるようにプラスチック板をねじ止めして固定しています。 このとき、ガラス面の電極と基板の電極が正しく接続されるように位置をきっちり合わせることが大切です。

junk lcd

謎の表示装置
junk lcd

基板を取り出す
junk lcd

LCDを取り外す

junk lcd

LCDへの配線を追加
junk lcd

コネクタの追加
junk lcd breakout

LCD基板完成

なお、この表示装置は基板上にコントローラーがあるタイプ(COB; chip on board)なので直接駆動するための電極へ配線をすることができましたが、ガラス基板上(COG; chip on glass)や、フレキ配線上(COF; chip on film)にコントローラーがあるタイプでは手配線ができないため、上記の方法では使用できません。


LCDの電極を探す

順々に二つの電極を選んで図のように電圧1〜3V、周波数100Hz程度の矩形波を入力し、点灯するセグメントがあるか確認します。 点灯した場合は、どちらかの電極がセグメントに接続されており、もう一方がコモン電極に接続されていると推測できます。 順々に試して、電極の番号と点灯したセグメントの形状を記録し、全体の接続を推測します。

なお、液晶の電極をオープンにしたままだとインピーダンスが高く、静電気やノイズにより、複数のセグメントが点灯したり、電圧を加えなくても点灯してしまう場合があります。この場合、全ての電極を10kΩ程度の抵抗を通してGNDにプルダウンするとうまくいきます。

Find out LCD wiring
LCDの配線を解析する

他にも手がかりとして、光を当てる方向によってガラス面上の透明配線が見えたり、ガラス面上に位置合わせのマーキングがある場合があります。また、元の基板の配線からコモン端子を推測することができるかもしれません。

今回使った液晶表示装置の端子接続は下図のようになっていることがわかりました。

junk lcd wiring
LCD基板 結線図

ターゲットハードウェアの製作

回路

メインのマイコンはAtMega88です。内蔵RC発振により8MHz(分周なし、CKDIV8 = OFFの設定)で動作しています。 ポートのほとんどをLCDに接続しています。

avr lcd schematic 1/2 bias
1/2バイアス 3コモンの回路

avr lcd schematic 1/3 bias
1/3バイアス 3コモンの回路

ポートの接続は、ブレッドボードで配線しやすいように下記のようになっています。 ソフトウェアで自由に割り当てを変更できるので、配線しやすいポート端子が選択できます。

ポート端子 LCD電極
PB0 セグメント 14
PB1 セグメント 3
PB2 セグメント 2
PB3 セグメント 1
PB6 セグメント 9
PB7 セグメント 10
PC0 コモン C
PC1 コモン B
PC2 コモン A
PD0 セグメント 4
PD1 セグメント 5
PD2 セグメント 6
PD3 セグメント 7
PD4 セグメント 8
PD5 セグメント 11
PD6 セグメント 12
PD7 セグメント 13

LCDの動作とは直接関係ありませんが、テストで表示する数字の元データとして可変抵抗で分圧した電圧をADC4に入力しています。 AREFに接続しているコンデンサは内蔵リファレンス(1.1V)に対するノイズを防止するためのものです。 本格的な測定をするには、AVCCにもフィルターを入るなど、アナログ回路を分離する必要があります。

avr lcd target board
ターゲット・ハードウェア(1/2バイアスの実験中)

ソフトウェア

ソースコード

下記にソースコードを記載します。 avr-gccを使用しています。

ソースコード1: lcd_test_main.c (コンパイルするには後述の波形テーブルのソースが必要)

概要

  • int8_t lcd_segments[14] :セグメント表示用のバッファ
  • セグメントの点灯・消灯状態をビット単位で記憶する場所です。 プログラムを簡単にするため、各バイトの下位3ビットしか使用していません。

  • const int8_t lookup[24] :ポートの割り当てテーブル
  • ポートB、C、Dの各端子がLCDのどの電極に接続されているかを表してる定数配列です。
    0:未使用、正の整数:セグメント番号、負の整数:コモン番号を表しています。

  • void output_voltage(int bit, int voltage)
  • 指定したセグメントに指定したバイアス電圧を出力するための関数です。

  • ISR (TIMER0_OVF_vect) :タイマー0割り込み
  • ポートのアサインテーブルを参照してコモン端子、セグメント端子を判別します。 割り込みが発生した際の位相とセグメントの点灯状態に応じた電圧を波形テーブルから参照してポート端子に出力します。 端子接続や波形を変更しやすいようにこのようなデータ構造にしました。 コモン数、セグメント数の異なる設定にも比較的簡単に対応できます。

  • void lcd_segment_on(int segline, int bit)
  • void lcd_segment_off(int segline, int bit)
  • void lcd_put_segments(int8_t segline, int8_t mask, int8_t pattern)
  • void lcd_print_number(int8_t segline, int8_t num)
  • 液晶のセグメント点灯・消灯を制御する関数、数字など文字の表示を行う関数です。

  • ISR(ADC_vect) :ADC割り込み
  • AD変換はTimer1のオーバーフローによる自動トリガーで変換をスタートするように設定します。(約0.5s毎) 変換が完了するとADC割り込みが発生するので、値を読み取って変数 analog_in に変換結果10ビットを格納します。

  • main関数
  • メイン関数側では、データの入力を行いLCDのセグメント点灯パターンをメモリ上に生成しています。

    ADC4への入力電圧の変換結果は内蔵リファレンス(1.1V)を基準としたものです。 電圧をLCDに表示するためには、ADCの変換結果を処理して直読可能な数値を得る必要があります。

    (表示電圧) = (ADC変換結果) * 1100 / 1024

    最終的に得たデジタルの電圧値を4桁の10進数に分解して液晶に出力(0000〜1098mV)します。 可変抵抗を動かすと電圧表示が変化する様子を観察できます。

実験

波形テーブル

波形テーブルの内容は、1/2バイアスと1/3バイアスで異なります。 今回はソフトによる切換ではなく、それぞれ別のソースコードとして作成しています。 下記のlcd_waveform.cのどちらかを使用します。

ソースコード2:lcd_waveform.c (1/2バイアス用)
ソースコード3:lcd_waveform.c (1/3バイアス用)

上記のテーブルを使用して発生させた実際の波形を下記に示します。

avr lcd waveform 1/2
1/2バイアス出力波形 (5mS/div, 1V/div)
上はコモン端子、下はセグメント端子
avr lcd waveform 1/3
1/3バイアス出力波形 (5mS/div, 1V/div)
上はコモン端子、下はセグメント端子

実験結果

  • バイアスと駆動電圧による表示の違い
  • 1/2バイアス、1/3バイアス、それぞれで電源電圧を変えて表示の変化をみてみました。

    avr lcd 1/2 bias display result
    実験結果 (1/2バイアス)
    avr lcd 1/3 bias display result
    実験結果 (1/3バイアス)

    1/2バイアスは、点灯時の出力電力が大きく、低電圧の駆動(2.3V)でもはっきりと表示されています。 しかし、電圧を高くしていくと消灯セグメントも点灯してしまい、コントラストが悪化します。

    1/3バイアスでは、逆に低電圧時に駆動電力が低くコントラストが悪化しますが、 より高い電圧では良好なコントラストを維持することができました。 バイアスを変更すると、駆動に最適な電圧の範囲が変化することがわかります。

  • 消費電流比較(Vcc = 2.3V)
  • 1/2バイアス 3.52mA
    1/3バイアス 3.93mA

    ポートのほぼ全てが抵抗を通してVccとGNDに接続されている1/3バイアスの回路では、消費電力が大きくなります。 LCDを全消灯しても、Vcc〜GND間に電流が流れてしまうので、 消費電力が問題となるような用途では、スリープ時に分圧抵抗への電源供給を遮断するなどの工夫が必要なようです。

まとめ、今後の課題

AVRだけでのLCD制御について

外付けの専用ICを使わないので、部品点数が少なくなり、小さなLCDが入手出来れば小型機器製作に応用できそうです。 1/2、1/3バイアスの両方とも表示品質は全く問題なく、色々なLCDが使用できそうです。

AVRのシリアル・インターフェース(SPI、I2Cなど)を同時に使用すれば、 LCDコントローラーとして他のマイコンの表示装置として利用することもできそうです。

その他の課題

実験用のソフトウェアは、処理速度が遅く、メモリの使用率やコードサイズも効率よくできそうなところが多々あります。 特に、タイマー0割り込み処理内に多くのものをつめこんでいるので、 CPUの処理能力を稼ぐため、クロックを8MHz分周無し(CKDIV8 = off)で使用する必要がありました。 汎用性を高くしたまま、よりコンパクトでCPU負担の少ないものに改良したいと思います。

さいごに

バイアスの分割数を細かくすると、より幅広い駆動電圧でコントラストが良好になる、という予想でしたが、 コモン数が3程度のものでは、それほど大きな違いは観察できませんでした。 ドットマトリックス型など、マルチプレクス数の大きなLCDでは違いが大きく出てくる可能性があるので、また実験してみたいと思います。 今回のAVRのポートを使用した例ではバイアスは1/3(4ステップ)が限界ですが、 デューティ数をより大きくして対応することができるかもしれません。

反射型LCDはほとんど電力を消費せず、小型で表示情報の密度も高いので、機能だけ考えると自作小型機器への応用には最適です。 しかし、市販の機器で使用されているようなものはほとんどが特注部品で、汎用用途のLCD以外は一般には入手困難です。 今回の回路を利用して、ジャンク品として入手性がよくて自作に応用が効きそうなLCD機器を色々と見つけてみたいと思います。

参考リンク

以下は、今回の実験で参考にさせていただいたページです。この場を借りてお礼申し上げます。

  • おじさん工房 LCメーター(電卓LCD使用)
  • 電卓のLCDを利用したLCメーターの製作記事です。 後半部分にAVRマイコンによるLCDの制御についての解説があり、これが今回の実験の動機となったものです。 他にも興味深い記事がたくさんあり、日々参考にさせていただいています。

    リンク: http://ojisankoubou.web.fc2.com/lc-meter/index.html

  • Application Notes (LXD, LLC)
  • LXDというLCDやLCDコントローラのメーカーが公開している技術文書のページです。 LCDの原理や駆動方法についての解説が詳しく載っています。 特にマルチプレクスについての理論的な解説が分かりやすくて役に立ちました。

    リンク: http://lxdinc.com/application_notes/index


表紙に戻る