C言語でEV3開発(11)
opOUTPUT_STEP_POWERコマンド
どもです。
今回のエントリーでは、再びモーターを動かすためのコマンドについて書きます。
コマンドは、「opOUTPUT_STEP_POWER」です。
1.opOUTPUT_STEP_POWERコマンド
今回紹介するコマンドです。
コマンドのフォーマットは、以下の通りです。
今回紹介するコマンドは、これまで紹介してきたコマンドに対して、少し引数の数が多いです。
というのは、コマンド名が表す通り、「段階」ごとにモーターを動かすコマンドです。
バイト インデックス |
内容 | 値 |
---|---|---|
1 | コマンドコード | opOUTPUT_STEP_POWER(0xAC) |
2 | チャネル | |
3 | パワー (power) |
-100~100(%) |
4 | Step1: Powerに達するまでの 回転角度 |
0~4294967295(°) |
5 | Step2: Powerで回転させる角度 |
0~4294967295(°) |
6 | Step3: Powerが0になるまでに 回転させる角度 |
0~4294967295(°) |
7 | ブレーキ | 0 = ブレーキをかけない 1=ブレーキをかける |
上記の表に示したとおり、Step1~Step3に設定したそれぞれの「角度」だけモーターが回転します。
すなわち、コマンドの動作が完了した際には、Step1~Step3に設定した値の分だけモーターが回転しています。
なお、単位は「°」になります。
「rad(ラジアン)」ではないので、注意が必要です。
2.サンプルコード
というわけで、opOUTPUT_STEP_POWERコマンドを使用してモーターを動かします。
サンプルプログラムは、以下の通りです。
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include "lms2012.h"
#define CH_A (0x01)
#define CH_B (0x02)
#define CH_C (0x04)
#define CH_D (0x08)
// モーターのポート名
#define PWM_MOTOR_PORT_NAME ("/dev/lms_pwm")
typedef unsigned int UINT;
typedef signed int SINT;
//typedef unsigned char UBYTE;
//typedef signed int SBYTE;
typedef void VOID;
// モーターのファイルディスクリプター
SINT motor_fp;
/*****************************************************************************/
/* */
/* モーターを動作させるための各種関数 */
/* */
/*****************************************************************************/
/*
* プログラムの開始
*/
int ProgramStart(void) {
UBYTE Buf[4];
int ret;
Buf[0] = opPROGRAM_START;
ret = write(motor_fp, &Buf[0], 1);
return ret;
}
/*
* プログラムの停止
*/
int ProgramStop(void) {
UBYTE Buf[4];
int ret;
Buf[0] = opPROGRAM_STOP;
ret = write(motor_fp, &Buf[0], 1);
return ret;
}
/*
* モーターの動作開始
*/
int MotorStart(UBYTE ch) {
UBYTE Buf[4];
int ret;
Buf[0] = opOUTPUT_START;
Buf[1] = ch;
ret = write(motor_fp, &Buf[0], 2);
return ret;
}
/*
* モーターの動作停止
*/
int MotorStop(UBYTE ch) {
UBYTE Buf[4];
int ret;
Buf[0] = opOUTPUT_STOP;
Buf[1] = ch;
ret = write(motor_fp, &Buf[0], 2);
return ret;
}
/*
* モーターのリセット
*/
int MotorReset(UBYTE ch) {
UBYTE Buf[4];
int ret;
Buf[0] = opOUTPUT_RESET;
Buf[1] = ch;
ret = write(motor_fp, Buf, 2);
return ret;
}
/*===========================================================================*/
/* */
/* 今回対象のopOUTPUT_STEP_POWERコマンドを実行する */
/* */
/*===========================================================================*/
int StepPower(
UBYTE ch,
SBYTE power,
UBYTE step1,
UBYTE step2,
UBYTE step3,
UBYTE brake) {
int ret;
size_t size;
STEPPOWER stepPower = { 0 };
stepPower.Cmd = opOUTPUT_STEP_POWER;
stepPower.Nos = (DATA8) ch;
stepPower.Power = (DATA8) power;
stepPower.Step1 = step1;
stepPower.Step2 = step2;
stepPower.Step3 = step3;
stepPower.Brake = brake;
size = sizeof(stepPower);
ret = write(motor_fp, (void *) &stepPower, size);
return ret;
}
/*****************************************************************************/
/* */
/* メイン関数 */
/* */
/*****************************************************************************/
int main() {
UBYTE power = 100;
UBYTE step1 = 255;
UBYTE step2 = 255;
UBYTE step3 = 255;
UBYTE brake = 1;
motor_fp = open(PWM_MOTOR_PORT_NAME, O_RDWR);
if (motor_fp < 0) {
printf("Can not open MOTOR PORT\r\n");
return (-1);
}
ProgramStart();
ProgramStop();
ProgramStart();
MotorReset(CH_D);
MotorStart(CH_D);
StepPower(CH_D, power, step1, step2, step3, brake);
sleep(3);
MotorStop(CH_D);
ProgramStop();
close(motor_fp);
exit(0);
}
3.動かしてみた
というわけで、実際に動かしてみた場合の動画です。
見てわかるように、モーターは最初ゆっくり動き始め、その後だんだんゆっくりになり、最終的に停止します。
4.コマンドの注意点
このコマンドを使用する際には、注意点があります。
4.1.回転方向
まず、回転方向の制御です。
これは、Powerで決定します。
回転する角度に負の値を設定した場合、その値はCPU上で正の値と判定されます。
たとえば、「-100」を指定した場合には、「100」として認識されてしまいます。
また、Powerに0を設定した場合です。
これは、理想的にはモーターが動作しないことです。
しかし、実際に動かしてみると、モーターは動作してしまいます。
原因は、不明です。(たぶん、ドライバ周りが問題なんでしょう…)
4.2.StepN(N=1~3)
次に、StepNに設定する値です。
ます、Step1には、必ず値を設定しなければなりません。
Step1に値を設定しなかった場合、モーターはきちんと動作しないようです。(というか、しませんでした。)
Step2、およびStep3ですが、Step1が設定してあれば、特に設定する必要はないようです。(実際に、値を設定しなくても、モーターは動作しました。)
まとめ
以上、今回は、opOUTPUT_STEP_POWERコマンドについて書きました。
次回も、引き続きモーターを動作させるためのコマンドを紹介していきます。
では。
…今回の動画は、さすがに短すぎる…。シュール!?
ディスカッション
コメント一覧
まだ、コメントがありません