近藤科学KHRシリーズの二足歩行ロボットに含まれているKRS788HVという型番のサーボモータは、ネットを調べても詳細な仕様を引き出すことができなかった。
前回のレポートでは、不可解な現象が確認されたので、その原因を予測してみよう。
サーボモータはPWMパルス幅で角度を制御する。
Arduinoでは、直接PWM波形をアナログポートに出力する方法と、サーボモータ用ライブラリを利用する方法がある。それぞれの動作内容を検証してみる。
- アナログポート出力
コマンド形式は、以下の通り。
analog.Write(ピン,デューティ);
ここから理解できることは、PWM周波数が不明ということだ。 - サーボライブラリ
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のライブラリのソースコードを確認してみると
プリスケーラ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°までとなったものだ。
現象は概ね予測がついた。それでは、次回は、本当にそうであるかをオシロスコープを使って確かめてみよう。