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); } } }