ArudinoでグラフィックLCDを動かす(SG12864ASLB-GB編)(7)

このページをスマホなどでご覧になる場合は、画面を横長にする方が読みやすくなります。
目次へ  前のページへ (1) (2) (3) (4) (5) (6) (7) (8) 次のページへ

13.PWM出力のデューティー比でコントラストを調整する

SG12866ASLB-GBに限らず、液晶モジュールは、何らかの形でコントラスト調整の機能を持っていることがほとんどです。これは、液晶のコントラストが、温度や電源電圧に依存するからです。全くコントラストの調整機構がないとしたら、夏場に見やすい液晶は、冬場に見にくくなってしまいます。(逆も真)

最近では、バスからコマンドを送ることでコントラスト調整する液晶モジュールも出てきました。しかし、大部分は、SG12866ASLB-GBと同様、半固定抵抗を回してコントラストを調整するタイプです。このタイプは、基板をケースに入れたときに、半固定抵抗をどうやって外部から回すかを考える必要があります。ケースに穴を開けておいて、そこからドライバーを突っ込めばコントラストが調整できるように、部品配置や機構を考える必要があります。

そこで、ArduinoからSG12866ASLB-GBのコントラストを調整できるような回路を考案しました。情報入力用のボタンか何かが元々Arduinoに接続されているようなアプリケーションなら、ボタン操作でコントラスト調整ができます。設定したコントラストは、EEPROMに記録しておけば、次回の起動時に再現できます。

Arduinoからコントラストを調整する方法を説明する前に、元々どうやってSG12866ASLB-GBのコントラストを調整することになっているかを説明します。

この連載の1回目に載っている表1を見れば分かるように、18番ピンにVOUTという名称のピンがあり、ここから負電源が出力されています。実測すると、約-10Vが出力されていますので、おそらくSG12866ASLB-GBに-2倍のチャージポンプ回路が内蔵されており、電源電圧(5V)の-2倍の-10Vが出力されているものと思われます。

一方で、3番ピンのVOという名称のピンは、コントラスト調整用のアナログ電圧入力となっています。この端子には負の電圧を印加しますが、電圧が下がる(電圧の絶対値が上がる)と表示が濃くなるようになっています。

そこで、通常は、下の図のように10kΩないし20kΩの半固定抵抗の片方の端にVOUT(約-10V)を、もう片方の端にGNDを接続し、摺動子(真ん中の端子)の電圧をVO端子に入力します。半固定抵抗はVOUTを分圧し、VOの電圧は半固定抵抗の分圧比で決まります。(VO端子の入力インピーダンスは高いので、流れる電流を無視できる)

図15、半固定抵抗によるコントラストの調整
図15、半固定抵抗によるコントラストの調整

ArduinoはD/Aコンバータを内蔵していないので、アナログの直流電圧の出力手段は直接的にはありませんが、analogWrite関数で、PWM信号を出すことができます。

図16、PWM信号
図16、PWM信号

上の図のように、周期的にHLを出力するような信号で、必要に応じてHを出力している時間とLを出力している時間の比を変化させられるような場合、これをPWM信号と呼びます。

周期の長さをT、1周期の中でHを出力している時間をTH、1周期の中でLを出力している時間をTLとすると、T=TH+TLが成立します。この時、1周期の中でHを出力している時間の割合を表わすデューティ比DD=THTで定義されます。

例えば、PWM信号の周波数を100Hzとすると、周期は10msになります。1周期の中で8msだけHになっているとすると、デューティ比は0.8になります。(あるいは百分率で表わし、80%ということもある) Arduinoは、analogWrite関数で、このデューティー比を0~1の範囲で256段階に調整できます。

Hレベル出力時の電圧をVCCとし、Lレベル出力時の電圧が0だとすると、PWM信号の平均電圧はDVCCで表わされます。よって、VCCが一定の場合でも、デューティ比Dを変化させれば平均電圧をコントロールする事ができます。

更に、この信号をカットオフ周波数fCがPWM信号の周波数f(=1T)よりも十分低いローパスフィルタに通すと、PWM信号の平均電圧に相当する直流電圧を得ることができます。(下図参照)

図17、ローパスフィルタによる平均電圧の取り出し
図17、ローパスフィルタによる平均電圧の取り出し

例えばArduino Unoの場合、3番ピン(D3)でPWM信号を出力すると、周波数fは約490Hzと決まっています。Rを10kΩ、Cを10μFとすれば、カットオフ周波数fCは約1.6Hzとなります。よって、fC<<fが成立しますから、ローパスフィルタの出力には、綺麗な直流電圧が出てきます。Hレベルの電圧は5Vですから、ローパスフィルタの出力電圧を0V~5Vの範囲で256段階に調整できることになります。1ステップの電圧は5÷255=0.0196Vとなります。

このように、ローパスフィルタを追加すると、Arduinoで直流電圧のコントロールをできることが分かりました。(簡易型のD/Aコンバータ) しかし、出力できるのは0V以上で、負の電圧を発生する事はできません。そこで、次の様な回路を考案しました。

図18、負電圧のPWM出力回路
図18、負電圧のPWM出力回路
広告

この回路はArduinoの3番ピン(D3)に発生させたPWM信号を入力すると、-10V~0Vの負電圧のPWM信号にレベルシフトして出力する回路です。

