妻のExcelの勉強は,少しずつではあるが続いている。土曜か日曜の午後,少し時間ができたときにマニュアル本を片手に1時間程度,パソコンに向かっている。そんな呑気なペースでいいのかと思わなくもないのだが,遅々としたペースだから続いているのかもしれない。
ある日,「分数を入力したけど,文字列として入力したときと字が違うの」と質問された。分数ってどうやって入力するんだ? もう自分の知らないところに進んでいることに,ちょっと驚いた。
Excelで帯分数を入力する方法を,みなさんはご存じだろうか。イッカニブンノイチと入力するときは,「1スペース1/2」と入力する。
本当に分数として入力されているかを確かめるために,となりのセルに4と入力し掛け算をしてみた。計算結果が6なので,1.5という数値であることが確認できる。そんな面倒なことをしなくても上の数式バーには,最初から1.5と表示されている。
単に,ニブンノイチは「0スペース1/2」と入力する。
「字が違う」といったときに,PCのディスプレイをのぞき込むとこのように表示されていた。分数を分数として入力する方法と文字列として入力する方法を試していたらしい。文字列として入力するには,ご存じのようにシングルクォートを最初に打つ。
PCを主にワープロ代わりとして使っている人の常で,漢字変換がいつもオンになっていたのだ。だから,文字列としてニブンノイチは2バイトのまま,分数としてのニブンノイチは数値として認識され,1バイトに変換されて表示されていたのだ。
さて,前回,MindStormsの本体RCXにbrickOSをダウンロードした。brickOS上で動くロボット制御のプログラムはC言語とC++言語で作成することができる。brickOSのC言語は標準ファーム上で動くNQCと比べると,よりC言語らしいC言語である。今回は簡単なチュートリアルを書いてみたい。
まず,モーターを回すコードからだ。モーターを使うときは,dmotor.hをインクルードしなければならない。
-----------------------------------------
#include
#include
int main(int argc, char *argv[]) {
motor_a_speed(MAX_SPEED);
motor_a_dir(fwd);
sleep(4);
motor_a_dir(rev);
sleep(4000);
motor_a_dir(brake);
return 0;
}
-----------------------------------------
モーターの回転速度は,0から255までの範囲で指定できる。他の開発環境にくらべて範囲が広いので,細かいコントロールがしやすいだろう。ちなみに,motor_a_speed(10)で前回作成したエッジくんもどきを走らせてみたら,確かに少しだけ動いた。
しかし,そこまで細かい指定が必要なければ,定数宣言されているMAX_SPEEDを基準として,motor_a_speed(MAX_SPEED/2)やmotor_a_speed(MAX_SPEED/3)と速度を指定したほうがわかりやすいだろう。
回転方向は,motor_a_dir(fwd)やmotor_a_dir(rev)のように指定する。brakeを引数に指定すると止まる。sleepは秒単位で,msleepはミリ秒単位だ。疑問の余地のない直接的な関数名である。sleepやmsleepのプロトタイプ宣言は,unistd.hに記述されている。
次にタッチセンサーを調べてみた。brickOSのC言語では,何の準備もなしにタッチセンサーの値を取得することができる。タッチセンサーは押されているか押されていないかの2値しか返さないように,普通は思う。True/Falseを表すブール型で扱えば十分な気がするが,実はbrickOSでは16ビットでタッチセンサーの値が返ってくるのだ。
下記のプログラムでは,タッチセンサーはポート1に繋がっている。
-----------------------------------------
#include
#include
#include
int main(int argc, char *argv[]) {
while(1){
cputw(SENSOR_1);
sleep(1);
}
return 0;
}
-----------------------------------------
タッチセンサーは押されているときに16進の0xf000より小さい値を返す。
cputw関数でRCXの液晶ディスプレイに値を表示させている。
タッチセンサーをギュッと押していると,ロボットが動いて写真の角度も変わってしまったのだが,押し具合によってタッチセンサーの返す値が変わるのだ。
押されていないときは大きな値が返ってくる。次回はライトセンサーの制御について調べてみたい。