■>サンテックのホームページTOPへ       ■>サンおやじの工作室TOPへ
    工作室
       第2章 RCサーボの性能を調べる

<工作室に戻る
プレステのコントローラでRCサーボを動かそう
  ■第1書 RCサーボをどうやってコントロールするか
  ■第2章 RCサーボの性能を調べる
  ■第3章 PC用ジョイスッテックをRCサーボをコントロールする
10ms周期で8個のRCサーボを制御する
RCサーボコントローラの限界に挑戦!

 第2章 RCサーボの性能を調べる

RCサーボの制御方法はだいたいわかったでしょう。
でもちょっと疑問も有りませんか?
周期14.4mS  パルス幅1〜2.1mS
この数値、実測しただけで本当はどの程度まで使えるのでしょうか?
そこで、RCサーボの性能を調べてみました。

まず、機械的な限界を調べます。
方法は簡単、電源を切ったRCサーボを左右に手で回してみます。
壊さないようにゆっくり回します。
右に回しきった所と、左に回しきった所に印をしておきます。これがメカニカルな限界です。
写真1の緑色の範囲が機械的に動かすことのできる範囲で、およそ200度です。
そして、第1章で使ったソフトを動かしてみると・・・・・???
写真1の青い範囲しか動いていません。
範囲はおよそ110度程度です。
しかも、動作範囲のセンター(青い線)とメカニカルなセンター(赤い線)は20度近くずれています。
どうすれば制御範囲を広げられるのか調べてみましょう。

 


写真1

写真1をみて判ってしまった人もいると思いますが、パルス幅を0.4〜2.3mSまで変える事でメカニカルな限界までRCサーボを制御することができます。
ただしこの値は”サンおやじ”の手元に有ったS3003を実測した値で、全てのS3003が同じ性能かどうか判りません。
もちろんメーカや型式が違えば特性が違うことが容易に推測できます。
この範囲を超えるパルスを与えると、RCサーボを壊すことが有りますので充分注意が必要です。

次に制御周期はどんな影響が有るのでしょう?周期を14mSからどんどん早くしていくと、9mSを割ったあたりからRCサーボがジージー鳴き始めます。
パルス幅を変化させると、動きもぎこちない感じです。
今度は逆に制御周期を伸ばして見ましたが、特に問題は発生しませんでした。
それなら周期は1Sでも良いのでしょうか?
第1章で説明したように、RCサーボはパルスの幅で位置を決めています。
このパルスが1秒に1回しか来なければ、RCサーボは1秒単位でしか角度を変えられなくなってしまいます。
つまり、周期を伸ばすと応答速度(反応速度)が落ちてしまいます
もう一つ、RCサーボは制御信号を与えないと、モーターに電気を流さない仕組みになっているようです。
通電(端子のショート状態を含む)していないDCモータは制動(ブレーキ)がかかりませんから、負荷をかけると簡単に動き出してしまいます。
つまり、無制動の状態が長くなれば位置を保持できませんからトルクが下がります
こう書くと周期は早いほうが良いと思うかもしれませんが、そうばかりでもありません。
周期が早くなると確かにトルクは上がりますが、消費電力も増えます。

  ダウンロードアダプタ(H8シリーズ)」と
H8Tiny CPUボード」を使用してRCサーボの制御限界を調べている所。
接続しているフラットケーブルは、
パソコンとH8Tiny CPUボードを接続しよう(レベルコンバータ)で紹介したスイッチ切り替え式のダウンロードケーブル。
電源も供給できるため、1章例よりさらに配線がすっきりしている。

プログラムの説明に入る前に、”サンおやじ”の測定結果をまとめておきます。

パルス幅 メカニカルリミット   
左90度
メカニカルセンタ
右90度
0.4〜2.3mS
2.22mS
1.35mS
0.46mS
周期   9mS以上
ただし、周期が短いとトルクは増えるが消費電力も増える

(”サンおやじ”の手元に有ったS3003の実測値) 

リスト1はRS232Cを使って、周期とパルス幅をパソコンから変更できるようにしたプログラムです。
PWM制御の部分は第1章のプログラムと変わりませんから、RS232Cの設定と受信したデータの処理部分だけを載せます。
RS232C(シリアル)は割り込みプログラムで処理することが多いのですが、今回は特に割り込みの必要も無いので、メインルーチンの中でループして処理しています。

リスト1

/*シリアルの設定*/
/*シリアルコントロールレジスタの設定*/

SCI3.SCR3.BYTE = 0;
/*シリアルモードレジスタの設定*/

SCI3.SMR.BIT.COM = 0;
SCI3.SMR.BIT.CHR = 0;
SCI3.SMR.BIT.PE = 0;
SCI3.SMR.BIT.PM = 0;
SCI3.SMR.BIT.STOP = 1;
SCI3.SMR.BIT.MP = 0;
SCI3.SMR.BIT.CKS = 0;
/*ビットレートレジスタの設定*/