D3の信号がH(5V)の時、2SA1015のベース・エミッタ間に電圧は掛かりません。よって、この時コレクタ・エミッタ間はOFFになります。その結果、2SC1815のベース・エミッタ間に電圧が掛からず、2SC1815のコレクタ・エミッタ間もOFFになります。出力は10kΩの抵抗でGNDにプルアップされているため、出力電圧が0Vになります。

一方で、D3の信号がL(0V)の場合、2SA1015のベース・エミッタ間に順方向電圧が掛かり、コレクタ・エミッタ間がONになります。そうすると、2SC1815のベース・エミッタ間にも順方向電圧が掛かり、コレクタ・エミッタ間がONになります。出力は10kΩの抵抗でGNDにプルアップしているものの、2SC1815のコレクタ・エミッタ間がONになっており、-10Vラインと導通し、出力電圧は-10Vとなります。

Arduino Unoには、次の様なスケッチを書き込むと、D3に任意のデューティー比でPWM信号を出力する事ができます。

#define AOUT 80 // analogWriteの出力値

void setup()
{
  pinMode(3,OUTPUT);
  analogWrite(3,AOUT);
}

void loop()
{
}

一行目でAOUTという定数を宣言しています。この数字を255で割ったものがデューティ比になります。上のスケッチの場合、AOUTは80ですので、デューティー比は80÷255=0.3137となります。

実際ブレッドボードに回路を組み、オシロスコープで波形を観測してみました。-10Vの発生には、実験用定電圧・定電流電源を用いました。また、マイコンボードはArduino Uno互換に設定したOn Boardを使いました。

写真27、負電圧のPWM出力回路の実験風景
↑ 画像をクリックすると拡大
写真27、負電圧のPWM出力回路の実験風景

この時の波形を次に示します。

図19、AOUTが80の時の負電圧のPWM出力回路の波形
図19、AOUTが80の時の負電圧のPWM出力回路の波形

黄色の波形(CH1)がArduinoのD3の信号です。水色の波形(CH2)が図18のレベル変換回路の出力電圧波形です。共に画面の真ん中が0Vで、縦軸は5V/DIVです。この波形を見ると、D3が0Vの時に出力は-10Vになっており、D3が5Vの時に出力が0Vになっているのが分かります。信号のデューティ比は、D3の信号が31.34%、出力信号が30.42%となっており、理論値の0.3137(31.37%)とおおむね一致しています。

出力電圧の平均値は−7.33Vとなっています。理論上は−10×(1−0.314)=−6.86Vとなるので、測定値は理論値より0.51V低いですが、これは回路で生じた誤差より、測定誤差の方が大きそうです。というのも、私の使っているオシロスコープは、CH2に特に大きなオフセット電圧があるからです。

試しにレンジを変えないまま、無入力状態にして平均電圧を測ってみました。

図20、無入力状態にしたオシロの画面
図20、無入力状態にしたオシロの画面

オシロスコープの入力に電圧を加えていないにも関わらず、CH1の平均電圧は約−0.1V、CH2の平均電圧は−0.4Vとなっています。少なくともこのクラスのオシロスコープでは、波形を画面一杯に振らせないと、なかなか電圧を正確に測定するのは難しそうです。ですから、電圧の測定値は、おおよその目安として考えるべきです。

次に、スケッチを書き換え、AOUTを170にして波形を測定しました。

図21、AOUTが170の時の負電圧のPWM出力回路の波形
図21、AOUTが170の時の負電圧のPWM出力回路の波形

D3信号のデューティ比が66.67%、出力信号のデューティー比が65.71%となっています。理論値は170÷255=0.6667(66.67%)ですから、測定値は理論値と良く一致していると言えます。

出力電圧の平均値の測定結果は−3.83Vでした。理論値は−10X(1−0.667)=-3.33Vとなりますので、測定値は理論値より0.50V低くなっています。この測定値は、オシロスコープのオフセット電圧を考えると、妥当な値だと考えられます。

以上のように、図18の回路を使えば、analogWrite関数を用いて負の電圧のPWM波形を発生する事ができ、デューティ比で平均電圧をコントロールできることが分かりました。

この回路にローパスフィルタを追加すれば、負の直流電圧をanalogWrite関数でコントロールする事ができ、LCDのコントラスト調整もできそうです。その結果を次のページで説明します。

目次へ  前のページへ (1) (2) (3) (4) (5) (6) (7) (8) 次のページへ

このページで使われている用語の解説

関連ページ

関連製品

Arduino Uno用ブートローダスケッチライタシールドキット 商品名 Arduino Uno用ブートローダスケッチライタシールドキット
税抜き小売価格 1440円
販売店 スイッチサイエンス
サポートページ
Arduino用ブートローダ/スケッチライタキット 商品名 Arduino用ブートローダ/スケッチライタキット
税抜き小売価格 3000円
販売店 スイッチサイエンス
サポートページ
Arduino 電子工作
このサイトの記事が本になりました。
書名:Arduino 電子工作
ISBN:978-4-7775-1941-5
工学社の書籍の内容の紹介ページ
本のカバーの写真か書名をクリックすると、Amazonの書籍購入ページに移動します。