4.ライトセンサの使用 TOPへ 6.ボタンの使用

5.LCDの使用


ここではNXTのLCDの利用について学びます。NXTのLCDは100x64ピクセルで構成されており、横16文字、縦8行の表示が可能なモノクロディスプレイです。NXTのLCDには数値や文字列を表示でき、プログラムのデバッグなど今の状態を知るのに役に立ちます。


1.文字を表示する

最初に作った何もしないプログラムでは、プログラムの終了直前にメッセージを表示させていました。
今回は改めて、画面に文字を表示するプログラムを紹介しましょう。
display1.c
#include "kernel.h"
#include "kernel_id.h"
#include "ecrobot_interface.h"

DeclareTask(Task1);				/* Task1を宣言 */

void ecrobot_device_initialize(){}		/* OSEK起動時の処理(何もしない)*/

void ecrobot_device_terminate(){}		/* OSEK終了時の処理(何もしない)*/

void user_1ms_isr_type2(void){}

TASK(Task1)
{
   	display_clear(0);		/*LCD表示用バッファのクリア*/
   	display_string("Hello World !");		/* 文字列を表示する */
	display_update();

	TerminateTask();					/* 処理終了 */
}

このプログラムに使われている、文字列を表示するAPIについて解説します。

display_clear(0)
LCD表示用バッファをクリアします。
同時に表示を更新するかどうかを引数で指定します。"0"は更新しない、"1"は更新する、です。

display_string("Hello World !")
LCD表示用データバッファに文字列を格納します。

display_update()
LCD表示用データバッファに格納されているデータを、LCDに表示します。同時に表示用バッファがクリアされる。

LCDの中心に Hello World ! と表示されたと思います。 しかし、これだけではデバッグにあまり役立たないため、これを改良していきましょう。


2.変数を表示する・表示位置を指定する

次に変数を表示するプログラムを作りましょう。また、画面中央に表示するのではなく、位置も指定してみましょう。
ここではロボットの左右のモーターの回転量を表示するプログラムを作成します。
それでは次のプログラムを作成してください。ここでは display2.c とします。
display2.c
#include "kernel.h"
#include "kernel_id.h"
#include "ecrobot_interface.h"

DeclareTask(Task1);				/* Task1を宣言 */

void ecrobot_device_initialize(){}		/* OSEK起動時の処理(何もしない)*/

void ecrobot_device_terminate(){}		/* OSEK終了時の処理(何もしない)*/

void user_1ms_isr_type2(void){}

TASK(Task1)
{
   	int l_count,r_count;
   	nxt_motor_set_count(NXT_PORT_B,0);		/* ロータリエンコーダ初期化 */
   	nxt_motor_set_count(NXT_PORT_C,0);
   	display_clear(0);		/*LCD表示用バッファのクリア*/
   	
   	while(1){
   		
   		l_count = nxt_motor_get_count(NXT_PORT_B);	/* ロータリエンコーダから変数に代入 */
   		r_count = nxt_motor_get_count(NXT_PORT_C);
   		
   		display_goto_xy(0, 1);			/* 表示位置をx=0,y=1に移動 */
   		display_string("l_count=");		/* "l_count="と表示 */
   		display_int(l_count, 0);		/* l_count変数の中身を左詰で表示 */
   		
   		display_goto_xy(0, 2);			/* 表示位置をx=0,y=2に移動 */
   		display_string("r_count=");		/* "r_count="と表示 */
   		display_int(r_count, 0);		/* r_count変数の中身を左詰で表示 */
   		
		display_update();			/* LCD表示用バッファから画面更新 */

   		systick_wait_ms(10);			/* 10ms待つ */
	}
	
	TerminateTask();				/* 処理終了 */
}

プログラムを起動したら、タイヤを回転させてみて下さい。タイヤの回転量が表示されると思います。
では、このプログラムで新しく用いたAPIについて解説します。

display_goto_xy(0, 1)
文字の表示位置を指定します。画面の左上が(0,0)です。
一つ目の引数で水平方向(0〜15)、二つ目の引数で垂直方向(0〜7)を指定します。

display_int(r_count,0)
LCDにint形変数をLCD表示用バッファに格納します。
一つ目の引数は表示する変数を、二つ目の引数は表示する領域を指定します。
二つ目の引数に"4"と入力した場合、4つ右へいった所から、右詰で数字を表示します。左詰で数字を表示する場合は'0'を入れます。

上のプログラムの無限ループの中に、10ms のwait処理を入れている理由は、液晶の反応速度があまり速くないためです。また、10msecより短く値が変化してもそれを読み取れる人は稀です。興味のある人は、どの程度のwait処理で正しく表示できるか、また読み取り可能かを確認してみて下さい。
LCDには文字列や数字以外に画像の表示や線の描画も可能です。詳しくは、API Referenceの5.ディスプレイ関係のところを参照してください。

3.課題

1.サンプルプログラム display2.c の動作を確認せよ。
2.「3.タッチセンサの使用」の課題のプログラムを改変して、走行中の左右のエンコーダ値およびモータへの指令値を LCD に表示するようにせよ。



4.ライトセンサの使用 TOPへ 6.ボタンの使用