SCI3.BRR = BRR9600;
/*シリアルステータスレジスタの設定*/
temp = SCI3.SSR.BYTE;
SCI3.SSR.BIT.OER = 0;
SCI3.SSR.BIT.FER = 0;
SCI3.SSR.BIT.PER = 0;
SCI3.SSR.BIT.TDRE = 0;

SCI3.SCR3.BIT.TE = 1;
SCI3.SCR3.BIT.RE = 1;

IO.PMR1.BIT.TXD = 1;

------------------------------------

int main (void)
{  /*シリアルでRCサーボを制御する*/
  FreqFlg = 0;
  RecVal = 0;

do
  {  /*シリアルデータの受信待ち*/
    do
    {  if((SCI3.SSR.BYTE & 0x38) != 0x00)
        SCI3.SSR.BYTE = 0x84;
      else if(SCI3.SSR.BIT.RDRF == 1)
      {  tmp = SCI3.RDR;
        break;
      }
    }while(1);
    /*受信した文字列の処理*/
    if(tmp == ESC_KEY)
    {  /*受信データをクリアしてCRを送り返す*/
      RecVal = 0;
      tmp = CR;
    }
    else if((tmp=='p')||(tmp=='P'))
      FreqFlg = 0;
    else if((tmp=='f')||(tmp=='F'))
      FreqFlg = 1;
    else if(tmp == CR)
    {  if(FreqFlg == 0)
        TW.GRB = RecVal;
      else
        TW.GRA = RecVal;
      RecVal = 0;
    }
    else if((tmp>=0x30)&&(tmp<=0x39))
      RecVal = RecVal * 10 + tmp - 0x30;
    /*エコーバック送信*/
    while(SCI3.SSR.BIT.TDRE != 1);
    SCI3.TDR = tmp;
  }while(1);
}




/*送受信と全てのシリアル割り込み停止*/

/*調歩同期*/
/*データ長8*/
/*パリティ無し*/

/*ストップ1*/
/*マルチプロセッサモード無効*/
/*クロック分周0*/

/*9600BPS設定*/

/*一度読み込まないとステータスをクリアできない*/
/*OERクリア*/
/*FERクリア*/
/*PERクリア*/
/*TxEmptyクリア*/

/*送信可に設定*/
/*受信可に設定*/

/*P22を TXDに設定*/

----------------------------------------------



/*パルス幅設定*/
/*受信した値*/




/*受信エラー?*/


/*1文字受信*/
/*ループを抜ける*/



/*データキャンセル*/

/*データクリア*/
/*送信文字セット*/

/*パルス幅設定モード*/
/*フラッグ設定*/
/*周期設定モード*/
/*フラッグ設定*/

/*データ設定*/





/*設定値計算*/
/*桁上げ後ASCIIコードを数値にして加算*/

/*送信終了待ち*/
/*データ送信*/

全てのソースと回路図、モトローラSファイルは以下からダウンロードしてください。
回路図・ソース・モトローラSのダウンロード(checkrc_2.lzh)

使い方を少々説明しておきます。
ここでは、Windowsに標準で付属しているハイパーターミナルを使用します。
スタート -> プログラム -> アクセサリ -> 通信 -> ハイパーターミナル
で、ハイパーターミナルを起動します。
ハイパーターミナルがインストールされていない場合は、
コントロールパネルプログラムの追加と削除からWindowsコンポーネントの追加と削除
追加してください。
ハイパーターミナルを起動すると接続の設定ダイアログが現れます。
自分の好きな名前を入れてOKを押します。(仮にCheckRC_2と入力した事にします)
次に、接続方法を選択します。
COM1COM2または利用できるRS232Cポートを選択してOKを押します。
続いてポートの設定になりますので、
ビット/秒    9600
データビット   8
パリティ     なし
ストップビット  1
フロー制御   なし

に設定してOKします。
ファイルメニューのプロパティを開き、設定タブのASCII設定を開いて、行末に改行文字を付ける
にチェックを入れてOKします。
この後、通信から切断を選択します。
再度、通信を選択して、電話を選択し通信を再開します。(一度切断しないと変更が反映されません)

この状態で、
p4000      (Enterキーを押すのを忘れないでください)
と入力するとパルス幅が
250nS × 4000 = 1mS
に設定されます。入力できる範囲は0〜65535です。逆に
設定したいパルス幅(mS) × 4000 = 設定値
が計算できます。

f40000     (Enterキーを押すのを忘れないでください)
と入力すると周期が変わります。入力できる範囲は0〜65535です。
計算方法はパルス幅と同じです。入力途中で値をキャンセルしたい場合はESCキーを押してください。

画面上はカーソル位置が戻るだけですがデータは設定されません。
注意  設定値によってはRCサーボが破損する場合も有ります、充分理解した上で使ってください。
ハードの接続については、回路図と「パソコンとH8TinyCPUボードを接続しよう(レベルコンバータ)」を参照してください。


プレステのコントローラでRCサーボを動かそう
  ■第1書 RCサーボをどうやってコントロールするか
  ■第2章 RCサーボの性能を調べる
  ■第3章 PC用ジョイスッテックをRCサーボをコントロールする
10ms周期で8個のRCサーボを制御する
RCサーボコントローラの限界に挑戦!