記事一覧

Dovewill PCA9685 16チャネルPWMサーボモータドライバをArduinoで使ってみた

Dovewill PCA9685 16チャネルPWMサーボモータドライバをArduinoで使ってみた



RoboTakaoです。ようこそ「極力ローコスト ロボット製作 ブログ」にお越しくださいました。

今回は定番のPCA9685を使用した16チャンネルPWMサーボドライバをアマゾンで買ったので、まずはArduinoで試してみました。

pca9685_03.jpg

pca9685_01.png

説明
・I2C入力、制御16 PWM出力、16ウェイサーボモータを制御
・2つのピンで、16個のフリーランニングPWM出力を制御
 最大62個のブレークアウトをチェーンして最大992個のPWM出力を制御
・クロックを内蔵したI2C制御のPWMドライバ。
・5Vに準拠。つまり、3.3Vのマイクロコントローラから制御し、最大6Vの出力を駆動
・6つのアドレス選択ピンで、最大62個の出力を1つのI2Cバスに接続可能。

仕様
・各出力の12ビット分解能
 サーボの場合、60Hzの更新レートで約4usの分解能
・設定可能なプッシュプルまたはオープンドレイン出力
・すべての出力をすばやくディスエーブルにする出力イネーブル・ピン
・電源入力用の端子台(または、側面に0.1インチのブレークアウトを使用可)
・端子ブロック入力の逆極性保護
・グリーンパワーグッドLED
・3つのピンコネクタを4つのグループに分けて、一度に16サーボを差込可能
・「チェーン対応」設計
・V +ラインに大きなコンデンサを配置
・すべての出力ラインに330Ωの直列抵抗を接続して保護
・6つのアドレス選択ピンのはんだジャンパー
・サイズ60x25x5mm

結線

PCA9685
+5V    バッテリのプラス
OE    未接続
SCL   Arduino Nano のA5
SDA   Arduino Nano のA4
GND   Arduino Nano のGND およびバッテリーのマイナス
VCC   Arduino Nanoの5V

pca9685_05.png


Arduinoでの利用
今回は秋月の同等製品のArduinoライブラリを使ってみます。

取扱説明書
PCA9685データシート
Arduinoライブラリ

ライブラリーをダウンロードしてArduino IDEで読み込みます。
スケッチ→ライブラリをインクルード→.ZIP形式のライブラリをインストール

pca9685_04.png

これでスケッチ例からサンプルスケッチを開けるようになります。

スケッチ
サンプルから少し変更しています。
まずサンプルは2個のPCA9685を使用していますが今回は1つなので2つ目の部分は削除しています。
また一般的なサーボの設定ということで60Hzの周期で最小パルス幅150と最大パルス幅600としていますが、以前の投稿でも書いたように今回使うGWSのMicro2BBMGのパルス幅の範囲を超えてしまうことがオシロスコープを見て分かりましたので変更しました。(最小と最大パルス幅の単位がよくわかりませんが)

PWM周期 60 → 50
最小パルス幅 150 そのまま
最大パルス幅 600 → 500

あと微妙に角度を変えました。

このサンプルスケッチは180から0度を10度刻みで回転させて0になったら180度に戻します。


#include
#include //PCA9685用ヘッダーファイル

PCA9685 pwm = PCA9685(0x40); //PCA9685のアドレス指定(アドレスジャンパ未接続時)

#define SERVOMIN 150 //最小パルス幅 (GWS Micro2BBMG)
#define SERVOMAX 500 //最大パルス幅 (GWS Micro2BBMG)

void setup() {
pwm.begin(); //初期設定 (アドレス0x40用)
pwm.setPWMFreq(50); //PWM周期を50Hzに設定 (アドレス0x40用)
}

int n=0;

void loop() {
//サンプルソース 16chすべてのチャンネルより0度~180度の移動を繰り返します。
for(int i=0; i<16; i++)
servo_write(i,n);
n=n+10;
if(n>=180)n=0;
delay(500);
}

void servo_write(int ch, int ang){ //動かすサーボチャンネルと角度を指定
ang = map(ang, 0, 180, SERVOMIN, SERVOMAX); //角度(0~180)をPWMのパルス幅(150~500)に変換
pwm.setPWM(ch, 0, ang);
}



動作確認

とりあえず普通に動くことを確認。超簡単です。



ちなみに16個サーボを動かすには3A以上は必要らしく、ためにニッケル水素電池を使いましたが、途中で変な動きするようになりました。電流がたりなくなったみたいです。

それでは今回はこの辺で失礼します!ありがとうございます。

スポンサードリンク

コメント

No title

2つ繋げつ使いたいです。 どうすればいいですか
int ch 意味理解できないです、 いまは1番目のサーボモーターですが2番目につけたらどうやってコントローしますかお願いします

No title

コメントありがとうございます。複数のサーボ繋げたい場合はPCA9685基板の複数のチャンネルにサーボを接続すればOKです。16個のサーボを接続できます。
スケッチの中で以下で各チャンネルを指定できます。
servo_write(チャンネル,サーボの角度);

複数のPCA9685基板を繋げたい場合はI2Cにチャンネルを変更する必要があります。基板にジャンパのパターンがあるはずなので指定したいチャンネルになるようにショートします。詳細は基板のデーターとをみてください

ありがとうございます

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

Re: Dovewill PCA9685 16チャネルPWMサーボモータドライバをArduinoで使ってみた

コメントありがとうございます。状況からするとサーボへの出力電圧が立たないということはV+で入力した電源(+)が基板上で断線しているか、V+に元々供給していないことが考えられます。断線の場合はテスターで確認できると思われます。V+ピンとサーボへの出力+の導通を確認してみてください。この基板に場合、反対側にもランドがあるのでそこも調べるのが良いでしょう。また真ん中にる緑の端子のPWRも繋がっているので導通確認してみてください。
ICの電源用にVccピンがありますが、もしここだけ接続している状態ならV+も接続してください。
あとやりがちなのがGNDの接続です。電源用のGNDと基板のGNDそしてArduino側のGNDは共通でつながっていないといけません。
以上考えられるものを挙げてみました。よろしくお願いします。

No title

チャンネルごとに動作を変える場合はどうすればいいですか?

No title

それぞれのサーボをバラバラに動かす場合はfor ループ内で各チャンネルごとに角度指定すればOKです

//サンプルソース 16chすべてのチャンネルより0度~180度の移動を繰り返します。
for(int i=0; i<16; i++)
servo_write(i,n); //ここで各チャンネルごとにnの値を変える
n=n+10;
if(n>=180)n=0;
delay(500);
}

コメントの投稿

非公開コメント

プロフィール

RoboTakao

Author:RoboTakao
みなさんご訪問ありがとうございます。ロボット作りたいけどお小遣いそんなにないし、簡単でローコストでロボットを作るための私のプロジェクトを紹介します。

ウェブサイトもありますのでそちらもよろしくお願いします。
http://robotakao.jp/

スポンサーリンク