C言語でEV3開発(8)-opOUTPUT_POWERコマンド

2021年1月30日

どもです。
今回のエントリーでは、EV3でモーターを動かします。

なお、今回のエントリーでもUbuntu/Eclipseでのクロス環境を前提として、本文を作成します。

1. ポートのオープン/クローズ

InteligentBoxのポートのオープンです。
ここで指定するポート名には、"/dev/lms_pwm"を指定します。
実際のコードは、以下。

fd = open("/dev/lms_pwm", O_RDWR);    // ポートを開く

2. プログラムのスタート

EV3上でモーターを動作させるためには、プログラム内で以下の「コマンド」を実行する必要があります。

  • opPROGRAM_START
  • opOUTPUT_START

そして、これらのコマンドを実行するためには、以下のコードを実行します。

//opPROGRAM_STARTコマンド
UBYTE Buf[4];
int ret;

Buf[0] = opPROGRAM_START;
ret = write(motor_fp, &Buf[0], 1);
//opOUTPUT_STARTコマンド
UBYTE Buf[4];
int ret;

Buf[0] = opOUTPUT_START;
Buf[1] = ch; // モーターが接続されているInteligentBoxのポート番号
ret = write(motor_fp, &Buf[0], 2);

3.モーターを動かす

  • opOUTPUT_POWER

このコマンドでは、前述の2つのコマンドの様にコマンドコードを実行するだけではありません。
動作させるためは、動作するスピード/パワーを指定する必要があります。
スピード/パワーは、-100~100で指定します。単位は、"%"です。
そして、実際のコードは以下の通りです。

//opOUTPUT_POWERコマンド
UBYTE Buf[4];
int ret;

Buf[0] = opOUTPUT_POWER;
Buf[1] = ch;
Buf[2] = power; //  -100~100
ret = write(motor_fp, Buf, 3);

4.モーターを止める

モーターを止めます。
これには、以下に示す2通りの方法があります。

  1. opOUTPUT_POWERコマンドで、powerに0を指定する。
  2. opOUTPUT_STOPコマンドを実行する。

それぞれのコードを、それぞれ順番に示します。

4.1.opOUTPUT_POWERコマンドを実行する

opOUTPUT_POWERコマンドでpowertに0を指定するコードは、以下になります。

UBYTE Buf[4];
int ret;

Buf[0] = opOUTPUT_POWER;
Buf[1] = ch;
Buf[2] = 0;		//出力:「0」に設定
ret = write(motor_fp, Buf, 3);

4.2.opOUTPUT_STOPコマンドを実行する

opOUTPUT_STOPコマンドは、以下のコードで実行します。

UBYTE Buf[4];
int ret;

Buf[0] = opOUTPUT_STOP;
Buf[1] = ch;
ret = write(motor_fp, &Buf[0], 2);

4.3.方法の違い

もちろんですが、これらの処理ではそれぞれ違いがあります。
opOUTPUT_POWERコマンドを使用した場合には、再度モーターを雨後層とした場合には、再度opOUTPUT_POWERコマンドを実行すればモーターの動作を開始できます。
しかし、opOUTPUT_STOPコマンドを実行した場合には、再度opOUTPUT_STARTコマンドを実行する必要があります。
また、opOUTPUT_STOPコマンドでモーターの動作を止めた場合、opOUTPUT_POWERでパワーを0にせずに再度opOUTPUT_STARTを実行すると、すぐにモーターの動作が開始されます。

このような違いがあるので、モーターを止める手順については注意が必要です。

5.プログラムのストップ

モーターの動きを停止します。
このためには、以下の順番でコマンドを実行する必要があります。

  • opOUTPUT_STOP
  • opPROGRAM_STOP

opOUTPUT_STOPについては、既出なので割愛します。
ここでは、opPROGRAM_STOPのコードののみ紹介します。

5.1.opPROGRAM_STOPのコード

opPROGRAM_STOPは、以下のコードで実行します。

UBYTE Buf[4];
int ret;

Buf[0] = opPROGRAM_STOP;
ret = write(motor_fp, &Buf[0], 1);

6.ポートのクローズ

これは、特筆することないです。
以下のコードで、完了します。

close(fd);

6.まとめ

以上、モーターを動作させる際の、基本的な手順を示しました。
次回は、モーターを動作させる他のコマンドについてのエントリーを作成します。