仕様不明のサーボモータを解析してみた

近藤科学KHRシリーズの二足歩行ロボットに含まれているKRS788HVという型番のサーボモータは、ネットを調べても詳細な仕様を引き出すことができなかった。

前回のレポートでは、不可解な現象が確認されたので、その原因を予測してみよう。

サーボモータはPWMパルス幅で角度を制御する。

Arduinoでは、直接PWM波形をアナログポートに出力する方法と、サーボモータ用ライブラリを利用する方法がある。それぞれの動作内容を検証してみる。

  1. アナログポート出力
    コマンド形式は、以下の通り。
    analog.Write(ピン,デューティ);
    ここから理解できることは、PWM周波数が不明ということだ。
  2. サーボライブラリ
    write(制御角度);

デフォルトのPWM時間幅の最小値は544μs、最大値は2400μsとし、この間を180°で分割して1°単位で制御ができる。より細かく制御するために、時間幅で設定することもできる。今回は、サーボモータの仕様が不明のため、デフォルトのまま利用した。

今回確認された不可解な現象は、以下の通り。

  • Homeリターン:33
  • 0°:89
  • 160°:253
  • 180°までは回らない

それでは解析してみよう

サーボの初期設定でで記述されるPWM波形は、周期は不明だがPWM幅のデフォルトはmin:544μs、max:2400μsとなっている。最大2400μsなら周期はそれよりも大きくなくてはならないので、PWM周波数は416Hzよりも低いはずだ。

analog.Write()で最大値255を書込んでも180°にならなかったということは、PWMの最大幅が2400μsに足りなかったと考えられる。160°位までは回ったので、(2400-544)/180×160=1650 1650+544=2194μs程度 までPWM幅があったのではないかと想定できる。すると、以下の式よりanalog.Write()のPWM幅は456Hz以上になっていることが想定される。

1/2194μs=456Hz

そこで、Arduinoのライブラリのソースコードを確認してみると

init01

プリスケーラ64で分周されていることがわかる。CPUクロック8MHzで分周比64だとPWM周期は 8MHz/(256×64)=488Hz となる。

PWM幅を最大にして以下の式から2049μsということで、これで回せるのは156°までとなり、現れた現象と概ね一致していることが確認できた。
1/488=2049 (2049-544)/((2400-544)/180)=156°

以上から、アナログポート出力でサーボモータが0~160°程度までしか回せなかったのは、アナログポートのPWM周期が488Hzであり、最大幅が180°を回すために必要な2400μsに満たない2049μsだったという理由によるものと確認できた。その場合に回るのは156°までとなったものだ。

現象は概ね予測がついた。それでは、次回は、本当にそうであるかをオシロスコープを使って確かめてみよう。

(Visited 1,018 times, 1 visits today)
スポンサーリンク

シェアする

フォローする