obniz Parts Library

PCA9685

GitHub
PCA9685
Usable Devices :
obniz_board
Found at :
秋月電子通商
www.adafruit.com
秋月電子通商

PCA9685

PCA9685 generate 16 independent PWM. Frequency is shared by 16 PWM.
This is useful for driving multiple servo motors independently up to 16.

Output is not so tough. You can't connect a DC motor directly.

Some vendor sales module which have pin headers for servo motor.
Above photo is Adafruit's one.
https://www.adafruit.com/product/815

wired(obniz, {[gnd, vcc, oe, scl, sda, i2c, enabled, address, drive]})

Specify connected io and configrations.

Please use another power supply to drive servo motors at V+.

name type required default description
scl number(obniz Board io) no   Specify obniz Board io number
sda number(obniz Board io) no   Specify obniz Board io number
i2c i2c object no   Specify configrated i2c object
vcc number(obniz Board io) no   If you specify either vcc/gnd, wire() will wait a moment after power up.
gnd number(obniz Board io) no   If you specify either vcc/gnd, wire() will wait a moment after power up.
oe number(obniz Board io) no   oe controls output tri-state. off for normal operation.This is optional. You don't need to specify oe when oe is connected directly to GND.You can use setEnable() function when specify oe. By default, oe is set to enabled state.
enabled boolean no true If oe was specified, you can set initial enable/disable with this parameter.
address number no 0x40 The address of module.
drive boolean no 'push-pull' Default output is push-pull driven. Specify "open-drain" to drive as open-drain.
// Javascript Example
var driver = obniz.wired("PCA9685", {gnd:0, oe:1, scl:2, sda:3, vcc:4});
var pwm0 = driver.getPWM(0);
pwm0.freq(1000);
pwm0.duty(50);

Multiple on single i2c

This module accept flexible address configration.
You can put multiple modules on same i2c bus.

// Javascript Example

var i2c = obniz.getFreeI2C();
i2c.start({mode:"master", sda:3, scl:2, clock:400 * 1000, pull:"5v"}); 

var driver0 = obniz.wired("PCA9685", {gnd:0, oe:1, i2c:i2c, vcc:4, address:0x40});
var driver1 = obniz.wired("PCA9685", {i2c:i2c, address:0x41});

var pwm0 = driver0.getPWM(0);
pwm0.freq(1000);
pwm0.duty(50);

var pwm16 = driver1.getPWM(0);
pwm16.freq(1000);
pwm16.duty(50);

getPWM(num)

Retriving pwm object. 0 to 15.

pwm object have similar functions as obniz.pwm.

  • pwm.freq()
  • pwm.duty()
  • pwm.pulse()

But frequency is shared by all pwm. So if you change one, then others frequency will be affected.

// Javascript Example
var driver = obniz.wired("PCA9685", {gnd:0, oe:1, scl:2, sda:3, vcc:4});
var pwm0 = driver.getPWM(0);
pwm0.freq(1000);
pwm0.duty(50);

And ServoMotor can accept this pwm object.

// Javascript Example
var driver = obniz.wired("PCA9685", {gnd:0, oe:1, scl:2, sda:3, vcc:4});
var servo0 = obniz.wired("ServoMotor", {pwm: driver.getPWM(0)});
var servo1 = obniz.wired("ServoMotor", {pwm: driver.getPWM(1)});
var servo2 = obniz.wired("ServoMotor", {pwm: driver.getPWM(2)});
servo0.angle(90);
servo1.angle(95);
servo2.angle(100);

freq(frequency)

Specify a frequency. 24 to 1526 hz.

Duty ratio will be kept.

// Javascript Example
var driver = obniz.wired("PCA9685", {gnd:0, oe:1, scl:2, sda:3, vcc:4});
driver.freq(1000);

duty(index, duty)

Changing a duty ratio of specified index pwm.

// Javascript Example
var driver = obniz.wired("PCA9685", {gnd:0, oe:1, scl:2, sda:3, vcc:4});
driver.freq(1000);
driver.duty(0, 50);
driver.duty(1, 60);

pulse(index, pulse_width)

Changing high length (msec) of specified index pwm.

// Javascript Example
var driver = obniz.wired("PCA9685", {gnd:0, oe:1, scl:2, sda:3, vcc:4});
driver.freq(100); // 100hz = 10msec interval
driver.pulse(0, 5);
driver.pulse(1, 6);

setEnable(enabled)

This function available only when oe was specified.
Changing Normal-operation/Hi-Z on all of it's chip output.

// Javascript Example
var driver = obniz.wired("PCA9685", {gnd:0, oe:1, scl:2, sda:3, vcc:4, enabled: false});
driver.setEnable(true);

Supported from: obniz.js 3.5.0