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

モータ制御してみる

 

はじめに

今回はロボットの関節で使用するモータの制御について記載していきます。

モータといっても、様々な種類のモータがあります。

ロボットの関節を制御するという観点で着目すると、特定の角度まで制御できること、制御後の状態を保持できるこが必要となってきます。

これらの点で市販製品を探すとサーボモータが最も相応しいと思いますので、サーボモータを使った制御してみようと思います。

サーボモータについて

サーボモータは、パルスを受信しそのデューティ比で回転角度を制御するモータです。

パルス幅としては1msから2ms程度です。

今回使用するのは、KumanというメーカのSG90というマクロサーボを使用します。

製品名 SG90 マイクロサーボ
メーカー Kuman
概要
  • PWMサイクル:20ms
  • 制御パルス:0.5ms~2.4ms
  • 制御角:±約90°(180°)
  • 動作速度:0.1s/60°
  • 動作電圧:4.8V(~5V)
  • 温度範囲:0℃~55℃
  • 外形寸法:22.2×11.8×31㎜
  • 重量:9g
値段 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);
・・・
}

 

動作確認結果

 

問題なく制御することができました。

今回作成したクラスを使えば、サーボモータが複数個になった場合、その分クラスのインスタンスを生成しておけば、個々で制御することが可能です。

このサーボモータを使って、どの様な関節を構成するが課題として残りますが、

それはまた別の機会にお話ししたいと思います。

 

以上。

\ 最新情報をチェック /