2016/09/02

サーボモータを動かそう

夏休みの自由研究、第2弾だ。
サーボモータを動かそう。

Arduinoスターターキットを購入したとき、サーボモータも一緒に入っていた。
SM-S2309Sと書いてある。
http://descargas.cetronic.es/microservo.pdf

PWMを入れることで動かすらしいのだが、PDFにはその仕様が書かれていないな。。。
ということは、単なるアナログ入力で、それをPWMで代替えしているということか。

 

前回作ったブザーを鳴らすアプリを変更することにした。
PWMの停止ができるし、PWMの調整するところまで実装しているから、Duty比を変えるだけでよいはず。

その前に、電圧のことを考えねば。
NUCLEOは3.3Vだけど、サーボモータは5Vなのだ。
アナログ電圧で制御するなら3.3Vでも動くのかもしれんが、よくわからんのに冒険はしたくない。

幸い、ロジックレベルの変換ができるチップを持っていた。
TXB0104搭載4CH双方向レベルコンバータ - スイッチサイエンス

上が3.3.V側、下が5V側。
オシロじゃないから電圧が変わったかわからんが、電気的に変換しているから時差はないのだな。

image

 

制御のさせ方は、こちらを参考にした。
サーボモータの制御

Arduinoスターターキットの本には、map()で制御する、しか書かれていないのでわからんのだ。

波長は15m~20msecらしいので、10msecにしてみよう。
以前計算した式から、

tick = APB1 / (Prescaler+1) = 84MHz / 8400 = 10kHz
PWM = tick / (Counter Period+1) = 10kHz / 100 = 100Hz
周期 = 1 / 100Hz = 10msec
Duty比 = Pulse / (Counter Period+1)

上記のページでは、13msecに対して1~2msecで動かしているから、Duty比は10~20%か。
100HzだとPulseはちょうどDuty比と同じだから、これでは10段階程度しか動かせんな。

まあいいや。


ソースを載せるほどではないので省略するが、動いた。
サーボ側の5VとGNDは、スターターキットの本に100uFの電解コンデンサでつないでおくように書かれていたから、まねした。
回転するときに電圧が下がるからかな?

しかし、Arduinoとは直接接続しているから、モータの時みたいにドライバを挟むほどではないようだ。
電源は別に取っているからそうなるのか。

うちのサーボさんは、Pulseを5~24の間で動いた。
4とかだと、少しうなるような音が聞こえたので、動くか動かないかのところで震えたのだろうか。

180度を10段階だから、18度ずつ動いたことになるだろう。
多少粗いが、そういうのはPreScaleを小さくして、tickが大きい値になるようにすればよかろう。

意外と、3.3VでもDuty比を上げれば動くんじゃなかろうか、とつないでみたが、90にしても動かなかった。
3.3Vを挿しても動かないので、やはりPWMじゃないとダメなのか?

 

まあ、あまり深くは考えまい。


[2016/09/02 21:41追記]

もう少し細かい情報が書かれているサイトがあった。
ブックマークまでしていたのに、なぜ見ていなかったんだ。。。

Arduinoで学ぶ基礎からのモーター制御:基礎からのマイコンモーター制御(6):PWMを使ったサーボモーターの制御 (1/3) - MONOist(モノイスト)

これの2ページ目に、波長が20msecで、H区間を1~2msecで変化させる、と書いてあった。
1msecが0度、2msecが180度になるとのこと。
やってみよう。

tick = APB1 / (Prescaler+1) = 84MHz / 8400 = 10kHz
PWM = tick / (Counter Period+1) = 10kHz / 200 = 50Hz
周期 = 1 / 50Hz = 20msec
Duty比 = Pulse / (Counter Period+1)

これで、Pulseを9~19にすればよいはず。

・・・ダメだ、そんなに精度がよくないんだった。

image

image

 

手作業で調整したときの波形を計測した。
うーん、単にパルスの幅だけで動いているとしたら、500us~2300usくらいになってるんじゃないか?

image

image

 

こちらを見ると、同じSG90を使っているのだが、動作パルス幅が500us~2400usになっていた。

Netduino: サーボモーターをコントロールしよう - Build Insider

波長はそのままで、パルス幅を500us~2400usになるように値を変えると、同じように動いた。
だから、パルス幅を見てるんだな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。