サーボのキャリブレーション
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 8 | ||||
| × | 8 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要なツールとマシン
> |
|
アプリとオンラインサービス
> |
| |||
|
このプロジェクトについて
Hacksterに関する以前の投稿で、同じバッチの異なるサーボがどのように回転するかを比較するリグを作成した方法について書き、同じPWM信号を異なるサーボに送信するといくつかの重要な違いが生じることを示しました-下の写真はサーボを示していますこれらはすべて反時計回りの最も遠い位置から始まり、同じPWM信号が送信されました。これらはすべてわずかに異なる動作をします。
<図>
Arduinoに既存のサーボライブラリを使用してみませんか?
私はAdafruitPWMサーボドライバーを使用して多数のサーボを駆動します。これにより、各サーボに異なるPWM信号を送信できます。 Arduinoインストールに組み込まれているServoライブラリを使用することもできますが、これを行わない理由はいくつかあります:
- Adafruit PWMサーボドライバーを使用すると、Arduinoのピンをすべてのサーボに割り当てるのではなく、I2Cを介して2つのピンを使用してサーボを制御できます。
- Arduinoサーボライブラリで、サーボに接続してゼロ度の位置に回転するように信号を送信すると、サーボが移動限界まで回転し、サーボ内のギアを研削することが時々あります。
もちろん、私が使用している9gサーボは安価で、正確さを考慮して設計されていませんが、それらからさらに価値を引き出すことができると思います。それらを歩行ロボットに使用したいので、それらの動作をもう少し正確で予測可能にする必要があります。
趣味のサーボをより正確に制御するにはどうすればよいですか?
サーボがすべてわずかに異なる動作をすることを確認したため、サーボをキャリブレーションできるデバイスを作成したいと思いました。0度の位置に移動するためにサーボを送信するために必要なPWM値は何ですか。または90度の中心点?クランチとギア研削が多いサーボを極端な位置にスナップするPWM値を送信しないようにするにはどうすればよいですか?
いくつかの簡単な概念を組み合わせることにしました。
- サーボを単純な分度器の中心に合わせて、サーボのワイパーが回転するときに、その位置を測定できるようにします。
- ポテンショメータをArduinoのアナログ入力に接続して、ポテンショメータシャフトの位置を調整しながらPWM値を調整することで、サーボのワイパーの位置を制御できるようにします。
このバージョンでは、Arduino IDEのシリアルモニターを使用して、手動で記録できるPWM信号の値を教えてくれました。
私はAutodesk123Dを使用して、ポテンショメータ、分度器、シングルサーボ、Arduino、およびAdafruitPWMサーボドライバを電源とともに保持する単純なリグを設計しました。
キャリブレーションにはAdafruitPWMサーボドライバーを使い続けたいと思っています。これは、最終的なプロジェクトで使用する可能性が高いためです。 Arduinoのピンからサーボを直接制御する場合は、それをデバイスに複製し、ArduinoからのPWMに対してサーボを調整します。
<図>
デバイスの構築
それぞれのパーツをプリントアウトし、M3ボルトとワッシャーを使って取り付けました。
デバイス設計の取り付け穴は、コンポーネントに合うように調整されています。コンポーネントによって、穴の直径と位置が異なる場合があります。
電子機器の場合、ポテンショメータの中央のピンをArduinoのA0ピンに接続し、他のピンをArduinoの0vと5vに接続しました。 PWMサーボモータードライバーをArduinoに接続し、次にDC-DCバックコンバーターを接続しました(9v電源入力を5v出力に変換するように調整しました)。 9gサーボをサーボモータードライバーシールドの最初のスロットに接続し、スケッチをArduinoにアップロードしました。
最終結果は下の写真に示されています。デバイスの左上にあるノブを回すと、サーボの位置を制御できます。ArduinoIDEのシリアルモニターを使用すると、サーボモーターに送信されているPWM信号を任意の角度で読み取ることができます。
<図><図>
では、デバイスは何を教えてくれますか?
私のサーボでは、サーボを時計回りの最も遠い限界まで回転させ、ワイパーをサーボに配置して、キャリブレーションデバイスの分度器の180度のマークを少し超えた位置に配置しました。
電源をデバイスに接続し、サーボ針が分度器の0度のマークに揃うまでポテンショメータのノブを回し、ArduinoIDEのシリアル出力に書き込まれたPWM値を記録しました。次に、サーボ針が10度を指すまでポテンショメータを回転させ、PWM値を再度記録しました。 180度に達するまで、このプロセスを10度ごとに続け、結果を下の表で共有しました。
<図>結果のグラフを作成しました(以下を参照)。ご想像のとおり、PWMとサーボ角度の間には強い線形関係があります。
<図>これで、この特定のサーボの特性であるPWMと角度の値がいくつか得られました。他のサーボも同様の特性を持っている可能性がありますが、同じではありません。
より正確なサーボ性能を得るために、いくつかのオプションがあります:
- これらの値のペアを記録し、Arduinoスケッチで配列に保持します。たとえば、サーボワイパーを90度に移動したい場合は、この角度に関連するPWM値を参照して、そのPWM値を送信します。サーボに。これには、10の倍数の角度までしか回転できないという欠点があります。
- または、送信する角度を完全に制御したい場合は、データセットで線形回帰を使用して、角度とPWM値に関連する式を計算できます(このサーボの場合、PWM =2.35 *角度+159.4)。このようにして、回転させたい角度をパラメーターとして渡し、この特定のサーボをその位置に回転させるために必要なPWMをプログラムで計算できます。
いずれにせよ、このサーボを以前よりも正確かつ確実に制御することができます。各サーボを正確に調整するのはかなり手間がかかりますが、私のプロジェクトでは、精度を高める価値があります。
もちろん、デバイスからサーボを取り外すときは、サーボワイパーを取り付けたままにします。これは、測定値が、キャリブレーション中のワイパーの取り付け方法に関連しているためです。
次のバージョンの改善
いくつかのサーボを調整した後、次のバージョンに組み込むいくつかの改善を考えました。
- サーボにはクイックリリースメカニズムが必要です。M3ボルトで固定するのではなく、ネオジム磁石でクリップを使用してサーボを所定の位置に固定する場合があります。
- これを小さくしたいのですが、これを実現するためにArduinoと電源の向きを変えることができるかもしれません。
- 9Vバッテリーとバックコンバーターの間に電源スイッチが必要なので、マシンの電源を切るたびにバッテリーを完全に切断する必要はありません。
- リグをより少ない数で印刷できるようにしたいと思います。
- 分度器から手動で値を読み取る代わりに、サーボが特定の角度位置にあることをセンサーが検出し、これをArduinoにフィードバックできると、視差エラーがなくなる可能性があります。
- 最後に、結果を表示するLCDディスプレイは、コンピューターをデバイスに接続する必要がないため、非常に役立ちます。
まとめ
これで、私の趣味のサーボは安価で、正確さを考慮して設計されていません。多くのアプリケーションでは、完全に問題ありません。しかし、私はもう少し正確で再現性のあるパフォーマンスを私のものから得たいと思っています。この投稿のリグはそれを達成するのに役立ちます。
コード
- サーボキャリブレータデバイスのスケッチ
サーボキャリブレータデバイスのスケッチ C / C ++
#include#define analogIn A0Adafruit_PWMServoDriver pwm =Adafruit_PWMServoDriver(); int inputValue =0; int tmpPwmValue =0; void setup(){Serial.begin(9600); pwm.begin(); pwm.setPWMFreq(60);} void loop(){inputValue =analogRead(analogIn); // inputValueは0から1024の間になります//観察によると、サーボの最小および最大PWM値は通常100から612の間です//以下の式により、アナログ入力をPWMに単純に変換できますint pwmValue =(int)(100 +( inputValue / 2)); pwm.setPWM(0、0、pwmValue); //重複データが不必要に表示されていないことを確認しますif(pwmValue!=tmpPwmValue){Serial.print( "Potentiometer Input ="); Serial.print(inputValue); Serial.print( "、PWM ="); Serial.println(pwmValue); } tmpPwmValue =pwmValue; delay(15);}
カスタムパーツとエンクロージャー
サーボキャリブレータ部品のレポ
https://github.com/jeremylindsayni/ServoCalibrator製造プロセス