ラジコンサーボを動かす

ラジコンのサーボモーターをマイコンで動かす制御方法


タイマーWのパルス発生機能を使って、ラジコンサーボの回転角度を制御する。
タイマーWのパルス発生機能の解説


ラジコンサーボを動かす

考え方など基本は同じですので、まず Tekurobo工作室
ラジコンサーボモーターを動かす を見てください。 ここでラジコンサーボの動作の原理がほぼわかるとおもいます。

 

ラジコンサーボモーター(RCサーボ)を動かす制御をやってみます。
上記HPにあるように、RCサーボモーターは決まったパルス幅のパルスを送り込めば、それに応じて角度回転します。

 

SPモーターと異なり、新たに入力したパルス数に応じた角度回転するものではなく
入力パルス幅で目標角度が決まります。だから、同じパルス幅を送り込み続ければ回転はせず、停止したままです。

パルス幅で制御するということから制御は難しそう? という先入観を持ちますが、正確なパルスを作ることが出来れば、ステッピングモーターよりずっと簡単、楽です。

そのため、歩行用ロボットなどには多用されています。一度ラジコンサーボを動かしてみれば、その多用されている理由がわかるでしょう。やっぱり一番有用、手軽です。


ラジコンサーボモーターを動かすには

パルスをサーボモーターに入力するだけです。その入力パルス幅によって決まった角度に回転します。

 

パルス幅 = 目標角度  になります。
例えば、仮に


1.7ms =  30°   と考えれば、


1.7msのパルスを信号ラインに送り込んでやればいいだけです。すると30°回転します。 ずっと1.7msのパルス幅を送り込み続けても、30°の角度で停止したままです。

 

1.7msのパルス幅を送り込み続け 30°の角度で停止していたのが、送り込まれるパルス幅が 1.7ms → 1.8ms に変わると サーボモーターはすぐさま
1.8ms = 40°(更に10°) と回転し、角度を変えます。(パルス幅、回転角度などはサーボモーターによって異なる)

 

つまり、回転させたい角度のパルス幅を送り込むだけでいい。そして、パルス幅はマイコンで簡単に作ることができる。
だから制御が簡単。

 

ラジコンサーボはトルクもあるし、制御も簡単、SPモーターより軽い、ということで多用されるわけです。
やってみれば簡単です。

 

タイマーW を使用してきたので、これでパルス幅を作り制御します。
ここではフタバの一般のラジコンサーボS3003 を使用しました。

設定

マイコンでパルスを作る


パルスはモーターのPWM制御でも、SPモーター制御にも、以前に出てきましたが、凸凹している波形なので難しそうに見えますが、例えば、1.5ms幅のパルスを作るには ピン出力をONにして、1.5ms後にOFFにする、そしてOFF に10ms程おいて、またON で1.5ms・・・ という設定で1.5ms幅のパルスが作られます。

 

タイマーを使えば、その設定だけでラジコンサーボ用の制御パルスを作れます。

 

puluse-chart

TekuRobo工作室の図を使用させてもらいました

 

一般のラジコン用サーボ制御で重要なのは、ON (凸)の時間で、サーボの種類によりますが
 1ms - 2msの範囲で指定するものが多いようです。

 

周期は図の20mSですが、周期は(つまりOFF時間長さをどうするか)、これは幅があるようで、10ms~20msぐらいでもいいようです。(小さくしたほうが応答性はよいでしょう)

ここでは、タイマーWの設定だけで、そのパルス幅を変えて、首振りの動作をさせてみます。

 

周期は10ms

パルス幅は
1.5ms(中央) → 1.2ms → 1.3ms → 1.4ms → 15ms  と変えていきます。

 

タイマーW設定

ここで、タイマーWの PWM出力機能 を使用します。

タイマーWのPWM出力機能では、3つの出力ピンまで別々のパルス信号を出力することが出来ます。(FTIOBとC、Dに違うパルス出力可能)
ここでは1つの出力 FTIOB ピンしか使いません。

