見出し画像

複数のサーボを動作させる際の注意点メモ

基本的に最近のマイコンボード(Arduinoとか最近利用しているESP32DevKit)はサーボモーターを動かすライブラリがそろっていますので
1,信号を送るピンを設定する
2,そのピンから何度回転させるか指示してあげる

という2ステップだけでできてしまうことがあります。

ESP32を利用してSG90のパチモンサーボを動かそうとした際に困った点が何点かあったのでまとめてみました。

1:そもそも信号線の電圧がArduinoと異なる


マイコンやっている人からすると上式の反中なのかもしれませんが、マイコンの動作する電圧ってそれぞれ異なっているみたいです。
例えばArduinoでは5V、ESP32では3.3Vの信号をそれぞれのピンから出すことが出来ます。
ここでサーボ側の信号の電圧を確認してみましょう。
4.6~5.0Vになっているではありませんか。
という事はESP32の出力ピンから直接差し込んでも動かないってこと?

もしこのような動作する電圧の異なるデバイスを殺属させようとする際にはレベル変換をする必要があるそうです。
例えば3.3Vの信号を5Vに返還してくれる素子などがあるのだとか。

ただし今回の場合は普通に動作しました。
という事でこの問題に関しては無事に解決されました。
注:すべての機器で推奨されている電圧以外でも動作するとは限りません。今回がラッキーだったというだけで、普通に部品を購入前に仕様ぐらい読んでおきましょうという話です。

2:arduino用のライブラリが動かない


サーボモーターを動かす際に非常に便利なservo.hなるモジュールがあります。
これを使ううことで楽々サーボを動かすことが出来るのですが、ESP32にこれを書き込むことが出来ないのです。
普通に困ってしまいましたね。
この解決策はESP32Servoというライブラリをインストールすることでした。基本的にArduinoとESP32は同じコードでも動いているよな印象があったので、普通にArduinoのノリでいけるのかなーと思っていましたが、そんなこともないようです。

3:プログラムは書き込めたけど動かん!


これは非常にシンプルな問題でした。
マイコンボードからはたくさんのPINが出ていますが、すべてのPINにおいてサーボを動作させる信号を送ることが出来ないのです。
サーボはPWMという信号で角度を指定しているのですが、この信号を出すことが出来るピンは決まっているのです。
そのPIN以外をサーボの信号として指定してしまうと当然ハード側が対応しいていないので正常に動作しません。
きちんとPWMの信号が出せるPINに設定するこでサーボを動かすことが出来ました。

4:2つのサーボをつないだら動かなくなった


これはいまだによくわかりません。
なぜか上記のESP32Servoのライブラリを使うと2つ以上のサーボを独立して動かすことが出来なくなってしまいました。
そこで他の方法で対応することに。
ライブラリを使えば簡単に角度を指示できるのですが、その内容を自分でプログラムしてしまえばいいわけです。
今回用いるサーボに関してはPWMの信号が50Hz、角度が最小の時のパルス幅が0.9ms、最大の時が2.1msですのでこの信号を自分で作ってしまえばいいわけです。

このPWMの信号を作る関数ももちろん存在しており、ledcwrite関数を使うことで好きな周波数、パルス幅の信号を出すことが出来ます。
これらの詳細な利用方法は様々なサイトに書かれておりますので省きますが、なぜかこちらの関数を利用した場合は3つのサーボで動作することを確認しました。
それ以上は試しておりませんが、おそらく最大の12まで行けるのではと考えております。

ESP32は無線の機能がついているのでロボット作りたいなーと思った方で候補にしている方も多いかと思います。
もしサーボを2つ以上接続した際に挙動がおかしいとなったら参考にしてください。

この記事が気に入ったらサポートをしてみませんか?