前回は、グラフィックLCDシールドを、1200bpsのシリアルターミナルとして扱うターミナルモードの説明をしました。パソコンのターミナルソフト相手に通信するのと同様の方法で画面に文字を表示できる利点がありましたが、一方で、グラフィックLCDシールドの機能の一部しか利用できないという欠点があります。今回は、グラフィックLCDシールドの性能をフルに引き出せるMGLCDモードの説明をします。
MGLCD (Monochrome Graphic Liquid crystal Display)は、モノクロ画面のグラフィックLCDモジュールの制御のための、Arduino用ライブラリの名称です。グラフィックLCDシールドを使う場合以外にも、LCDを直接Arduinoに接続する際にも使えるライブラリです。2013年5月時点では、SG12232C、SG12864ASLB-GB、S12232ZAに対応しています。この記事を書いている時点でのMGLCDライブラリの最新バージョンはVer. 0.23です。以下のリンクからダウンロードしてください。なお、ライブラリの動作検証は、Windows版Arduino IDEの1.0.1と1.0.4で行いました。
上記リンクをクリックすると、ZIPファイルがダウンロードできます。解凍するとMGLCDという名前のフォルダができますから、そのフォルダを丸ごとマイドキュメント\Arduino\librariesの中に移動またはコピーしてください。もしマイドキュメント\Arduinoの中にlibrariesというフォルダがなければ、そのフォルダを作成した後に、MGLCDフォルダを移動/コピーしてください。以上でインストールが終了です。
ここで、インストールしたMGLCDライブラリを使って、LCD画面の対角線に直線を引いてみましょう。
Arduino IDEで次のスケッチを入力します。
#include <mglcd.h> mglcd_serial MGLCD(&Serial,500000); void setup() { while(MGLCD.Reset()); MGLCD.Line(0,0,121,31); } void loop() { }
次にArduinoにグラフィックLCDシールドを装着し、SW5をEXT側に切り替えます。
ArduinoにUSBケーブルを接続し、先ほどのスケッチをArduinoに書き込みます。
ここで、SW5をINT側に切り替えると、画面の左上から右下に向かって、対角線が描かれます。
先ほどのスケッチの内容を少し詳しく説明しましょう。
まず最初の行の
#include <mglcd.h>
は、MGLCDライブラリのヘッダファイルを読み込むために必要な宣言です。MGLCDライブラリを使うには、スケッチの最初にこの行を書くことが必要だと憶えてください。
次の
mglcd_serial MGLCD(&Serial,500000);
も、MGLCDライブラリを使うための決まり文句です。MGLCDライブラリを使うには、mglcd_serial型のオブジェクト変数を宣言する必要があります。上記の行内のMGLCDがその変数名です。この宣言文以降、MGLCDライブラリの関数は、MGLCD.関数名(引数・・・)の形で呼び出せます。
ただし、必ずしもMGLCDという変数名にしなくてはいけない訳ではありません。例えば
mglcd_serial hoge(&Serial,500000);
というように、変数名をhogeにしても構いません。ただその場合は、MGLCDライブラリの関数の呼び出しは、hoge.関数名(引数・・・)とする必要があります。
&Serialは、ハードウェアシリアルを使ってグラフィックLCDシールドと通信することを意味します。Arduino Unoの場合は、必ず&Serialにする必要があります。こうすると、Arduino Unoの0番ピン(RX)と1番ピン(TX)を使って、グラフィックLCDシールドと通信します。
Arduino Mega 2560の場合は、ハードウェアシリアルポートが全部で4つあり、それぞれSerial(RX:0番ピン、TX:1番ピン)、Serial1(RX:19番ピン、TX:18番ピン)、Serial2(RX:17番ピン、TX:16番ピン)、Serial3(RX:15番ピン、TX:14番ピン)と名前が付いています。例えば0番ピンと1番ピンではなく、15番ピンと14番ピンを使ってグラフィックLCDシールドと通信したい場合は、
mglcd_serial MGLCD(&Serial3,500000);
とすればいいのですが、その場合は、ジャンパ線の配線やSW5の操作が必要となります。詳しい話は、後に説明します。
500000という数字は、通信の際の速度(単位はbps)を表しています。つまり、この場合500000bps(500kbps)で通信する事を意味します。この数字を変えれば、もっと遅い速度で通信することもできます。使用できる通信速度は、300bps、600bps、1200bps、2400bps、4800bps、9600bps、14400bps、19200bps、28800bps、38400bps、57600bps、115200bps、250000bps、そして500000bpsです。例えば9600bpsで通信したい場合は、
mglcd_serial MGLCD(&Serial,9600);
とします。
setup関数の中の
while(MGLCD.Reset());
は、グラフィックLCDシールドの初期化のために必要な行です。MGLCDライブラリを使うスケッチでは、最初にReset関数を呼び出して、グラフィックLCDシールドを初期化する必要があります。ただし
MGLCD.Reset();
の様に、単にReset関数を呼び出すだけでは、初期化が失敗する可能性があります。というのも、Reset関数を呼び出す時点で、グラフィックLCDシールド内蔵のマイコンがまだ起動していなかったり、SW5の操作が終わっていないために、RXピンやTXピンの配線ができていなかったりするからです。初期化が成功するとReset関数は0を返し、初期化に失敗するとReset関数は負の値を返すので、
while(MGLCD.Reset());
とすることで、成功するまで初期化を繰り返します。
次の
MGLCD.Line(0,0,121,31);
は、直線を引くためのLine関数を呼び出しています。この場合座標(0,0)(画面左上)から座標(121,31)(画面右下)まで直線を引きます。すなわち、画面の対角線を線で結びます。
以上のように、先ほどのスケッチは動作します。
ハードウェアシリアルのポートが足りずに、ソフトウェアシリアルで通信したい場合は、前述のスケッチを次の様に変更してください。
#include <mglcd.h> #include <SoftwareSerial.h> SoftwareSerial mySerial(10,11); mglcd_SoftwareSerial MGLCD(&mySerial,38400); void setup() { while(MGLCD.Reset()); MGLCD.Line(0,0,121,31); } void loop() { }
ソフトウェアシリアルを使う場合は、
#include <SoftwareSerial.h>
と宣言して、SoftwareSerial.hというヘッダファイルをインクルードする必要があります。さらに、
SoftwareSerial mySerial(10,11);
と、SoftwareSerial型の変数を宣言する必要があります。上記の例では、変数名がmySerialとなっていますが、別の変数名でも構いません。例えば変数名をhoge1とする場合は
SoftwareSerial hoge1(10,11);
となります。ただしそれに合わせて、次の行を
mglcd_SoftwareSerial MGLCD(&hoge1,38400);
と書き直す必要があります。
SoftwareSerial mySerial(10,11);
という宣言の中の2つの数字(10と11)は、グラフィックLCDシールドとの通信に使うArduinoのピン番号を表しています。この場合だと、RXとして10番ピン、TXとして11番ピンを使います。
他のピンを使って通信したい場合は、これらの数字を変更すればいいのですが、Arduino MEGA 2560の場合は、全てのピンがRXピンとして利用できる訳ではないので、注意が必要です。詳しくは、ソフトウェアシリアルライブラリの解説ページ(英文)をご覧ください。
mglcd_SoftwareSerial MGLCD(&mySerial,38400);
は、ソフトウェアシリアル経由で通信している場合にMGLCDを使う場合に必要となるmglcd_SoftwareSerial型の変数MGLCDを宣言しています。この宣言文以降、MGLCDライブラリの関数が、MGLCD.関数名(引数・・・)の形で呼び出せます。この例では変数名をMGLCDにしていますが、例えば
mglcd_SoftwareSerial hoge2(&mySerial,38400);
と宣言すると、変数名はhoge2となります。この場合、MGLCDライブラリの関数の呼び出しはhoge2.関数名(引数・・・)の形になります。
2つの引数&mySeryalと38400は、それぞれ通信に使うSoftwareSerial型の変数へのポインタと通信速度(bps)を表しています。ソフトウェアシリアルを使う場合、指定できる通信速度は300bps、600bps、1200bps、2400bps、4800bps、9600bps、14400bps、19200bps、28800bpsおよび38400bpsになります。
MGLCD.Line(0,0,121,31);
で、座標(0,0)から座標(121,31)まで線を引いています。
スケッチを実行するためには、CN2のto RXを10番ピンに、to TXを11番ピンに、それぞれジャンパ線で接続し、SW5をEXT側に切り替えます。その後にスケッチをArduinoに書き込むと、画面の左上から右下への対角線を描画します。
先ほど述べたように、Arduino Mega 2560の場合、シリアルポートが4つあり、Serialの他にSerial1、Serial2、Serial3が使えます。例えば、Serial3を使ってグラフィックLCDシールドと通信を行う場合、スケッチは次の様になります。
#include <mglcd.h> mglcd_serial MGLCD(&Serial3,500000); void setup() { while(MGLCD.Reset()); MGLCD.Line(0,0,121,31); } void loop() { }
上のスケッチは、Serialを使って通信するスケッチと、次の行のみが異なります。
mglcd_serial MGLCD(&Serial3,500000);
もちろん、Serial1やSerial2を使いたい場合は、&Serial3のところを&Serial1や&Serial2に書き換えればいいです。
このスケッチを動作させるには、SW5をEXT側に切り替え、CN2の"to RX"を15番ピン、"to TX"を14番ピンにそれぞれジャンパ線で接続してから、スケッチを書き込んでください。そうすると、対角線が描画されます。
前のページでは、A/D変換の結果をテキスト表示しましたが、今回はグラフィック表示してみます。
前のページの図2で示したように半固定抵抗をグラフィックLCDシールドに付け、SW5をEXT側に切り替えてから、次のスケッチをArduinoに書き込みます。
#include <mglcd.h> mglcd_serial MGLCD(&Serial,500000); void setup() { // グラフィックLCDシールドの初期化 while(MGLCD.Reset()); } void loop() { // A/D変換値(0~1023)の取得 int val=analogRead(A0); // A/D変換値の表示 MGLCD.Locate(0,0); MGLCD.print(val); MGLCD.ClearRestOfLine(); // バーグラフの表示 val/=8; if(val>=MGLCD.GetWidth()) val=MGLCD.GetWidth()-1; MGLCD.FillRect(0,9,val,MGLCD.GetHeight()-1,1); MGLCD.FillRect(val+1,9,MGLCD.GetWidth()-1,MGLCD.GetHeight()-1,0); delay(200); }
スケッチの書き込みが終わったら、SW5をINT側に切り替えると、A/D変換値が数字とバーグラフで表示されます。
以上の操作をまとめたのが次の動画です。
スケッチを簡単に説明しておきます。
int val=analogRead(A0);
でA/D変換値を取得しています。
MGLCD.Locate(0,0); MGLCD.print(val); MGLCD.ClearRestOfLine();
で、A/D変換値を、数字で画面左上に表示しています。
Locate関数は、文字の表示位置を指定する関数です。Locate(0,0)を呼び出すと、次に表示される文字が、画面の左上に表示されます。
print関数の使い方は、Serial.printの場合と全く同じです。
ClearRestOfLine関数は、現在の表示位置から行の最後までを消去する関数です。
val/=8; if(val>=MGLCD.GetWidth()) val=MGLCD.GetWidth()-1; MGLCD.FillRect(0,9,val,MGLCD.GetHeight()-1,1); MGLCD.FillRect(val+1,9,MGLCD.GetWidth()-1,MGLCD.GetHeight()-1,0);
で、A/D変換値をバーグラフ表示しています。
val/=8;
で、A/D変換値を8で割って、バーグラフの長さを計算しています。A/D変換値の最大値が1023であるのに対して、LCDの水平方向の画素数が122ピクセルと、おおよそ1/8になっている事を利用しています。
if(val>=MGLCD.GetWidth()) val=MGLCD.GetWidth()-1;
で、A/D変換値が大きい場合のバーグラフの長さを調整しています。1023を8で割ると127(小数点以下切捨て)となり、LCDの水平方向の画素数(122ピクセル)以上の値になるので、上限を121(水平方向画素数-1)としています。GetWidth関数は、水平方向の画素数(122)を返す関数です。
MGLCD.FillRect(0,9,val,MGLCD.GetHeight()-1,1);
で、バーグラフを描画しています。FillRect関数は中を塗りつぶした長方形を描画する関数で、書式は次のとおりになります。
この呼び出しで、(x座標1,y座標1)と(x座標1,y座標1)を対角線とする長方形を指定した色で塗りつぶします。色が0の場合は白、1の場合は黒になります。
GetHeight関数は、画面の垂直方向の画素数(32)を返す関数です。
MGLCD.FillRect(val+1,9,MGLCD.GetWidth()-1,MGLCD.GetHeight()-1,0);
で、バーグラフの右側の余白を白く塗りつぶしています。
次のページでは、MGLCDライブラリで使える、文字表示関係の関数について説明します。