プログラム内で、その出力のパルスの幅を次々といくつか変えてみて、サーボの回転角を変えます。

 

タイマーWのPWM出力

周期はGRAで設定します。
パルス幅はGRBで設定し、FTIOBピンから出力する。

 

PWM出力設定
TMRW
Bit 7 6 5 4 3 2 1 0
ビット名 CTS - BUFEB BUFEA - PWMD PWMC PWMB
設定値 0 0 0 0 0 0 0 1


FTIOBピンに出力するのでPWMBを1に設定
TW.TMRW.BYTE=0x01  (0000 0001)

 

TCRW

Bit 7 6 5 4 3 2 1 0
名称 CCLR CKS2 CKS1 CKS0 TOD TOC TOB TOA
設定説明 マッチAで
カウンタクリア
φ/8 D初期値0 C初期値0 B初期値1 A初期値0
設定値 1 0 1 1 0 0 1 0

FTIOBピンの出力の初期値を 1 にする設定。(TOB : 1)
他はこれまでと同様。
TW.TCRW.BYTE=0xB2   (1011 0010)

 

この設定で
コンペアマッチBで
 出力FTIOB 1 → 0

コンペアマッチAで カウンタクリア (TCNT → 0)
と共に
出力FTIOB → 1 
になります。 (下図)

 

周期とパルス幅の設定

  • 周期の設定をGRA
  • パルス幅を GRB

として GRA,GRBの設定値で 周期とパルス幅を調節できます。

pulse-timerchart2

 

周期と周波数

周期と周波数 周期は波の長さ (1周期の長さ)
周波数は1秒間に何回の波があるか
1つの波(1周期)が1秒間に100回あれば100[Hz]

 

周波数 f と 周期T の関係は 
f = 1/T  または T = 1/ f

 

内部クロックの1/8( 2MHz )に設定するので、

 

周期の設定のためのGRAの設定値計算

 

周期を10msにするには GRAは

 

<周波数[Hz]で考えると>

10ms は 1/10 ×1000(ms) = 100Hz
GRA= 2000000(2M) / 100 = 20000    (10msのGRA設定値)

 

<パルス幅[ms]から計算すると>

2000000(2M) / 1000 × パルス幅ms
2000 × 10 = 20000


GRA=20000 に設定

 

パルス幅の設定のためのGRBの設定値計算

 

パルス幅を1.5msにするには GRBは

 

<周波数で考えると>

1.5ms は 1/1.5×1000= 666Hz
2000000(2M) / 666 × 1000 = 3000 (1.5msのGRB設定値)

 

<パルス幅[ms]から計算すると>

2000000(2M) / 1000 × パルス幅ms
2000 × 1.5 = 3000 (1.5msのGRB設定値B)

 

GRB=3000 に設定

 

その中心1.5ms から パルス幅 ±0.5ms の範囲で回転させてみます。
1.5ms(中央) → 1.0ms → 1.2ms → 1.4ms → 15ms 
(あまり大きく回転させると範囲を越えてギアがこわれる恐れがあります)

 

同様に パルス幅から計算すると(2000 × パルス幅ms)

(1.5msのとき) GRB= 3000 

(1.0msのとき) GRB= 2000

(1.2msのとき) GRB= 2400

(1.4msのとき) GRB= 2800

(1.6msのとき) GRB= 3200

(1.8msのとき) GRB= 3600

( 2.0msのとき) GRB= 4000 

 

回路図

 

sarvo制御1回路図

 

フタバの一般のラジコンサーボS3003 使用です。
ラインは 赤が電源+(5V)
黒が GND
白が パルス信号
となっています。
* モーター電源は必ず別電源を使用のこと。H8ボードのピンからも5Vが取れますが使わないように。

 

プログラム

 

HP_Servo


 
//  PWM信号でサーボを動かす 

#include<3664.h>

