目次>5章 第2ステップ(色々な実験)> (23)サーボモータの制御

サーボモータの制御

更新日2009.2.8

ここでは、サーボモータをPICで制御する実験を行います。

サーボモータとは
サーボモータは、一定の角度範囲(例えば0°〜180°)の任意の角度で位置決めできるものです。DCモータなどのように回転はしません。
例えば、ラジコンカーでは、前輪の舵角制御やエンジンのスロットル制御などに使われ、ロボットであれば、関節の制御などに使います。

<サーボモータの例>
左:Futaba S3003(10年ほど前にRCカーで使用)

右:GWS NRH/BB/F(今回秋月で購入)

サーボモータの制御方法

サーボモータの角度制御は、PWM(Pulse Width Modulation:パルス幅変調)方式により行います。
PWM方式とは、パルスの周期を一定にしてパルス幅を変える事で目的に合った制御を行うものです。

サーボモータでは、パルスの幅が回転角に対応するようになっており、パルス幅が狭ければ0°,中位なら90°,広ければ180°と言うような動作をします。

パルス幅狭い中位広い
サーボの
回転角


具体的にサーボモータに与える信号は下図のようになっています。

パルス幅
狭い:1ミリ秒
中位:1.5ミリ秒
広い:2ミリ秒

これは目安であり、メーカによって若干の違いがあるようです。実際に使うサーボに合わせて微調整が必要です。

周期
周期はサーボの回転角と無関係ですので、15〜20ミリ秒程度の範囲で自由に決めてかまいません。
メーカによる差も無いと思います。(今回のプログラムでは13ミリ秒にしました)

実験回路

今回の実験回路です。
DCモータの制御で使った回路のモータ部分をサーボモータに変更した構成になっています。

左の積分回路は簡易A/D変換回路で、20KΩのボリュームを回す事でサーボモータの回転角を制御できるようにします。

右のSD1602はLCD(液晶ディスプレイ)でA/D変換結果やパルス幅を表示します。SC1602でもピン配置が異なるだけで使用可能です。


サーボモータの信号線の色
  1. 白:制御信号
  2. 赤:Vdd
  3. 黒:GND
RB3とサーボモータ間の10KΩの抵抗は無くてもかまいません。

こちらはブレッドボードに組んだ状態。
回路図に無いもの(6ピンのピンヘッダ周り)が有りますが、これはICSP(In-Circuit Serial Programming)用の回路です。
秋月のPICライタなどを使う場合は不要です。

プログラム

今回のプログラムはこちらです。
大半の処理は、DCモータの制御(ON/OFF,スピード制御)と同じです。

プログラム概要
今回のプログラムでは以下の動作をさせます。
・簡易A/D変換を行う
・簡易A/D変換結果でPWMのパルス幅を決め、サーボモータを制御
・A/D変換結果などをLCDに表示する
パルス幅
パルス幅は、下図のように固定部と可変部に分けて制御するようにしました。


固定部:0.5mS
可変部:0〜1.6mSの範囲で、簡易A/D変換結果で決定
合計:0.5〜2.1mS
基準時間
基準時間は、TMR0割込みを使い、25.6uS(マイクロ秒)としました。
クロック20MHz
TMR0128
プリスケーラなし
時間
周期および固定部と可変部の時間は、TMR0割込みをカウントする事で以下のように決定します。
TMR0割込み回数と時間
周期512回(25.6uS×512≒13.1mS)
固定部20回(25.6uS×20≒0.5mS)
可変部簡易A/D変換結果を1/4した回数
A/D変換結果が0〜255の範囲だとすると、1/4して0〜63となる。
25.6uS×63≒1.6mS
従って時間の範囲は、0〜1.6ミリ秒。
A/D変換
A/D変換は、DCモータの制御(ON/OFF,スピード制御)と同じで以下の手順としました。
  1. A/D変換結果が最大になるようにボリュームを回しておいて電源を入れる。
  2. 電源投入直後の初期処理でA/D変換を1回行い、0FFhとの差を計算し保存しておく。
  3. メイン処理の中では、A/D変換した結果に上の差を加算し、1/4して0〜63の範囲の値を得る。(実際には、2〜62程度の値が得られる。)

また、以下の処理を組み込んでいます。

  1. プログラムロジック的に0は扱いづらいので、A/D変換結果が0だったら1に変更
  2. A/D変換結果は毎回若干異なった値になり、そのまま使うとサーボモータが振動する場合があるため、A/D変換結果を平均化
LCD表示
LCDには以下のように状態を表示します。
A/D=aa PWM=pp
Max=mm dif=dd

aa: A/D変換結果を16進数で表示
pp: PWMのパルス幅を16進数で表示
mm: 電源ON後の初回のA/D変換結果を16進数で表示
dd: 0FFhと上記mmとの差を16進数で表示


概略処理フローを載せておきます。

こちらは実験風景。

感想など

A/D変換
A/D変換結果はボリュームを回さなくても変動するため、平均化してからパルス幅に変換していますが、それでもサーボが振動します。
今回は、PIC16F84Aでサーボモータを扱うために簡易A/D変換を行っていますが、実用のためにはA/D変換機能を持ったPICを使うべきです。 (84A以外のほとんどのPICはA/D変換機能を持っています。)
パルス幅と周期
今回使った2つのサーボモータのパルス幅と周期は以下の通りでした。
Futaba S3003GWS NRH/BB/F
パルス幅0.5〜2.3mS0.2〜2.3mS
周期どちらも、6〜25mSの範囲で動作しました