mbed を使ったロボット作成 第5回

モータ制御してみる
はじめに
今回はロボットの関節で使用するモータの制御について記載していきます。
モータといっても、様々な種類のモータがあります。
ロボットの関節を制御するという観点で着目すると、特定の角度まで制御できること、制御後の状態を保持できるこが必要となってきます。
これらの点で市販製品を探すとサーボモータが最も相応しいと思いますので、サーボモータを使った制御してみようと思います。
サーボモータについて
サーボモータは、パルスを受信しそのデューティ比で回転角度を制御するモータです。
パルス幅としては1msから2ms程度です。
今回使用するのは、KumanというメーカのSG90というマクロサーボを使用します。
| 製品名 | SG90 マイクロサーボ |
| メーカー | Kuman |
| 概要 |
|
| 値段 | 400円 |
サーボモータからは3本線が出ており、茶色がGND線、赤が電源[+V]、橙が制御信号制御信号用の線となります。

mbedとの接続は以下のとおり

SG90の赤に電源(5V)を接続し、茶をGNDに接続します。
mbedとの接続は、D2のデータポートをSG90の橙に接続します。
3本接続するだけなので、わりと簡単に配線することができます。
ソフトウェアについて
SG90を制御する為にPwmOut(パルス幅変調出力)クラスを継承したServoSg90クラスをC++で作成しました。
/*****************************************
* ServoSg90.h
*****************************************/
#ifndef SV_SG90_H
#define SV_SG90_H
#include "mbed.h"
#include "PwmOut.h"
class ServoSg90: public PwmOut
{
public:
/* コンストラクタ */
ServoSg90( PinName port ):PwmOut( port ){}
/* 初期化処理 */
void init();
/* 回転処理 */
int roll( unsigned int angle );
};
#endif /* SV_SG90_H */
/*****************************************
* ServoSg90.cpp
*****************************************/
#include "ServoSg90.h"
#define SG_PERIOD 20 /* 20[msec] */
#define SG_NEUTRAL 1450 /* 90° 1450[usec] */
/* 初期化処理 */
void ServoSg90::init(){
/* 周期の設定を行う */
period_ms( SG_PERIOD );
/* 90°に角度調整 */
pulsewidth_us( SG_NEUTRAL );
}
/* 回転処理 */
int ServoSg90::roll( unsigned int angle ){
int lPulseWidth = 0;
/* 回転する角度が90より小さい場合 */
if( angle < 90 ){
lPulseWidth = ( 90 - angle ) * 10;
lPulseWidth = SG_NEUTRAL - lPulseWidth;
/* 回転する角度が90より大きく180以下の場合 */
} else if ( angle <= 180 ){
lPulseWidth = ( angle - 90 ) * 10;
lPulseWidth = SG_NEUTRAL + lPulseWidth;
/* 上記以外はエラー */
} else {
return -1;
}
/* ポートに流すパルスの時間を設定する */
pulsewidth_us( lPulseWidth );
return 0;
}
このクラスを利用する箇所の実装は以下のとおり。
#include "mbed.h"
#include "ServoSg90.h"
/* 引数に使用するデータ線の番号を指定宣言する */
ServoSg90 servo0(D2);
/**
* メイン処理
*/
int main()
{
/* init servo */
servo0.init();
・・・
/* roll servo */
servo0.roll(80);
servo0.roll(120);
・・・
}
動作確認結果

問題なく制御することができました。
今回作成したクラスを使えば、サーボモータが複数個になった場合、その分クラスのインスタンスを生成しておけば、個々で制御することが可能です。
このサーボモータを使って、どの様な関節を構成するが課題として残りますが、
それはまた別の機会にお話ししたいと思います。
以上。