void msecwait(int msec)
/*mesc間なにもしない時間稼ぎ関数*/
{
    int i,j;
    for (i=0;i< msec;i++) {
        for (j=0;j<1588;j++);    /* 1588=0.02s約 */    }
}
void main(void)
{

  DI;
  TW.TMRW.BYTE=0x01;      // FTIOB端子をPWM出力に設定 
  TW.TCRW.BYTE=0xB2;      // マッチAでカウンタクリア、内部クロックの1/8( 2MHz ) FTIOBの初期値は1

  TW.TCNT=0x0000;         // TCNの初期化 
  TW.GRA=20000;            // 20mS (50Hz)
  TW.GRB=3000;            // 1.5mS 
  
  TW.TMRW.BIT.CTS=1;      // TCNTカウンタスタート 
  EI;
  
  //段階的に速くしてみる
  
  while(1){
 
 //センター
    TW.GRB=3000;            // 1.5mS   
 //   outs("3000\r\n");
     msecwait(1000); //2s
   
 //右回転   
    TW.GRB=2000;      // 1.0mS 
      msecwait(1000);

     TW.GRB=2400;     // 1.2mS      
      msecwait(1000);  
      
     TW.GRB=2800;     // 1.4mS     
      msecwait(1000);       
 
  //センター
    TW.GRB=3000;            // 1.5mS   

     msecwait(1000);  
 
            
 //左回転   
   TW.GRB=4000;      // 2.0mS 
      msecwait(1000);  

     TW.GRB=3600;       // 1.8mS    
      msecwait(1000);  
      
     TW.GRB=3200;        // 1.6mS   
      msecwait(1000);       
     
  }
}

       

 

ほとんどタイマーWの設定だけです。

 

タイマーWのPWM出力設定にし、
 周期は10ms 固定  (GRA設定値で3000
 パルス幅を1.5ms ±0.5 の範囲 (GRB設定値で3000 ±1000

 

パルス幅でサーボモーターの回転角度が変わります。パルス幅を変えるためにGRBをwhile(1)ループ内で変更しています。
パルス幅はGRBに、角度に対応した設定値を入れることでサーボの回転角度を変えます。

 

msecwait(int msec)で無駄ループで間隔をあけ、パルス幅を次々変えて、サーボの回転を変えます。

 

実行結果

まず、サーボモーターに入力する前に 3664の出力をテスターでデューティ比を測ってみると、目的のパルス幅と同じでした。

 

サーボモーターは
最初 中央(1.5ms、GRB=3000)→ 約45°(1.0ms、GRB=2000)
 → 30°ぐらい(1.2ms、GRB=2400) → ・ ・ ・
と 約2秒おきに 回転角度を変えていきます。

 

今回はただ、首振りの動作確認だけでした。実際に使う段階では応用として、いろいろな入力を取り込んでサーボのパルスにして出力することになると思います。

 

まとめメモ

タイマーWのPWM出力機能では 3つの別々のパルスを出力できる。

 

●PWM出力

  • GRAで周期
  • GRB、 GR・・GRD で各パルス 入力する
  • 出力ピンは FTIOB 、FTIOC、FTIOD

 

PWM出力設定

TMRW
Bit 7 6 5 4 3 2 1 0
ビット名 CTS - BUFEB BUFEA - PWMD PWMC PWMB
設定値 0 0 0 0 0 0 0 1

FTIOBピンに出力するのでPWMBを1に設定
TW.TMRW.BYTE=0x01  (0000 0001)


TCRW
Bit 7 6 5 4 3 2 1 0
名称 CCLR CKS2 CKS1 CKS0 TOD TOC TOB TOA
設定説明 マッチAで
カウンタクリア
φ/8 D初期値0 C初期値0 B初期値1 A初期値0
設定値 1 0 1 1 0 0 1 0

FTIOBピンの出力の初期値を 1 にする設定。(TOB : 1)
TW.TCRW.BYTE=0xB2   (1011 0010)

 

 

スポンサーリンク
  • facebook
  • twtter
  • google+
  • hatena