Arduinoでサーボモーターを動かす場合、標準ライブラリとなるServoライブラリを使えば簡単に動かすことが出来ます。
しかし複数のサーボモーターを動かす(制御する)場合、その数だけGPIOピンが必要となってきます。
ArduinoにはMegaなど多くのGPIOピンが搭載されたボードもありますが、一般的によく使われるArduino UnoやNanoなどのボードではそれほど多くのGPIOピンは搭載されていません。
こちらは以前製作した4足歩行ロボットとなりますが、関節部分に計8個のサーボモーターを使っています。
これくらいの数のサーボモーターならUnoやNanoに接続しても、その他の用途で使えるGPIOピンにはまだ余裕があります。
そして上記ロボットに1関節増やしたこちらの4足歩行ロボットでは、計12個のサーボモーターを使って動かしています。
Arduino標準ライブラリとなるServoライブラリでは、アナログピンも使えば20台近くはサーボモーターを動かすことは出来るのですが、センサーなど他のモジュールなどもいろいろと接続したい場合はその空きに不安が出てくる場合があります。
ArduinoのデジタルピンD0とD1は、シリアルでのやり取りを行う端子となっておりスケッチの書き込みでも使われているので空けておきたいし・・・
センサーの取り付けで数本(上記ロボの超音波センサーでは2本)のデジタルピンを使うし・・・
無線モジュール(上記ロボではnRF24L01を使っています)の接続でSPIピンの接続で4本ほど必要だし・・・
他の用途や機能を追加しようと考えると、GPIOピンが足りなくなってしまいます。
そこでこの問題を解決する方法としてサーボモータードライバを使う方法があります。
ArduinoやRaspberry Piなどのマイコンボードと接続して使える定番的なサーボモータードライバとしてPCA9685があります。
PCA9685チップは16個のPWM出力が出来るチップとなり、モジュール形状になっているものでは使いやすくなっています。
PCA9685サーボモータードライバは、I2C接続で制御出来るモジュールとなり、Arduino側で使うGPIOピンはSDA(アナログピンA4)とSCL(アナログピンA5)の2本だけで接続することができ、16台のサーボモーターを同時に動かすことが出来ます。
I2Cでの接続となるので複数のPCA9685ドライバを接続すれば、理論的には最大992台までのサーボモーターを2本のGPIOピンで動かすことが出来ます。
PCA9685サーボモータードライバやI2C通信に関してはこちらの記事で詳しく書いているので参考にして下さい。
PCA9685はPWMパルスを出力できるものとなり、元々はLEDを制御するためのもののようです。
サーボモーターの制御以外にも、このようにLEDの点灯制御にも簡単に使えます。
この投稿をInstagramで見る
PCA9685はArduinoなどマイコンボードと接続して複数のサーボモーターを動かすことが出来る便利な定番的なドライバとなります。
今回は上記記事でご紹介したモジュールタイプのものとは違い、Arduinoのシールドタイプになったものをご紹介したいと思います。
目次
【Arduino】PCA9685サーボモータードライバシールドを使ってみる!
先述のようにPCA9685は16チャンネルのPWM出力が可能なドライバとなります。
主に複数のサーボモーターを動かす場合に使われます。
上記写真のようにモジュール形状のものとArduino用として今回ご紹介するシールド形状のものがあります。
ともに1枚のボードで最大16台までのサーボモーターを同時に制御する事が出来ます。
ArduinoとはI2C通信により制御を行うためArduino側で使うGPIOピンは、SDA(アナログピンA4)とSCL(アナログピンA5)の2本だけで動かすことが出来ます。
I2C接続なのでボードのI2Cアドレスを変えて接続すれば、2段目・3段目・・・とシールドを積み重ねて増やしていくことにより理論的に最大992台のサーボモーターを制御する事が出来ます。
PCA9685は一般的にこのようなモジュール形状になったものを使うことが多いと思います。
そして今回は、Arduinoのシールド形状となっているPCA9685サーボモータードライバシールドを使ってみたいと思います。
とは言っても使い方は上記モジュール形状のものと全く同じです。
ただシールド形状となっているので、Arduinoボードに挿し込むだけなので手軽に使えるようになっています。
このシールドを1枚持っているとArduinoでサーボモーターを使ったテストなども出来るので結構便利だと思います。
PCA9685 Arduinoシールド
こちらがArduinoシールドタイプのPCA9685 サーボモータードライバシールドです。
今回使っているボードはKeyestudio製のボードとなります。
黄色が特徴のKeyestudio製品ですが、Arduino関連の互換ボードを多数販売していて品質も高いので最近よく使っています。
まず外観を少し見ておきます。
シールド形状なのでArduinoボードに挿し込むだけで使えます。
ボード上の3ピンのピンヘッダー(PWM/V+/GND)にサーボ端子を接続するだけで簡単にサーボモーターを動かす事が出来ます。(最大16台まで接続可能)
通常のシールドよりもArduinoと接続するためのピンヘッダーが少し長くなっています。
16台以上のサーボモーターを動かしたい場合、さらにこの上に2段・3段と同シールドを積み上げて接続する場合にサーボ端子がボードに干渉しにくくされているのかな?
ボード上の接続端子はこのようになっています!
2系統の電源に関して
このシールドには2つの独立した電源回路が内蔵されています。
Arduino側からの電力供給でPCA9685を駆動するための電源(5V or 3.3V)と、サーボモーターを動かすための外部電源(5~6V)です。
シールド(PCA9685)駆動電源
まずシールド自体(PCA9685チップ)を駆動するための電源です。
Arduinoとシールドを接続した状態でArduino側に電力供給するとシールド側にも電力が供給されます。
この時、ボード上の[5V LED]が点灯します。
この時のPWM信号とI2Cのロジックレベルはデフォルトでは5Vになっています。
シールド基板上に[VCC select]と書かれたはんだ接続するジャンパーパッドがありますが、このパッドを短絡する事によりArduinoからの電力供給を5V or 3.3Vに切り替えられるようになっています。
これによりPWM出力信号とI2Cのロジックレベルを5V or 3.3Vに切り替えられるようになっているようですが、基本的にArduinoで使う場合デフォルトの5Vで問題ないかと思います。
サーボ駆動用電源
次にサーボモーター駆動用の外部電源です。
モジュールタイプのPCA9685同様に、サーボ駆動用の電源供給用としてターミナルブロック端子が付いています。
こちらに外部電源を接続しサーボモーターを動かすための駆動用の電源とします。
外部電源の対応電圧は5~6Vとなっており、逆極性保護回路も付いているようです。
外部電源が接続されると、ボード上の[V+ LED]が点灯します。
そして一般的にサーボモーターを動かす場合、特に始動時に大きな電流が流れ電圧降下による不具合(誤動作など)が発生する場合があります。
そのような場合にモジュールタイプのPCA9685にも付いていますが、同様に電解コンデンサを取り付け出来るようになっています。
I2Cアドレス変更パッド
I2Cアドレスを変更するためのアドレスパッドも用意されています。
それだけ多くのサーボモーターを接続することはあまりないかと思いますが、2段目・3段目・・・とこのシールドを重ねて使用する場合や他のI2C機器との接続でアドレスを変えたい場合などで使えます。
デフォルトではパッドは全てフリーとなっていてI2Cアドレスはデフォルトで[0x40]となっています。
ArduinoとはI2Cで接続されているので、基本的にアナログピンA4(SDA)とA5(SCL)以外の端子は全て使うことが出来ます。
16台までのサーボモーターを動かす場合でもI2Cピン以外は使えるので便利ですね!
ライブラリのインストール
実際にこのシールドを使って複数台のサーボモーターを動かしてみたいと思います。
ArduinoとはI2Cでの接続となるので、【Adafruit PWM Servo Driver Library】を使います。
まず、このライブラリをArduino IDEにインストールしておきます。
ライブラリのインストールは通常通り、[スケッチ]→[ライブラリをインクルード]→[ライブラリを管理]へと進み
[Adafruit PWM]で検索すれば出てくるので、このライブラリをインストールしておきます。実際に動かしてみる!
動作テスト用に簡単なスケッチを作ってみました。
接続したサーボモータを順番に0°→180°と動かす簡単なものとなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | // 【Arduino】PCA9685サーボモータードライバシールドを使ってみる! // https://burariweb.info #include <Wire.h> // ライブラリのインクルード #include <Adafruit_PWMServoDriver.h> Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40); // PCA9685のI2Cアドレスを指定(デフォルト値は0x40) #define SERVOMIN 110 // 最小パルス幅(~4096の範囲) #define SERVOMAX 480 // 最大パルス幅(~4096の範囲) int angle; int Servo_Num = 6; void setup() { pwm.begin(); // 初期設定 pwm.setPWMFreq(50); // PWM周期を50Hzに設定 for(int i=0; i<Servo_Num; i++){ // サーボを90度の位置に動かす servo_move(i, 90); delay(100); } delay(1000); } void loop() { angle = 0; // サーボを順に0度の位置に動かす for(int i=0; i<Servo_Num; i++){ servo_move(i, angle); delay(70); } delay(500); angle = 180; // サーボを順に180度の位置に動かす for(int i=Servo_Num-1; i>=0; i--){ servo_move(i, angle); delay(70); } delay(500); } // 指定角度にサーボを動かす void servo_move(int n, int angle){ angle = map(angle, 0, 180, SERVOMIN, SERVOMAX); pwm.setPWM(n, 0, angle); } |
接続するサーボの台数により変数Servo_Num = 6;の数を変えて下さい。
今回6台のサーボモーターを接続しているのでスケッチ内の変数の値を6としています。
上手く6台のサーボモーターを同時に動かすことが出来ました。
この投稿をInstagramで見る
冒頭の動画のように最大16台までのサーボモーターを接続し同時に動かすことが出来ます。
PCA9685ドライバの詳しい使い方やスケッチ例に関してはこちらの記事を参考にして下さい!
最後に!
PCA9685は、サーボモーターの制御でよく使われる定番的なドライバボードとなります。
モジュール形状のPCA9685を使うことの方が多い?かと思いますが、Arduinoで使う場合シールド形状になったタイプのものも便利に使えます。
上記写真の2足歩行ロボットは、Arduino Unoにセンサーシールドを使って12台のサーボモーターを動かす構成で作っています。
製作後、センサーやBluetooth、無線モジュールなどの機能を追加していく過程でGPIOピンの空きが足らなくなり・・・
シールドタイプのPCA9685では、このような場合でもシールドを変更(載せ替える)するだけで使え、スケッチの変更も最小限で使えるので便利ですね。
また、Arduinoを使ってサーボモーターの動作スケッチやテスト動作などさせたい場合に外部電源さえ用意できれば接続をシンプルにする事ができ、便利に使える場面は多いと思います。
コメントを残す