Arduinoでのモーター制御(PCA9685)

組み込み
スポンサーリンク

クアッドクローラーではAdafruit PCA9685 PWM Servo Driverを使用しています。
実際のモーター制御部分を理解するために、ドライバーの使い方を見ていきます。

仕様を確認する

この製品はI2Cインターフェースを使用します。
製品ラインナップにより16チャネルと8チャネルの2種類に分かれています。
チャネルは「制御できるモーターの数」という認識で問題ありません。

サンプルプログラム(gpiotest.ino)

サーボモーターを動作させるサンプルプログラムになります。
動作範囲としては「0-4096」の範囲で指定します。
この数値はPWMの「パルス数」となっています。
numはPCA9685に接続されているどのモーターを対象にするかを指定します。
16チャネルの場合は「0-15」の範囲で指定します。

setPWM(uint8_t num, uint16_t on, uint16_t off)

サンプルプログラム(pwmtest.ino)

接続されたサーボモーターを順番に動かすテストプログラムです。
全てのチャネルが正常動作するか確認するためのプログラムとなります。

サンプルプログラム(servo.ino)

実際にサーボモーターを使用する場合のサンプルコードになります。
まず、順番に見ていきます。

SERVOMAX/SERVOMINはサーボモーターの稼働範囲の上限/下限となります。
こちらを指定することにより稼働範囲を制限することができます。
USMAX/USMINはサーボモーターの上限/下限に移動するまでのマイクロ秒を指定します。

define SERVOMIN 150 // This is the 'minimum' pulse length count (out of 4096)
define SERVOMAX 600 // This is the 'maximum' pulse length count (out of 4096)
define USMIN 600 // This is the rounded 'minimum' microsecond length based on the minimum pulse of 150
define USMAX 2400 // This is the rounded 'maximum' microsecond length based on the maximum pulse of 600
#define SERVO_FREQ 50 // Analog servos run at ~50 Hz updates

最初の例は、指定したチャネルのサーボモーターを「最小→最大」「最大→最小」に細かく動かす例となります。
pulselenの値だけ動かしていく動作となっています。

for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) {
  pwm.setPWM(servonum, 0, pulselen);
}
delay(500);
for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen--) {
  pwm.setPWM(servonum, 0, pulselen);
}

次の例では、PWMのパルス数ではなく秒数で指定しています。
これは使うタイミングあるのかな??

for (uint16_t microsec = USMIN; microsec < USMAX; microsec++) {
  pwm.writeMicroseconds(servonum, microsec);
}
delay(500);
for (uint16_t microsec = USMAX; microsec > USMIN; microsec--) {
  pwm.writeMicroseconds(servonum, microsec);
}

コメント

タイトルとURLをコピーしました