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