Arduino等の電子工作で複数のサーボモーターを制御するのに便利なAdafruit 16-Channel Servo Driver (PCA9685 16×12-bit PWM)基板の使い方について簡単に説明する。
元の情報は下記サイトから。互換ボードも出ており、基本的な使い方は同じである。
https://learn.adafruit.com/16-channel-pwm-servo-driver/hooking-it-up
Adafruit 16-Channel Servo DriverはArduino UNOからAnalog 4/5 PIN(もしくはSCL/SDAピン、内部的に同じピンなのでどちらに接続しても差異無し)の2本のピンを使うだけで、最大992個のサーボモーターを制御出来る代物だ。配線は簡単、ボードのGND/VCCをArduinoの5V/GNDに、SDA/SCLをAnalog 4/5に接続して終わり。後はサーボモーター駆動用に別途電源を接続し、サーボモーターのコネクタをサクサクと挿していくだけ。
サーボ駆動用の電源は基板中央のネジターミナルか、V+コネクタに給電。最大電圧は6Vまで。ネジターミナルは極性保護ありなので、ネジターミナルへの給電が推奨されている。
ネジターミナル横にある電解コンデンサの空き場所は、用途により要不要や使用する容量が変わるため、標準で付いていない。取り付ける電解コンデンサの容量は使用するサーボの数*100uFあたりが一つの目安。
一つの基板で16個までのサーボモーターを接続する事ができるが、数珠繋ぎで最大62枚(サーボ992)まで連結させる事が出来る。この場合、V+への給電は最初の基板のみで良い。
複数連結させる場合、基板の6本のピンを繋ぎ、基板右上にあるアドレス端子をショートさせる。アドレス端子は2ビット数値となっており、A2とA0をショートさせた場合、その基板のIDは000101bとなり5となる。
スケッチからアクセスする場合、最初のボードはアドレス0x40で
Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x40);
となり、ID5のボードは
Adafruit_PWMServoDriver pwm6 = Adafruit_PWMServoDriver(0x45);
となる。
配線が終わったら、Arudino IDEでスケッチを書く。
Adafruitのページからライブラリをダウンロードし、取り込む。
https://learn.adafruit.com/16-channel-pwm-servo-driver/using-the-adafruit-library
後はスケッチを書いてビルドして書き込んで完了。下記はシリアルモニタから「t#」で対象サーボ選択、「m#」で移動角度指定で制御するサンプル。
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
#define SERVOMIN 150
#define SERVOMAX 600
#define CENTER 375
int target = 0;
float movetopos;
char cmd;
void setup() {
Serial.begin(9600);
pwm.begin();
pwm.setPWMFreq(60);
for (int i=0;i<16;i++)
pwm.setPWM(i,0,CENTER);
Serial.println("Ready [t###]/[m####]");
}
void loop() {
if (Serial.available()){
int pwmValue;
cmd = Serial.read();
movetopos = Serial.parseInt();
if (cmd == 't'){
target = movetopos;
Serial.print("target ");
Serial.println(target);
}else if (cmd == 'm'){
Serial.print("move ");
Serial.println(movetopos);
pwmValue = map(movetopos,0,180,SERVOMIN,SERVOMAX);
pwm.setPWM(target, 0, pwmValue);
}
}
}










