Arduinoとシリアル→パラレル変換ボード付16x2 OLEDカラーディスプレイの組み合わせは、配線が非常に楽になるというメリットがありますが、その代わり、Arduinoで用意されているライブラリ「LiquidCrystal」が使用できなくなります。
LiquidCrystalは、日立製作所(現:ルネサス エレクトロニクス)製のコントローラIC「HD44780」とその互換チップセットをベースにしたLCDを制御するためのライブラリです。このライブラリを使うと、文字の表示や削除以外にも、カーソルの位置を指定したり、表示方向を変えたりできます。
今回、LiquidCrystalが使えなくなったので、これらと同様の機能を自分でプログラムしなくてはなりません。文字を表示するのは、前述のように「Serial.print("Arduino");」と記述するだけです。表示した文字をクリアしたり、カーソルの位置を指定したりするにはESCシーケンスで表示の制御を行います。実際には、表3のように、ESC文字(ASCIIコードの「27」:16進数で「0x1b」)を送った後、コマンド文字を送信して制御するわけです。
カーソル位置の制御には、「@,A,〜,O」をアドレスとして使用します(画像7)。ESC文字(0x1b)を送信した後、「コマンド(G),X座標,Y座標」を送信します。シリアルポートにバイナリデータを出力するので、「Sirial.write()」を使っていることに注意してください。
今回のモジュール構成は、次のようになります(画像8)。
それでは、Arduinoの統合開発環境「Arduino IDE」で、スケッチ(プログラム)を作成していきましょう(スケッチ1、スケッチ2、スケッチ3)。
//----------------------- // 定数の定義 //----------------------- //OLEDエスケープシーケンス char OLED_CLR[2] = {0x1b,'C'}; //クリア char OLED_CURSOR[4] = {0x1b,'G','@','@'}; //カーソル位置設定(x、y) //OLEDカーソル位置を表す文字 char OLED_CURSOR_POSITION[16] = {'@','A','B','C' ,'D','E','F','G' ,'H','I','J','K' ,'L','M','N','O'}; //OLED1行目(左)の表示領域 const int OLED_1L_POS_X = 0; const int OLED_1L_POS_Y = 0; const int OLED_1L_LEN = 8; //OLED1行目(右)の表示領域 const int OLED_1R_POS_X = 11; const int OLED_1R_POS_Y = 0; const int OLED_1R_LEN = 5; //OLED2行目の表示領域 const int OLED_2L_POS_X = 0; const int OLED_2L_POS_Y = 1; const int OLED_2L_LEN = 16; //タイマーの値 const int TIME_VALUE = 60; //1分間(ミリ秒) const unsigned long ONE_MINUITE = 60L * 1000L; //----------------------- // グローバル変数の定義 //----------------------- unsigned long G_time = TIME_VALUE; //タイマーの時間 unsigned long G_start_time; //スタートボタンを押してからの時間
いつもとスケッチの様子が異なりますが心配ありません! 先ほど説明した“ディスプレイに文字を表示させるための前提”と照らし合わせながら眺めてもらえれば、「なるほど〜!」と理解できると思います。
最初に、今回のプログラムに必要な定義から見ていきましょう。5〜23行目は、ディスプレイに文字を表示するのに必要な定数の定義です。
5行目は、表示をクリアするためのESCとCをセットにした配列です。続く6行目は、カーソル位置を指示するための配列です。初期値は「x=@, y=@」なので、1行目の左端です。8行目は、カーソル位置を指定するためのアドレスとなる文字です。
13行目がタイム表示エリアのX座標、14行目がY座標。15行目で最大文字数を指定しています。同様に、状態表示エリア(17〜19行目)とメッセージ表示エリア(21〜23行目)も指定しました。
26行目の「TIME_VALUE」は1分単位で指定します。「0」になったときにメッセージが表示されます。
28行目で、カウントダウン用の定数を指定します。ここで右辺が「60L * 1000L」となっているのは、long型で計算するためです。「L」の添え字を外すと、計算結果がint型になって定数に格納されてエラーの原因になります。
Copyright © ITmedia, Inc. All Rights Reserved.