3.PICで直接サーボを動かしてみる
サーボを動かす信号って? 受信機からサーボやアンプを動かす信号って、なんだろう??
ずーっと疑問で、いろんなラジコン関係の本を調べても出てない.....
仕方ないので、ラジコンメカに詳しい「動く模型工作ファン」の森本さんにお尋ねしました。(森本さんその節はどうも...(^^ゞ)

受信機からサーボへ電気を流したり止めたりの、ONとOFFが繰り返し出されています。
単純にサーボの変わりに電球を繋ぐと、電球が光ったり、消えたりを繰り返してます。
もちろん、ONとOFFの間隔があまりにも短いので、009の加速装置でも付けなければ普通の人には見えないと思います。(謎;;)

ちなみにこう言う信号をパルスと言うらしいです。

パルスの幅は? パルス信号を受け取ったサーボは、電気が点いてから消えるまでの時間の長さでサーボホーンを左右に動かします。

例えば、電気が来てる時間が1秒だと、サーボホーンはちょうど中間に止まるとすると、
0.5秒に縮めるとサーボホーンは中間より左45度の位置まで動きその場所に止まり、逆に1.5秒に延ばすと、サーボホーンは反対の右45度まで動き、そこで止まります。

実際には、サーボホーンが中間の時のONの長さは、1.5mS(ミリセコンド)で、45度右(または左)が1mSで反対の左(または右)45度は2.0mSです。

要するに、1mSから2mSの幅で、サーボホーンが左右に動く訳です。

ちなみに電気が切れてるOFFの時の時間は、サーボ自体には関係無いようですね。
OFFの時間が短いと、サーボは忙しなく動いて電気も食うし、逆に長すぎると反応が鈍くなる??
メーカーのプロポ等では、OFFの時間は14mS〜15mSぐらいだそうです。
PICでサーボを動かす! 理屈が解れば簡単!!
PICからサーボに1mS〜2mSの間電気を流せば、サーボは動くわけだ!
.....でも、1mSってどのくらいの長さ??

1秒=1000mS(ミリセコンド)
1mS=1000μS(マイクロセコンド)

なので、1mSは0.001秒だ!
ピックからサーボに電気を流した後、0.001秒後にOFFにする。
しばらくしてからまた電気を流して、0.001秒後にOFFにする、これを繰り返してやれば、サーボは中心より90度の位置で止まったままになる。

プログラミング開始! PICの練習プログラムには、一定時間LEDを点灯すると言ったサンプルが必ず出てます(笑)。
サンプルプログラムの点灯時間を0.001秒に縮めて、LEDの変わりにサーボの信号線を繋いでやればすぐに完成!?

PICのスピード? 0.001秒の時間を計るには、どうしたら良いんだろう??

いろいろ参考書を調べたら、PICが1命令を実行する時間を計算して、命令の数で必要な時間を計算する方法と、PICが持つタイマー機能を使う方法があるようです。

タイマー機能を使う方法は、初心者の私には良く解らなかったので..(^^;;...命令の数で時間を計る事にしました。

PICが1命令を実行する(1サイクルの)スピードは、取りつけたクリスタルの周波数で決まります。
1サイクルの時間=4÷クリスタルのクロック周波数
で、実験基板で使った10MHzのクリスタルだと、4÷10MHz=0.4μS(マイクロセコンド)になります。

1mSの時間を計ろうとすれば、いったい何サイクル??
0.4μS=0.0004mSだから、1mS=0.0004×2500で、なんとPICが2500個の命令を実行してやっと1mS(0.001秒)になるんだ!!

数字が大きすぎる!! 1mSが2500サイクルだと、サーボを反対側に動かした時は、2mSだから、5000サイクル分の間、電気を流さないと行けない....
サーボをPICで自由に動かそうとすると、2500〜5000サイクルの数字で、サーボの止まる位置を指定しないといけない....
厄介な事に、アセンブラのプログラムの変数は、1バイトなので0〜255までしか扱えない...2個以上使う手もあるけど、プログラミングが難しくなるので、なんとか0〜255の値でサーボをコントロールしたい!

25サイクルで1にしよう! 2500〜5000サイクルを0〜255の数値範囲でプログラムするには、25サイクルを1とすれば....
サーボが左90度→1mS→2500サイクル→100
サーボが中間→1.5mS→3750サイクル→150
サーボが右90度→2mS→5000サイクル→200

ようやくプログラムの製作! 実際のプログラムは、
  1. PICのRB0のピンを出力に設定する。
  2. ループ開始
  3. RB0をONにする。(サーボに信号が行く)
  4. サーボの動かしたい位置を100〜200で指定する。
  5. 指定された値の25倍のサイクルを無駄遣いして、時間を稼ぐ。
  6. RB0をOFFにする。(サーボに行く信号を止める)
  7. 15mSほど何もしない。
  8. ループ開始へ戻る

と言う事で、実際に作ったプログラムはこれ→「savo1.asm」(ダウンロードして、エディタか、メモ帳等で開いてください....って、こんなしょうもないプログラムは誰も見ないかぁ(笑))

戻る

更新日2000.7.13