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