6.サウンドセンサの使用 TOPへ 8.LCDの使用

7.ボタンの使用


ここでは、プログラム上でNXTボタンを用いる方法を学習します。 ボタンだけでは特に用いることは少ないかもしれませんが、後述のLCDの使用Bluetooth通信と組み合わせることで色々なことができるようになるでしょう。


1.ボタンの入力を知る

ここでは、NXTボタンの入力を知り、それに応じてロボットのモータを動かすプログラムを作成します。
次のプログラム例ではプログラムを終了させるために、入力ポート1に接続したタッチセンサを用いていますが、 各自必要に応じて書き換えてください。
それでは次のプログラムを作成してください。ここではファイル名は button1.c とします。
button1.c
#include "nxtlib.h"

task main(){
	TButtons button;

	SetSensorTouch(S1);

	while(true){
		button = nNxtButtonPressed;

		if(SensorValue(S1)){
			StopAllTasks();
		}else{
			switch(button){
				case kLeftButton:
					motor[motorB] = 100;
					motor[motorC] = 0;
					break;
				case kEnterButton:
					motor[motorB] = 100;
					motor[motorC] = 100;
					break;
				case kRightButton:
					motor[motorB] = 0;
					motor[motorC] = 100;
					break;
				case kExitButton:
					motor[motorB] = -100;
					motor[motorC] = -100;
					break;
				default:
					motor[motorB] = 0;
					motor[motorC] = 0;
					break;
			}
		}
		wait10Msec(1);
	}

}

このプログラムは左右のNXTボタンを押すとそれぞれのモータが回転、中央のオレンジボタンで前進、 中央下の濃いグレーボタンで後退、タッチセンサが押すと終了するプログラムです。
上に挙げた例のようにボタンを用いたプログラムの場合は、Switch-case文を用いて、 ボタン毎に動作を記述するとプログラムはわかりやすくなります。
それでは新しく使用したAPIや変数の解説をします。

nNxtButtonPressed
どのNXTボタンが押されているか、又は押されていないかが格納されている変数です。 この変数はTButtons型で定義されているので、値を読むときは同じくTButtons型にしなければならない。

kLeftButton , kEnterButton, kRightButton , kExitButton
それぞれ左、中央オレンジ、右、中央下のボタンのマクロです。 実際にはExitが0、Rightが1、Leftが2、Enterが3と定義されていますが、 直接数字を書くよりも、このマクロを用いるとプログラムが分かり易くなります。

wait10Msec(1)
10msec動作を待機させます。wait1Msecと異なり、この場合では引数の10倍だけ待機することになります。


このプログラムを動かすと、中央下の濃いグレーボタンを押したときにプログラムが中断してしまい、 予想していたのとは異なる動きになってしまったと思います。 また、LCDにも様々なメッセージが表示されてしまい、これも予想していない動きになっています。
これはボタンの操作がNXTコンソール上で処理されているからです。 そのため、コンソール上の処理をしないようにする必要があります。


2.サンプルプログラムの改良

ここでは先ほど使用したサンプルプログラムの欠点である「中央下のグレーボタンを押した時にプログラムが中断する」 「LCD上に様々なメッセージが表示される」の2つを解消するプログラムを作成します。
それでは次のプログラムを作成してください。ここでは button2.c とします。
button2.c
#include "nxtlib.h"

task main(){
	TButtons button;
	
	nNxtButtonTask = -2;
	nNxtExitClicks = -1;
	
	SetSensorTouch(S1);

	while(true){
		button = nNxtButtonPressed;
		if(SensorValue(S1)){
			StopAllTasks();
		}else{
			switch(button){
				case kLeftButton:
					motor[motorB] = 100;
					motor[motorC] = 0;
					break;
				case kEnterButton:
					motor[motorB] = 100;
					motor[motorC] = 100;
					break;
				case kRightButton:
					motor[motorB] = 0;
					motor[motorC] = 100;
					break;
				case kExitButton:
					motor[motorB] = -100;
					motor[motorC] = -100;
					break;
				default:
					motor[motorB] = 0;
					motor[motorC] = 0;
					break;
			}
		}
		wait10Msec(1);
	}

}

先ほどのプログラムに赤い箇所を追記しました。
このプログラムでは先ほどのようにプログラムが中断されたり、LCDに何か表示されることがなくなったと思います。
それでは新たに使用したAPIや変数の解説をします。

nNxtButtonTask
NXTボタンをコンソール上で操作させるかどうかを決定する変数です。指定は整数で行います。 デフォルトでは −1 となっており、この場合ではコンソール上でボタンが操作されます。 そのため、プログラム動作中ではLCDに情報が表示されることとなります。
したがって、−1以外の値を指定するとボタンはコンソール上で操作されず、LCDに情報が表示されなくなります。 今回のサンプルプログラムでは−2としていますが、−1以外なら何でも構わないため、0などでもこのように動作します。

nNxtExitClicks
Exitボタン(中央下の濃いグレーボタン)を連続で何回押すことでプログラムを中断させるかを指定する変数です。 指定は整数で行います。デフォルトでは1ないし0となっています。
例えば、2と指定したときにはExitボタンを連続で2回押すとプログラムが中断されます。 今回は−1と指定しましたが、この場合は連続で何回押してもプログラムが中断されなくなるという設定です。

このようにして、先ほどの問題を解決しました。 ボタンを用いた制御を行うときには、今回追記した文を忘れないで記述しておくとよいでしょう。



6.サウンドセンサの使用 TOPへ 8.LCDの使用