検索コード

PCA9685モジュールとESP32 V4を使用して32サーボモーターを制御する

PCA9685モジュールとESP32 V4を使用して32サーボモーターを制御する

このチュートリアルでは、PCA9685モジュールに接続されたESP32マイクロコントローラを使用して、最大32個のサーボモーターを制御する方法を学びます。これは、Wi-Fiを使用せずに複数のサーボモーターを同時に操作する必要があるプロジェクトに特に便利です。結果として、各サーボモーターの位置を個別に操作できる完全に機能するセットアップが得られます。

PCA9685 module-0

このチュートリアルでは、必要なハードウェアコンポーネント、配線の指示、およびこの制御を実現するために必要なコードの概要について説明します。詳細なデモンストレーションについては、関連するビデオを視聴することを検討してください(ビデオは00:00にあります)。

ハードウェアの説明

このプロジェクトで使用される主なコンポーネントは、ESP32マイクロコントローラーとPCA9685 PWMドライバーモジュールです。ESP32は、PCA9685モジュールに信号を送信するメインコントローラーとして機能し、そのPCA9685がサーボモーターを制御します。PCA9685は、1つのモジュールで最大16台のサーボモーターを扱うことができるため、2つのモジュールを接続することで合計32台のサーボを制御することが可能です。

PCA9685モジュールはI2C通信を使用して動作し、データ転送のための2本の主要なワイヤーであるSDA(データライン)とSCL(クロックライン)があります。また、サーボを動作させるための電源が必要で、通常は5Vです。ESP32はマスターデバイスとして機能し、スレーブPCA9685モジュールに必要な制御信号を提供します。

データシートの詳細

製造者 アダフルート
部品番号 PCA9685
論理/入出力電圧 3.3 Vから5.5 V
供給電圧 5 V
出力電流(チャネルごと) 約20 mA
ピーク電流(チャネルあたり) 約25 mA
PWM周波数ガイダンス 60ヘルツ
入力ロジック閾値 0.3*VDD(低), 0.7*VDD(高)
電圧降下 / RDS(on)/ saturation 0.5 V max
熱の制限 125 °C
パッケージ HTSSOP-28
ノート / バリアント 16チャンネルPWMコントローラー

  • サーボ用に外部電源を使用してください(推奨:5V、2A)。
  • ESP32とPCA9685の間の適切な接地を確保してください。
  • 最適なサーボ性能のためにPWM周波数設定を確認してください。
  • サーボの仕様に基づいてパルス幅の制限を調整してください。
  • 複数のサーボが動作しているときは、電流の引き込みに注意してください。

配線指示

ESP32 wiring for PCA99685 for 32 sevo motors

PCA9685をESP32に配線するには、まず電源とグラウンドを接続します。Vを接続してください。CCPCA9685のピンを5V電源に接続し、GNDピンをESP32のGNDピンの1つに接続します。これにより、モジュールとESP32が共通のグラウンドを共有します。

次に、I2C通信のために、PCA9685のSDAピンをESP32のGPIO 21に接続し、SCLピンをGPIO 22に接続します。この設定により、ESP32はPCA9685モジュールと適切に通信することができます。特に複数のサーボを使用している場合は、通信ラインのノイズを避けるために短いワイヤーを使用してください。

PCA9685ボードを2つ接続する

上の画像に示されているように、PCA9685ボード2(左側)の場合、そのパスをはんだ付けしてI2Cアドレスを設定し、ボード1(右側)とは異なるようにしてください。

コード例とウォークスルー

コードはPCA9685モジュールを初期化し、PWM周波数を設定します。コード内の重要な識別子にはboard1board2ESP32に接続された2つのPCA9685モジュールを表しています。setup()関数はシリアルモニターを初期化し、両方のボードに対してPWM周波数を設定します。

void setup() {
  Serial.begin(9600);
  Serial.println("32 channel Servo test!");
  
  board1.begin();
  board2.begin();  
  board1.setPWMFreq(60);  // Analog servos run at ~60 Hz updates
  board2.setPWMFreq(60);
}

この抜粋は、シリアル通信が初期化され、サーボドライバーのPWM周波数が設定されるセットアッププロセスを示しています。setPWMFreq(60)その機能は、サーボがスムーズに動作するために正しい周波数を受信することを保証します。

ループ内では、forループが0度から180度までの角度を反復し、両方のPCA9685ボードに接続されたサーボにパルス幅コマンドを送信します。関数angleToPulse角度を対応するパルス幅に変換します。

void loop() {
    for(int angle = 0; angle < 181; angle += 10) {
        for(int i = 0; i < 16; i++) {      
            board2.setPWM(i, 0, angleToPulse(angle));
            board1.setPWM(i, 0, angleToPulse(angle));
        }
    }
    delay(100);
}

このコードの抜粋は、サーボがループ内でどのように制御されるかを示しています。サーボの角度は10度ずつ増加します。setPWM関数は両方のボードに対して呼び出され、サーボを指定された角度に移動させます。遅延は動きの間に短い一時停止を可能にします。

デモンストレーション / 期待すること

