2021年1月20日 星期三

[Arduino]使用PCA9685控制伺服馬達(Servo motor)

 使用PCA9685需先載入Adafruit_PWMServoDriver.h(相關文件)

  以下範例為伺服機先置中(90度,pulse_width=>1500),
  等待一秒後,
  向左轉動60度(30度的位置,pulse_width=>900)。
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

#define FREQUENCY 50
Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver();

void setup() {
  Serial.begin(9600);
  pwm1.begin();
  pwm1.setPWMFreq(FREQUENCY);
  //  pwm1.writeMicroseconds(0, 1500);
  //  pwm1.writeMicroseconds(0, degreeToPulse(90));
  pwm1.setPWM(0, 0, degreeToPWM(90));
  //  pwm1.setPWM(0, 0, pulseToPWM(1500));

  delay(2000);
  //  pwm1.writeMicroseconds(0, 900);
  //  pwm1.writeMicroseconds(0, degreeToPulse(30));
  pwm1.setPWM(0, 0,  degreeToPWM(30));
  //  pwm1.setPWM(0, 0,  pulseToPWM(900));
}

int pulseToPWM(int pulse) {
  return int(float(pulse) / 1000000 * FREQUENCY * 4096);
}

int degreeToPulse(int degree) {
  return map(degree, 0, 180, 600, 2400);
}

int degreeToPWM(int degree) {
  return pulseToPWM(degreeToPulse(degree));
}
 啟動PCA9685
 pwm1.begin();
 設定伺服機接受的頻率,
 手邊的伺服機是50Hz
  pwm1.setPWMFreq(FREQUENCY);
 設定PWM的值,一般Min=>150 Max=> 600
 但每個型號伺服機的值皆不同。

 測試方法:
 如果超過極限值(最大或最小值),
 伺服機就不會激磁(用手可轉動),
 再利用量角器找出相對應的值。 
 pwm1.setPWM(0, 0, pwm_value);
 如果已知pulse_width也可直接輸入,
 設定PCA9685上第幾個伺服機(0~15),
 設定伺服機的pulse_width。
  pwm1.writeMicroseconds(0, 1500);
 小弟我在網路上找資料大多是使用setPWM,
 於是又去找了pulse轉換為PWM值的公式(如下),
 直到去github上的api才看見有writeMicroseconds,
 裡面就寫好了轉換公式。Orz
 1000000為pulseLength
 FREQUENCY為馬達接收的頻率,手邊的為50Hz
 4096為PCA9685發出訊號的解析度(12bits=>4096)
int pulseToPWM(int pulse) {
  return int(float(pulse) / 1000000 * FREQUENCY * 4096);
}
 *註 
 手邊伺服機為模型用的,所以工作電壓為(6V~7.4V),
 實驗過PCA9685的V+(外部供電接腳)可支援到7.4V,
 再上去就需要實驗了,看文件有顆電阻限制在10V以下。

沒有留言:

張貼留言