obniz
Version:
obniz sdk for javascript
145 lines (106 loc) • 5.92 kB
Markdown
# PCA9685
PCA9685は16の独立したPWMを出力できるチップです。周波数は16全てで共通となります。
サーボモーターの駆動に最適で、16のサーボモーターをそれぞれ別々に動かすことが出来ます。
出力電流はそれほど強くないのでDCモーターを直接つなぐことは出来ません。

各社からサーボモーター用のピンヘッダもついたモジュール販売されています。
上の写真はAdafruitのものです。
[https://www.adafruit.com/product/815](https://www.adafruit.com/product/815)
## wired(obniz, {[gnd, vcc, oe, scl, sda, i2c, enabled, address, drive]})
チップの各ピンをどのobnizのioに接続したか設定します。
サーボモーターに供給する電源(AdafruitのモジュールではV+と表示されています。)はobnizからではなく、別の電源を利用して下さい。
name | type | required | default | description
--- | --- | --- | --- | ---
scl | `number(obniz io)` | no | | つないだobnizのioを指定してください。
sda | `number(obniz io)` | no | | つないだobnizのioを指定してください。
i2c | `i2c object` | no | | 設定済みのi2cに接続している場合に利用できます。
vcc | `number(obniz io)` | no | | 別の電源につないでいる場合は指定する必要はありません。vcc/gndどちらかでも指定されている場合は、電源投入後にこの関数の中でwaitが入ります。
gnd | `number(obniz io)` | no | | 別の電源につないでいる場合は指定する必要はありません。vcc/gndどちらかでも指定されている場合は、電源投入後にこの関数の中でwaitが入ります。
oe | `number(obniz io)` | no | | 出力ピンすべてをonでもoffでもないハイインピーダンスに切り替えるためのピンです。指定した場合はsetEnable()関数が使えるようになります。enabled=falseを指定しない限りenabledが初期状態となります。
enabled | `boolean` | no | true | oeが指定されていた場合、初期状態をどちらにするか指定できます。
address | `number` | no | 0x40 | モジュールのアドレスです。初期設定(0x40)から変更している場合は指定して下さい。
drive | `boolean` | no | 'push-pull' | 標準で出力はプッシュプル出力ですが、'open-drain'を指定することでオープンドレイン出力にできます。
```Javascript
// 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
このモジュールはI2Cのアドレスを比較的自由に設定できます。
そのため同じI2Cバスライン上に複数のモジュールを置くことが出来ます。
```Javascript
// 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)
16あるpwmモジュールのうちいずれか1つをpwmオブジェクトとして取得できます。0~15が指定できます。
pwmオブジェクトはobniz.pwmXと同じく以下の関数を持っています。
- pwm.freq()
- pwm.duty()
- pwm.pulse()
ただし、周波数だけはモジュール全体で共通なので、他のPWMと違う値を指定すると他のPWMに影響があります。pwm0だけ1khzでほかは500hzといった使い方はできません。
```Javascript
// 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);
```
また、[ServoMotor](../ServoMotor)もこのpwmオブジェクトを受け付けられるようになっています。
```Javascript
// 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)
モジュールの周波数を指定します。
16あるPWMは独立していますが、周波数だけは共通となります。
24~1526Hzが指定できます。
また、このモジュールはパルス出力にDuty比を重要視しますので、出力中のpwmの周波数を変更してもDuty比には影響はありません。
```Javascript
// Javascript Example
var driver = obniz.wired("PCA9685", {gnd:0, oe:1, scl:2, sda:3, vcc:4});
driver.freq(1000);
```
## duty(index, duty)
indexで指定したpwmのDuty比を変更できます。
```Javascript
// 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)
indexで指定したpwmのパルス出力幅をmsecで指定します。
```Javascript
// 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)
oe端子をobnizにつないでいる場合にのみ使えます。
出力ピンをすべてハイインピーダンスにします。
```Javascript
// Javascript Example
var driver = obniz.wired("PCA9685", {gnd:0, oe:1, scl:2, sda:3, vcc:4, enabled: false});
driver.setEnable(true);
```