Program Resource

開発者向け各種コード、アルゴリズム、リソース情報ライブラリ もしくはねふぁの覚え書き

Arduino等の電子工作で複数のサーボモーターを制御するのに便利なAdafruit 16-Channel Servo Driver (PCA9685 16×12-bit PWM)基板の使い方について簡単に説明する。

DSC03172

元の情報は下記サイトから。互換ボードも出ており、基本的な使い方は同じである。

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に接続して終わり。後はサーボモーター駆動用に別途電源を接続し、サーボモーターのコネクタをサクサクと挿していくだけ。

16ch_servo

サーボ駆動用の電源は基板中央のネジターミナルか、V+コネクタに給電。最大電圧は6Vまで。ネジターミナルは極性保護ありなので、ネジターミナルへの給電が推奨されている。

ネジターミナル横にある電解コンデンサの空き場所は、用途により要不要や使用する容量が変わるため、標準で付いていない。取り付ける電解コンデンサの容量は使用するサーボの数*100uFあたりが一つの目安。

一つの基板で16個までのサーボモーターを接続する事ができるが、数珠繋ぎで最大62枚(サーボ992)まで連結させる事が出来る。この場合、V+への給電は最初の基板のみで良い。

16ch_servo_chain

複数連結させる場合、基板の6本のピンを繋ぎ、基板右上にあるアドレス端子をショートさせる。アドレス端子は2ビット数値となっており、A2とA0をショートさせた場合、その基板のIDは000101bとなり5となる。

DSC03173

スケッチからアクセスする場合、最初のボードはアドレス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);
  }
 }
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*