配線とコードのアップロードが完了したら、サーボが0から180度までの増分で動くのを見ることができるはずです。これは、2つのPCA9685モジュールに接続されたすべての32個のサーボで同時に発生します。サーボが応答しない場合は、電源を確認し、すべての接続がしっかりとされていることを確認してください(ビデオの12:30にて)。

PCA9685モジュール
PCA9685モジュール

ビデオのタイムスタンプ

  • 00:00 スタート
  • 00:36 イントロダクション
  • 04:01 配線の説明 (ESP32のみに適用)
  • 06:26 ESP32のためのArduino IDEの準備
  • 08:34 コードの説明
  • 13:40 32個のサーボモーターの動作デモンストレーション

画像

PCA9685 module-0
PCA9685 module-0
PCA9685 module-2
PCA9685 module-2
PCA9685 module-3
PCA9685 module-3
PCA9685 module
PCA9685 module
Connecting two PCA9685 board
Connecting two PCA9685 board
ESP32 wiring for PCA99685 for 32 sevo motors
ESP32 wiring for PCA99685 for 32 sevo motors
880-new- PCA9685 Video V4, Arduino ESP32 Code : Controlling all 32 servo motor wihtout WiFi
言語: C++
/*
 * オリジナルライブラリソース: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
 * 
 * これは、WiFiなしでESP32ボードを使用して32個のサーボモーターを制御するためのArduinoコードPCA6985 16チャネルサーボコントローラーです。
 * 
 * このコードと配線はこのビデオから取得できます: http://robojax.com/RJT268
 * 
 * これはPCA9685に関するV4ビデオです: https://youtu.be/JFdXB8Za5Os
 * 
 * 詳細についてはビデオを視聴してください(V1)およびデモ http://youtu.be/y8X9X10Tn1k
 * 
 * Robojaxビデオチャンネルwww.Robojax.comのためにAhmad Shamshiri によって書かれ/更新されました
 * 日付: 2019年12月15日、カナダのオンタリオ州アジャックス
 * 
 * 免責事項: このコードは「現状のままで」提供されており、教育目的のみで使用されます。
 * 
 * または、PayPalを使用して寄付を行う: http://robojax.com/L/?id=64
 * 
 * このコードは「現状のままで」提供されており、保証または責任はありません。このメモをそのまま保持する限り、自由に使用できます。*
 * このコードはRobojax.comからダウンロードされました。
 * このプログラムはフリーソフトウェアであり、GNU一般公衆ライセンスの条件の下で再配布および/または修正できます。これは、フリーソフトウェア財団が発行したライセンスのバージョン3、または(あなたの選択で)それ以降のバージョンに基づいています。
 * 
 * このプログラムは、有用であることを期待して配布されますが、いかなる保証もありません。商品性や特定の目的に対する適合性の暗示された保証すらありません。詳細についてはGNU一般公衆ライセンスを参照してください。
 * 
 * このプログラムと一緒にGNU一般公衆ライセンスのコピーを受け取っているはずです。受け取っていない場合は、<https://www.gnu.org/licenses/>を参照してください。
 */
#include <Wire.h>

#include <Adafruit_PWMServoDriver.h>

 // このように呼び出されると、デフォルトのアドレス0x40を使用します。
Adafruit_PWMServoDriver board1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver board2 = Adafruit_PWMServoDriver(0x41);

 // サーボのメーカーによって、パルス幅の最小値と最大値は異なる場合があります。あなたは
 // これらをハードストップに当たらない範囲で可能な限り小さく/大きくしたい。
 // 最大範囲のために。それらを調整して、使用するサーボに合わせる必要があります。
 // 持っている!
 // 動画V1を見て、以下の2行を理解してください: http://youtu.be/y8X9X10Tn1k
#define SERVOMIN  125 // これは「最小」パルス長カウント(4096のうち)です。
#define SERVOMAX  575 // これは「最大」パルス長カウント(4096のうち)です。


int servoNumber = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("32 channel Servo test!");

  board1.begin();
  board2.begin();
  board1.setPWMFreq(60); // アナログサーボは約60 Hzで更新されます
  board2.setPWMFreq(60);
 // 空の文字列
}

 // loop()内のコードはRobojaxによって更新されました
void loop() {


    for( int angle =0; angle<181; angle +=10){
      for(int i=0; i<16; i++)
        {
            board2.setPWM(i, 0, angleToPulse(angle) );
            board1.setPWM(i, 0, angleToPulse(angle) );
        }
    }

 // robojax PCA9865 16チャンネルサーボ制御
  delay(100);

}

/*
 * angleToPulse(int ang)
 * 度単位の角度を取得し、パルス幅を返します
 * また、シリアルモニターに値を出力します
 * Ahmad ShamshiriによってRobojax、Robojax.comのために書かれました
 */
int angleToPulse(int ang){
   int pulse = map(ang,0, 180, SERVOMIN,SERVOMAX); // 0から180のマップ角度をサーボの最小値と最大値に対応させる
   Serial.print("Angle: ");Serial.print(ang);
   Serial.print(" pulse: ");Serial.println(pulse);
   return pulse;
}

必要かもしれないもの

リソースと参考文献

まだリソースはありません。

ファイル📁

Arduinoライブラリ(zip)