工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduino UNOとAdafruit PWMシールドでサーボを精密キャリブレーション

部品と材料

部品名数量備考
Arduino UNO1
Adafruit PWMサーボドライバーシールド1
M3ボルト8
M3ワッシャー8
LM2596 DC-DC 降圧コンバーター1
赤色PLAフィラメント13Dプリント用
白色PLAフィラメント13Dプリント用
180度透明プロトラクター(分度器)1
ロータリーポテンショメーター(汎用)1
9gサーボモーター1

必要な工具と機器

アプリとオンラインサービス

プロジェクト概要

以前のHackster投稿で、同一ロットの複数サーボに同じPWM信号を送っても、それぞれの回転角度が大きく異なることを確認しました。下の写真は、すべてのサーボを最も反時計回りの位置からスタートさせ、同一PWM信号を送ったときのばらつきです。

Arduino UNOとAdafruit PWMシールドでサーボを精密キャリブレーション

なぜArduino標準のサーボライブラリを使わないのか?

Adafruit PWMサーボドライバーを使えば、I2Cの2ピンだけで複数のサーボを個別に制御できます。Arduino標準のServoライブラリを使わない理由は主に2つです。

使用している9gサーボは安価で高精度ではないですが、歩行ロボット用により予測可能で正確な動作を引き出したいと考えました。

ホビーサーボをより正確に制御するには?

各サーボの個体差を確認したことで、「ある角度に動かすために必要なPWM値」を個別に調べるキャリブレーション装置を作ることにしました。具体的には:

このキャリブレーションでもAdafruit PWMドライバーを使用します。最終プロジェクトで同じドライバーを使うため、実運用環境と同じ条件で校正するためです。

Arduino UNOとAdafruit PWMシールドでサーボを精密キャリブレーション

装置の製作

Autodesk 123Dで設計したパーツを3Dプリントし、M3ボルトとワッシャーで組み立てました。取り付け穴は手持ちの部品に合わせて調整しています。

電子部品の接続:

完成品の写真を以下に示します。左上のツマミを回すとサーボが動き、シリアルモニターにその瞬間のPWM値が表示されます。

Arduino UNOとAdafruit PWMシールドでサーボを精密キャリブレーション
Arduino UNOとAdafruit PWMシールドでサーボを精密キャリブレーション

装置で何がわかるか?

手持ちのサーボで実測した結果です。サーボを時計回り限界まで回し、出力アームをプロトラクターの180度目盛りより少し先にセット。そこからポテンショメーターで0度、10度、20度…と10度刻みで180度まで合わせ、各角度でのPWM値を記録しました。

Arduino UNOとAdafruit PWMシールドでサーボを精密キャリブレーション

グラフ化すると、PWM値と角度の間に強い線形関係があることがわかります。

Arduino UNOとAdafruit PWMシールドでサーボを精密キャリブレーション

このサーボ固有の「角度⇔PWM」対応表が得られました。他のサーボでも傾向は似ていますが、完全に一致しません。

このデータを活用するには2つのアプローチがあります:

  1. ルックアップテーブル方式:角度とPWMの組み合わせを配列に保存し、目的の角度に最も近いPWM値を参照して送信。欠点は10度刻みなど離散的な角度しか指定できないこと。
  2. 線形回帰による式化:データセットから一次回帰式を求め(このサーボでは PWM = 2.35 × 角度 + 159.4)、任意の角度をパラメータとして渡せば必要なPWMをプログラムで計算。連続的な角度指定が可能。

どちらにしても、キャリブレーション前より確実に正確かつ再現性のある制御が可能になります。全サーボを個別に校正するのは手間ですが、プロジェクトの精度向上のために十分価値があります。なお、キャリブレーション時に取り付けたサーボアーム(ホーン)を外さずに使うことが前提です。

次期バージョンへの改善案

いくつかサーボを校正してみて、次の改善点が見えてきました:

まとめ

ホビーサーボは安価で高精度ではないですが、多くの用途では十分です。しかし、もう少し精度と再現性を高めたい場合、このキャリブレーション装置が役立ちます。自分のプロジェクトに合わせて改良してみてください。

コード

サーボキャリブレーター用スケッチ(C/C++)
#include <Adafruit_PWMServoDriver.h>
#define analogIn A0
Adafruit_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);  // 0-1023
  // 観察により、サーボのPWM最小/最大はだいたい100-612の範囲
  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);
}

カスタムパーツとエンクロージャー

3Dプリント用パーツのリポジトリ:
GitHub - ServoCalibrator

製造プロセス

  1. Raspberry Piでリアルタイムパン/チルト顔追跡 - 実践ガイド
  2. Walbi:ArduinoとLX-16Aサーボで作る安定二足歩行ロボット
  3. Arduino Yun搭載 IoT対応 5自由度ロボットアーム(Blynk制御)
  4. ポリ乳酸(PLA)3Dプリンティング:プロフェッショナルのための総合ガイド
  5. PLA vs ABS vs ナイロン:3Dプリンティングフィラメント選定ガイド
  6. 3Dプリント材料 PLA vs ABS:主要違いと使い分け完全ガイド
  7. PLAは本当にリサイクル・生分解可能か? 真実と実践的対応
  8. PLAは水に溶ける?分解条件と防水化の実践テクニック
  9. PLAフィラメントは電気を通す?導電性バリエーションと造形時の注意点
  10. PLA導電性の理解:3Dプリントフィラメントの電気的特性
  11. DCドライブへの切り替え:産業モーション制御におけるACサーボの信頼性ある代替案