ラジコンサーボを動かす
考え方など基本は同じですので、まず Tekurobo工作室
ラジコンサーボモーターを動かす を見てください。 ここでラジコンサーボの動作の原理がほぼわかるとおもいます。
ラジコンサーボモーター(RCサーボ)を動かす制御をやってみます。
上記HPにあるように、RCサーボモーターは決まったパルス幅のパルスを送り込めば、それに応じて角度回転します。
SPモーターと異なり、新たに入力したパルス数に応じた角度回転するものではなく、
入力パルス幅で目標角度が決まります。だから、同じパルス幅を送り込み続ければ回転はせず、停止したままです。
パルス幅で制御するということから制御は難しそう? という先入観を持ちますが、正確なパルスを作ることが出来れば、ステッピングモーターよりずっと簡単、楽です。
そのため、歩行用ロボットなどには多用されています。一度ラジコンサーボを動かしてみれば、その多用されている理由がわかるでしょう。やっぱり一番有用、手軽です。
ラジコンサーボモーターを動かすには
パルスをサーボモーターに入力するだけです。その入力パルス幅によって決まった角度に回転します。
パルス幅 = 目標角度 になります。
例えば、仮に
1.7ms = 30° と考えれば、
1.7msのパルスを信号ラインに送り込んでやればいいだけです。すると30°回転します。
ずっと1.7msのパルス幅を送り込み続けても、30°の角度で停止したままです。
1.8ms = 40°(更に10°) と回転し、角度を変えます。(パルス幅、回転角度などはサーボモーターによって異なる)
つまり、回転させたい角度のパルス幅を送り込むだけでいい。そして、パルス幅はマイコンで簡単に作ることができる。
だから制御が簡単。
ラジコンサーボはトルクもあるし、制御も簡単、SPモーターより軽い、ということで多用されるわけです。
やってみれば簡単です。
タイマーW を使用してきたので、これでパルス幅を作り制御します。
ここではフタバの一般のラジコンサーボS3003 を使用しました。
設定
マイコンでパルスを作る
パルスはモーターのPWM制御でも、SPモーター制御にも、以前に出てきましたが、凸凹している波形なので難しそうに見えますが、例えば、1.5ms幅のパルスを作るには
ピン出力をONにして、1.5ms後にOFFにする、そしてOFF に10ms程おいて、またON で1.5ms・・・ という設定で1.5ms幅のパルスが作られます。
タイマーを使えば、その設定だけでラジコンサーボ用の制御パルスを作れます。
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出力設定
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の設定値で 周期とパルス幅を調節できます。
周期と周波数
周期と周波数 周期は波の長さ (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
回路図
フタバの一般のラジコンサーボ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出力設定
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)
- twtter
- google+
- hatena