■>サンテックのホームページTOPへ       ■>サンおやじの工作室TOPへ
    工作室
       第1章 RCサーボをどうやってコントロールするか

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

第1章 RCサーボをどうやってコントロールするか

 ご存知の方も多いでしょうが、これからRCサーボモータをコントロールしてみようと言う人のために少々RCサーボの制御について話をします。
 現在市販されているRCサーボモータのほとんどは、3本のケーブルが出ています。
 今回使用したRCサーボモータからもやはり3本の線が出ています。

   それぞれの線は、

(赤)VCC・(黒)GND・(白)制御信号

です。
 これは今回使用したサーボの場合で、必ずしもこの順番、この線色ではありません。
 従って、RCサーボを制御する場合はどの線がどの信号かきちんと確認しておく事が大切です。
写真1 RCサーボモーターから出ているケーブル
(S3003 双葉電子工業株式会社製)

さてVCCとGNDは電源である事は言うまでも有りませんが、問題は制御信号です。
制御信号はPWM(Pulse Width Modulation)と言う方式を使っています。細かい事はいろいろな所で紹介されているので、ここではRCサーボの制御に必要な事だけ説明します。

図1はS3003をRCの受信機に接続し、実際にコントロールしている所を実測した波形です。
GNDからVCCまでの振幅のパルスが14.4mS周期で繰り返され、パルス幅は1〜2.1mSの幅を持っています。
この期間を変える事で、RCサーボの位置を制御する事ができます。
 それでは、RCサーボを制御するためのPWMを作ってみます。
 嬉しい事に、H8Tiny(3672)にはタイマVとタイマWの2種類のタイマが有り、それぞれPWMを出力する機能を持っています。
 RCサーボをコントロールするには、タイマWを使うのが良いでしょう。
 タイマWを使えばP82・P83・P84の3本がPWMとして使用できます。
 とりあえず、PWM信号を出力してRCサーボのを動かすために、P82だけを制御してみます。
 プログラムはC言語で記述します。
 開発環境は、KPIT GNUです。
 ダウンロードやインストールはこの工作室にある、
無償のC/C++言語でソフトを作ろう
を見てください。
  

またルネサス エレクトロ二クス株式会社からも無償でC/C++コンパイラHEW2が提供されています。
さらに、H8Tinyを本気で使ってみようと考えているなら、E7 Emulatorの購入を検討してみるのも良いでしょう。
ちょっとしたパソコン周辺機器程度の価格でデバッガが入手できます。
さらにE7にはHEW3の無償版が添付されています。
話が横道にそれてしまいましたが、PWM制御をするにはリスト1のようにポートの設定を行います。
そして、メインルーチンでパルス幅と周期を変えればRCサーボは動きます。
パルス幅を変更するにはジェネラルレジスタ(GRB)を、周期を変更するにはジェネラルレジスタ(GRA)の値を変更します。

リスト1

/*タイマWの設定*/
/*タイマモードレジスタの設定*/
TW.TMRW.BIT.CTS = 0;
TW.TMRW.BIT.BUFEB = 0;
TW.TMRW.BIT.BUFEA = 0;
TW.TMRW.BIT.PWMD = 0;
TW.TMRW.BIT.PWMC = 0;
TW.TMRW.BIT.PWMB = 1;
/*タイマコントロールレジスタの設定*/
TW.TCRW.BIT.CCLR = 1;
TW.TCRW.BIT.CKS = 2;
TW.TCRW.BIT.TOB = 1;
/*タイマ割り込みの設定*/
TW.TIERW.BYTE = 0x70;
/*タイマI/Oコントロールレジスタの設定*/
TW.TIOR0.BIT.IOB = 0;
TW.TIOR0.BIT.IOA = 0;
TW.TIOR1.BIT.IOD = 0;
TW.TIOR1.BIT.IOC = 0;

TW.TCNT = 0x0000;

TW.GRA = FREQ;
TW.GRB = PW_CENTER;

TW.TMRW.BIT.CTS = 1;

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

int main(void)
{  /*RCサーボを反時計方向に回転*/
  /*最大まで回転したら元に戻す
*/
  do
  {  /*ウェイト*/
    WaitCount = 0;
    do
    {  WaitCount++;
    }while(WaitCount <= 4000);

    PWidth = TW.GRB;
    if(PWidth >= PW_MAX)
      PWidth = PW_MIN;
    else
      PWidth++;
    TW.GRB = PWidth;
  }while(1);
  return(0);
}




/*設定中はカウンタ停止*/
/*GRBをアウトプットコンペアレジスタに設定*/
/*GRAをアウトプットコンペアレジスタに設定*/
/*FTIODをアウトプットコンペア出力に設定*/
/*FTIOCをアウトプットコンペア出力に設定*/
/*FTIOBをPWM出力に設定*/

/*GRAを周期レジスタに設定(コンペアマッチでカウンタクリア)*/
/*内部クロックを1/4分周に設定*/
/*コンペアマッチが発生するまでのFTIOBのの出力0*/

/*全てのタイマ割り込み禁止*/

/*GRBのコンペアマッチでFTIOB出力1*/
/*FTIOAの出力禁止*/
/*FTIODの出力禁止*/
/*FTIOCの出力禁止*/

/*タイマカウンタを初期値0に設定*/

/*PWM周期を14.4mSに設定 14.4mS/(1/16MHz)/4*/
/*PWMパルス幅を1.51mSに設定 1.51mS/(1/16MHz)/4*/

/*PWM動作開始*/

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











/*現在設定されているパルス幅を読む*/
/*パルス幅が2.1mS以上ならパルス幅を1mSに*/


/*パルス幅を1カウント(250nS)広げる*/
/*新たなパルス幅を設定する*/

 上のリストはPWM関連の部分だけなので、これだけではプログラムは動きません。全てのソースと回路図、そしてコンパイル結果のモトローラSファイルをダウンロードできるようにしておきます。
各自で動作を確認してください。コンパイルの方法は「ソースのコンパイル方法」で説明しています。
これからH8Tinyを使って何かしようとするなら、ぜひ自分でコンパイルして動作確認してください。

回路図・ソース・モトローラSのダウンロード(checkrc_1.lzh)

たったこれだけの配線でRCサーボの制御ができる

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