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

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

14.PWM出力のデューティー比でコントラストを調整する(続き)

前のページ図18ローパスフィルタを追加して、直流の負電圧を発生させるようにしたのが次の回路です。

図22、直流負電圧出力回路
図22、直流負電圧出力回路

R5とC1が、追加したローパスフィルタを構成する部品です。この回路をブレッドボード上に作り、オシロスコープで波形を観察してみました。

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

前のページのスケッチを使って、AOUT=80の条件で波形を観察した結果を次に示します。(AOUTはanalogWrite関数の第2引数)

図23、AOUTが80の時の直流負電圧出力回路の波形
図23、AOUTが80の時の直流負電圧出力回路の波形

黄色の波形はArduinoのD3から出てくるPWM信号です。水色は、図22における出力信号です。

31.34%のデューティ比のPWM信号を入力すると、出力に-9.10Vの直流電圧が出ています。(ただし、オシロでの電圧の測定結果は参考程度に) 前のページでローパスフィルタがない状態で実験をしたら、出力の平均電圧が-7.37Vでしたから、今回の結果と1.73Vの差があります。この差はオシロスコープの精度では説明が付きません。この理由に関しては、後に説明します。

次にAOUT=170の条件で波形を観察しました。結果を次に示します。

図24、AOUTが170の時の直流負電圧出力回路の波形
図24、AOUTが170の時の直流負電圧出力回路の波形

この条件では−5.97Vが出力されています。ローパスフィルタがなかった時の平均出力電圧が−3.83Vだったので、2.14Vの差があります。とはいえ、D3のPWM信号のデューティ比を変えると、無事に出力電圧が変えられている様子が確認できました。

オシロスコープでは電圧の測定精度が良くないので、デジタルマルチメータを使って出力電圧を測定してみました。

写真29、デジタルマルチメータによる出力電圧の測定風景
↑ 画像をクリックすると拡大
写真29、デジタルマルチメータによる出力電圧の測定風景
広告

AOUTを0~255の範囲で変化させた場合の出力電圧の測定結果を次のグラフに示します。

図25、AOUT(analogWrite関数の第2引数)と出力電圧の関係
図25、AOUT(analogWrite関数の第2引数)と出力電圧の関係

AOUTを0から255まで変化させると、出力電圧も−10Vから0Vまで単調に変化しますが、直線関係にはならず、曲線になっています。これは、図18に示した負電圧のPWM出力回路の出力インピーダンスが、−10V出力時はほぼ0Ωなのに対して、0V出力時は10kΩとなるからです。CR1次ローパスフィルタは、信号源のインピーダンスが一定でないと正確な平均電圧を出力できません。図22において、R5よりR4の方が十分小さければ、正確な平均電圧が出力できるので、R4を小さくする(−10Vラインの消費電流が増える副作用がある)か、R5を大きくする(出力インピーダンスが上昇する副作用がある)かをすれば、図25のグラフはより直線に近づきます。

しかし、今回作っているのは、LCDのコントラスト調整用の電圧出力回路なので、それほど直線性にこだわる必要もありません。

図22の回路で、実際にSG12864ASLB-GBのコントラストを調整してみました。この連載の1ページ目に載せた回路においてコントラスト調整回路を、20kΩの半固定抵抗から図22の回路に置き換えて実験しました。ただし、−10Vの電源はSG12864ASLB-GBの18番ピン(VOUT)から取り、出力は3番ピン(VO)に繋ぎました。

写真30、コントラスト調整の実験風景
↑ 画像をクリックすると拡大
写真30、コントラスト調整の実験風景

回路の動作のテストに使ったスケッチを以下に示します。なお、このスケッチを動かすためには、MGLCDライブラリのVer.0.34以降をインストールしておく必要があります。

#include <mglcd.h>

#define AMIN 165  // analogWriteの出力の最小値
#define AMAX 225  // analogWriteの出力の最大値
#define PAUSE 500 // コントラストを切り替える間隔(ms)

static const TLcdPinAssignTable PinAssignTable={
  A0_DI  : A3, // A0 for SG12232, D/I for SG12864
  CS1_E1 : A0, // CS1
  CS2_E2 : A1, // CS2
  E      : A4,
  RW     : A2,
  DB0    : 8 ,
  DB1    : 9 ,
  DB2    : 10,
  DB3    : 11,
  DB4    : 4 ,
  DB5    : 5 ,
  DB6    : 6 ,
  DB7    : 7
}; // PinAssignTable;

static mglcd_SG12864 MGLCD(PinAssignTable);

void SetContrast(int cont)
{
  MGLCD.Locate(0,2);
  MGLCD.print("PWM シュツリョクチ:");
  MGLCD.print(cont);
  MGLCD.ClearRestOfLine();
  analogWrite(3,cont);
} // SetContrast

void setup()
{
  // 3番ピンの初期化
  pinMode(3,OUTPUT);
  analogWrite(3,AMIN);

  // LCD画面の初期化
  while(MGLCD.Reset());
  MGLCD.SetCodeMode(MGLCD_CODE_UTF8); // かな表示を有効にする
  MGLCD.print("コントラスト チョウセイ ノ テスト");
}

void loop()
{
  int i;

  for(i=AMIN; i<AMAX; i++) { // PWMのデューティー比を増加させる(表示が薄くなる)
    SetContrast(i);
    delay(PAUSE);
  } // for i

  for(i=AMAX; i>AMIN; i--) { // PWMのデューティー比を減少させる(表示が濃くなる)
    SetContrast(i);
    delay(PAUSE);
  }
}

このスケッチは、analogWrite関数の第2引数をゆっくり増減させるスケッチです。引数のの変化に応じて画面の濃さが変化する様子を観察できます。下の写真は、その様子を表わしたものです。"PWM シュツリョクチ"と表示されているのが、analogWrite関数の第2引数です。

写真31、コントラスト調整スケッチの実行結果(PWM出力値192)
↑ 画像をクリックすると拡大
写真31、コントラスト調整スケッチの実行結果(PWM出力値192)
写真32、コントラスト調整スケッチの実行結果(PWM出力値202)
↑ 画像をクリックすると拡大
写真32、コントラスト調整スケッチの実行結果(PWM出力値202)
写真33、コントラスト調整スケッチの実行結果(PWM出力値212)
↑ 画像をクリックすると拡大
写真33、コントラスト調整スケッチの実行結果(PWM出力値212)
写真34、コントラスト調整スケッチの実行結果(PWM出力値217)
↑ 画像をクリックすると拡大
写真34、コントラスト調整スケッチの実行結果(PWM出力値217)
目次へ  前のページへ (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の書籍購入ページに移動します。