ユーザーインターフェース

ここではロボットを制御するためのプログラムのユーザーインターフェース部分を作ります。

制御プログラムには以下のような仕様を満たしている必要があります。

  1. ユーザーのキーボードによるコマンドを受け付ける。
  2. I/Oを操作し、モーターの回転を制御する。
  3. 正常に終了する。

また、一般的に以下のコマンドを処理する必要があります。

  1. 発進
  2. 旋回
  3. 加減速
  4. アーム動作

では以上のコマンド処理を行うC言語プログラムを一緒に考えて生きましょう


まず、コマンドを処理するためのプログラムの骨格を考えます。プログラムは、while文を使ってキーボードの状態を常に監視し続けます。キーボードを監視するための関数はkbhit()関数です。kbhit()関数(VisualC++では互換性の関係から_kbhit()です。この関数を使うためにはconio.hヘッダーをインクルードしなくてはなりません。)は呼ばれるとすぐに値を返し、それが呼ばれた瞬間、キーボードが押された状態であれば1(TRUE)を返し、押されていなければ0(FALSE)を返します。これを使ってキーボードが押されたとき、「キーボードが押されました。」と表示するプログラムを作りましょう。

#include <stdio.h>
#include <conio.h>

int main(void) {
    while(1) {//無限ループ
        if(_kbhit()) {
            printf("キーボードが押されました。\n");
        }
    }
    return 0;
}

このプログラムを停止するためにはCtrl+Cなどで強制的に終了させる必要があります。そうではなくて、q が押されたときに終了するようにプログラムを改造しましょう。それにはキーボードが押されたとき、押されたキーのコードがバッファーにたまっています。これを取り出しましょう。これにはgetch()関数(VC++なら_getch())です。

#include <stdio.h>
#include <conio.h>

int main(void) {
    while(1) {//無限ループ
        int command = _getch();
        printf("%cが押されました。\n",command);
        if( command == 'q' ) {//コマンドがqならばwhile文を抜ける。
            printf("終了します。\n");
            break;
        }
    }
    return 0;
}

ここからは複数のコマンドを処理しなくてはなりません。これにはswitch文を使います。

#include <stdio.h>
#include <conio.h>

void command_1() {
    //ここで 1 が押されたときの処理を記述する。
}

void command_2() {
    //ここで 2 が押されたときの処理を記述する。
}

・・・・・・・


int main(void) {
    while(1) {
        int command = _getch();
        if (command == 'q' ) {//quit.
            break;
        }
        switch ( command ) {
            case '1':
                command_1();
                break;
            case '2':
                command_2();
                break;
            ・・・・・


            default:
                //bad command.
                break;
        }
    }
    return 0;
}               

以降はロボコンのためのハードウェアを見ていきます。


ユーザーインターフェース編 ハードウェア編 I/O制御編

j