はじめに
さてさて、比較的多くのロボコンではRCサーボを使うのが手っ取り早い場合も多く、それ故使われる場面も多いです。 しかし、インターネットにあるRCサーボについての知見は散文的に記された文章しかなく困ったので、ゴニョゴニョ調べて色々書くことにしました。
細かいことが嫌いな人向けの細かいこと
ゆとりな情科生など、ハードをいじるのはロボコンしかやってない人にとってサーボというとRCサーボでしか無いのですが工学系の人にサーボサーボというと彼らにとってはACサーボモーターもDCサーボモーターもステッパもサーボモーターであり、大変お怒りになりますのでお気をつけて。 しかし筆者はサーボと言ったらRCサーボなのでこの記事でのサーボはRCサーボだと思ってください。というか文脈で判断してくれ。
あと、ここで取り上げるサーボは、PWM信号で制御されるものです。いわゆるシリアルサーボではないのであしからず(でもシリアルサーボって顧客の求めていたものって感じがしますよね)。
サーボの構造
なかの仕組みはこんなふうになってます。 マイコンからの位置情報とポテンショメーターで得られる角度情報を元にモーターのマイコンがモーターをどう制御するかを決定しています。
信号
どんな信号を入れればよいか、それはPWMである
図のようなPWM信号を連続的に入力します。 図中の周期とパルス幅をうまいことやるとサーボの角度指定ができます。 この周期とパルス幅というのがけっこう厄介で会社ごとに微妙に違いますが、一般的には周期は10msec~20msec、パルス幅は0.8msecから2.2msecが一般的です。
パルス幅について
パルス幅は以下のようになっています(一般的なのと微妙に違うのを協調してみました)。
メーカー | ニュートラル1 | 可変範囲2 | 備考 |
---|---|---|---|
フタバ | 1520usec | ±500usec | トラ技2000年2月号P185より3 |
サンワ | 1500usec | ±600usec | トラ技2000年2月号P185より |
JR | 1500usec | ±500usec | トラ技2000年2月号P185より |
近藤科学 | 1520usec | ±500usec | トラ技2000年2月号P185より |
GWS社 | 1500usec | ±700usec | 限界角が±90°のもの4 |
GWS社 | 1500usec | ±600usec | 限界角が±60°のもの5 |
TowerPro | 1520usec | ±500usec | 諸説あり |
TowerPro社(SG90などが有名)については、諸説あり、秋月のデータシートではニュートラルが1500となっていますが、それ以外では500~2400usecだったり、ニュートラルが1520usecだったりと、もう滅茶苦茶だよと言った感じです。さらにSG90だけで調べるとデッドバンド幅が1usecのものから10usecのものまで存在したり、そもそも寸法も違ったりと混沌を極めています。試した結果としては1520±500usecが一番近いかな、という感じがします。
というわけで以上を踏まえるとパルス幅を求めるにはこんなふうなコードを書くと良さそうという感じがあります。
const double limiting_angles = 90.0; //稼働限界角
const double neutral_usec = 1500.0; //ニュートラルのパルス幅
const double limiting_usec = 500.0; //稼働限界角の加算すべきパルス幅
static inline int deg_to_usec(double deg){
return ((limiting_usec / limiting_angles) * deg) + neutral_usec;
}
周期について
これも各社によって微妙に違いますが、周期自体は求められる範囲内なら回転角に一切影響を与えません。 例えばGWS社は7mec~23msecですが、10~20msecの間にしておけばどのサーボでも動きそうです。 筆者は大抵15msecにしています。
人によってはこの周期でトルクが変わるとかいう人もいますが、これについては有効なソースが発見できなかったので眉唾ものということで。 ただ、周期をかえるとサーボの鳴り方が多少変わるので、何かしら影響があるのかもしれません。 筆者は何に影響があるのか解明できませんでした。くそー
信号レベル
トラ技2000年2月号P185には「CMOS/TTLレベル」との記述が有りましたので、 おそらくCMOS、TTL両対応だと思われます。
私のすべての手持ちのサーボをテストしたところ、信号レベルは3.3Vで動きました。 サーボの電源電圧が4.8Vからのも多いので、5Vをある程度下回っても駆動するはずです。
デッドバンド幅
サーボモーターはパルス幅によって回転角を決定していることは前述しました。 しかし、パルス幅にきっちり従いすぎると精度的な問題でモーターが安定しません (ちょうどこれはコンパレーターを使った時に発生する問題に似てます)。 ですので、コンパレーターを使用するときに設けるシュミットトリガのように、 一度決まったパルス幅から±数usecを超えないと反応しない、というパルス幅が設けられています。 これを不感帯、デッドバンドとよび、この長さをデッドバンド幅といいます。
電気的なテク
電源投入次のビクッ対策
電源を投入してすぐに信号を送っていない場合は、サーボが少しだけ右回転します。 これを防ぐには電源を投入したらマイコンのポートからhiレベルを送ったり、プルアップしてあげたりして すぐにhiレベルが入り続けるようにすると良いようです。
以下のリンクが非常に詳しいです。 マイコンにRC用サーボモーターを繋ぐ際の電源投入時の挙動
いかにも立ち下がりエッジで角度を決めてそうな挙動ですよね。
冴えたやり方
サーボ一つにつき一つPWMを吐くポートが専有されてしまうのは由々しき事態です。 これの冴えた解決策を見つけましたので引用します。
実施例ありです。H8/3052とHC259で、DMAでPWM設定とデマルチアドレス出力と自動で。 RT @cronos_sv ふーん。 サーボは10~20mSecおきにパルス食わせれば良いのか。 2.5mSecおきに振り分けてやれば、PWMは1発で、あとはMUXで行けそうだな
— Kumagai, M (@kumarobo) 2014, 12月 6
ハード的ないろいろ
サーボが変形すると動かない
私の後輩がやりました。
「何もしてないのにサーボから煙が上がった。」
この時、サーボの取り付け精度があまりに悪く、多少変形していました (多少、というのはノギスで図らないと判らない程度です)。 変形していたため、ギヤボックスに変な負荷がかかったのだと重います。 取り付け精度を改善してもらったところ、ちゃんと動きました。
経験則に基づく憶測
ここからはソースは俺(定量的な計測はしていない)ゾーンになります。 参考にされても保証できません。
可変範囲をこえてもできるがリニアではない?
前述のパルス幅を少し超えても、回るサーボはあります。 しかしそれを超えると、パルス幅に対して角度がリニアに変化しない気がします。
機械的中点と電気的中点はちがうっぽい
パルス幅を前述のニュートラルにすると中央点に来ますが、どうもこれは機械的な中点ではないきがします。 ニュートラルはあくまで電気的中点なんでしょうか?
おわりに
各社、規格を統一してください(懇願)。 規格を統一しなくてもいいので、せめてデータシートやアプリケーションノートは解りやすいところに置いてください(懇願)。
書くの忘れたかもしれない参考文献など
- GWS社のウェブページ(あまりに見にくすぎる)
- ジャイアントシャークのウェブページ
- ホーム:http://www.giantshark.co.uk/
- Towerpro MG959 Servo:http://www.giantshark.co.uk/product/216622/towerpro-mg959-servo
- エレキジャック
- トランジスタ技術
- 2000年2月号
-
センターポジションになる値。↩
-
古いものは1310±500usec。↩
-
http://www.gws.com.tw/english/product/servo/servo%20form.htm↩