検索コード

XY-1250 10-50A/60A 3000W PWM モーター速度コントローラー Arduinoを使用

XY-1250 10-50A/60A 3000W PWM モーター速度コントローラー Arduinoを使用

このチュートリアルでは、一般的なXY-1250 PWMモーター速度コントローラー(定格10-50A/60A、最大3000W)を示し、内部のノブの代わりにArduinoでその速度を制御する方法を説明します。これは、カスタム電動ロングボード、CNCスピンドル速度制御、ロボティックドライブシステム、または自動ファンシステムなど、自分のプロジェクトに高出力モーターコントローラーを統合したいホビー愛好者からの人気のリクエストです。手動のポテンショメーターをデジタル信号に置き換えることで、モーターの速度を正確にプログラム可能に制御でき、自動化や遠隔操作の可能性が広がります。

60A-3000W-PWMボード-0

このセットアップで構築できるいくつかの実用的なプロジェクトを紹介します:

  • プログラム可能なスピードランピングを備えたカスタム電動ロングボードまたはゴーカートの製作。
  • Gコードで調整可能なCNCマシン主軸回転速度コントローラーを作成すること。
  • 温度センサーに基づいて速度を調整する自動化された温室ファンを構築すること。
  • 高トルクモーターを使用したリモートコントロールロボットを作成する。
  • ワークショップや小規模工場のためのスマートコンベヤベルトシステムを開発する。

ハードウェアコンポーネント

  • XY-1250 PWMモーター速度制御モジュール(10-50A/60A、3000W)
  • Arduino Uno(または互換性のあるボード)
  • テスト用DCモーター
  • DC電源(推奨12V-36V)
  • ポテンショメーター(10kΩ) - 手動制御オプション用
  • ジャンパーワイヤー
  • はんだごてとワイヤー(PCBの改造用)

XY-1250の動作原理

XY-1250は、PWM信号を生成するために555タイマーIC(基板上で「U3」とラベル付けされています)を使用しています。この信号は、高出力モーター回路を切り替える4つのMOSFETのゲートを制御します。デューティサイクルは、モーターの速度を決定するもので、通常は555タイマーのピン3に接続されたオンボードポテンショメーターによって設定されます。これをArduinoで制御するためには、555の出力をMOSFETゲートから切り離し、代わりに自分のPWM信号を供給する必要があります。

この改造は、Arduinoが高電流MOSFETゲートを直接駆動できないために必要です。555タイマーとMOSFETの間のPCBトレースを切断することで、Arduinoから自分たちの低電圧PWM信号を安全に注入できるようになり、モーターの速度を完全にデジタル制御できるようになります。(動画の01:42にて)

XY-1250ボードの改造

60A 3000W 赤モジュール PCB ラインを Arduino で動作するようにカット

Arduinoを接続する前に、555タイマーの出力をMOSFETゲートから切り離すためにPCBに2か所のカットを入れる必要があります。手順は次のとおりです。

  1. ボード上の555タイマーチップ(U3)を見つけてください。そこにはピン1を示す小さな点または線があります。
  2. ピン3(出力)から出ているPCBトレースを特定し、それがMOSFETゲートに接続されているダイオードにつながっていることを確認します。
  3. 鋭いナイフまたは切断ディスクの付いたロータリー工具を使用して、慎重にこれらのトレースを2カ所で切ります。出力パスごとに1つずつ切ります。
  4. 切断後、連続性テスターを使用して切断が完了していることを確認してください。555のピン3とMOSFETゲートエリアの間でビープ音が聞こえないはずです。

この修正は重要です。これは555タイマーの信号が私たちのArduinoのPWM信号に干渉するのを防ぎます。(動画の07:02にて)

60A 3000W 赤モジュール PCB ラインを Arduino と連携して作業するためにカット

配線ガイド

このプロジェクトの配線は、Arduinoを改造したXY-1250ボードに接続することを含みます。接続図は次のとおりです:

  1. Arduinoの電源:XY-1250には約8.5Vを出力するボルテージレギュレーターがあります。この出力(2個のコンデンサーの間にある赤いワイヤー)をArduinoのVINピンに接続します。これにより、モーターの電源から直接Arduinoに電力が供給されます。重要: これを5Vピンに接続しないでください。Arduinoが焼損します。
  2. 接地接続:XY-1250のグラウンドをArduinoの任意のGNDピンに接続してください。
  3. PWM信号:Arduinoのピン5を最初の切断トレース(555の出力があった場所)に接続し、Arduinoのピン6を2番目の切断トレースに接続します。
  4. ポテンショメーター(オプション):手動制御を希望する場合、10kΩのポテンショメータをArduinoのA0ピンに接続し、他の2つのピンを5VおよびGNDに接続してください。
  5. モーター:XY-1250モジュールの出力端子にDCモーターを接続してください。

配線が完了すると、Arduinoはモーターと同じ電源から供給され、両方のMOSFETゲート回路に同期したPWM信号を送信します。(動画の10:25にて)

60A-3000W-PWMボード-7本の入力ワイヤーがArduinoに接続される準備ができています。

コードの説明

Arduinoコードは簡潔で、PWM信号の生成に重点を置いています。ユーザーが設定可能な主要な部分は次のとおりです:


#define pwmPin1 5
#define pwmPin2 6
#define controlPin A0
  • pwmPin1そしてpwmPin2これは、PWM信号を2つのMOSFETゲート回路に送信するArduinoのピンです。これらは、Arduino UnoのPWM対応ピンであるピン5と6として定義されています。
  • controlPinポテンショメーターに接続されているアナログピン (A0) です。ポテンショメーターを使用したくない場合は、これを無視しても構いません。

In theloop()機能として、コードはポテンショメータの値(0-1023)を読み取り、それをPWM値(0-255)にマッピングし、両方のPWMピンに送信します。delay(500)秒間に2回にリフレッシュレートを設定します。これを減らすことができます。delay(100)よりスムーズな応答のために。

コードにはカスタムも含まれています。toPWM()パーセンテージ値(0-100)をPWM値(0-255)に変換する関数です。これは、ポテンショメーターなしで特定の速度を設定したい場合に便利です。例えば、呼び出すとtoPWM(50)127を返し、50%デューティサイクルを表します。この関数を自分のコードに使って、モーターのスピードを直接設定することができます。

60A-3000W-PWMボード-6

テストとデモンストレーション

コードをアップロードし、すべてを接続した後、セットアップをテストできます。ポテンショメーターを使用している場合、回転させることでモーターの速度が0%から100%に滑らかに調整されます。シリアルモニターには、生のアナログ値(0-1023)とマッピングされたPWM値(0-255)が表示されます。

速度をプログラムで制御したい場合は、ポテンショメーターの読み取りを固定値に置き換えることができます。例えば、設定int pwm = toPWM(20);モーターを20%の速度で運転します。これは、手動調整なしで特定の速度でモーターを運転させたいアプリケーションに最適です。(動画の16:42にて)

ライブプロジェクトデモンストレーション

ビデオでは、改良されたXY-1250コントローラーが小型DCモーターを駆動している様子を見ることができます。デモンストレーションは次のことを示しています:

  • Arduinoに接続されたポテンショメーターでモーターの速度を制御する。
  • モーターを固定の20%スピードに設定するために、toPWM()機能。
  • 速度を50%に上げ、その後80%にして、全範囲の制御を示します。

オシロスコープの読み取り値は、両方のPWM信号が完全に同期しており、2つのチャネル間に位相差がないことを確認しています。これにより、MOSFETが均等に駆動され、不均一な摩耗や過熱が防止されます。(動画の14:56に)

60A-3000W-PWMボード-3

  • [00:00] イントロダクションとプロジェクトの概要
  • XY-1250 PWMコントローラーの動作原理
  • [04:28] オシロスコープで元の信号をテストする
  • [07:02] 555タイマーを孤立させるためにPCBトレースをカットする
  • [10:25] 修正されたモジュールにArduinoを接続する
  • [12:18] Arduinoコードの説明
  • [14:56] ポテンショメーターを使ったモーター制御のデモンストレーション
  • 固定値を用いてプログラム的に速度を制御する
  • [20:32] 最終まとめと締めの言葉

画像

60A 3000W PWM board 2
60A 3000W PWM board 2
60A 3000W PWM board 1
60A 3000W PWM board 1
60A 3000W PWM board 4
60A 3000W PWM board 4
60A 3000W PWM board 3
60A 3000W PWM board 3
Schematic of MOSFET gate in 60A 3000W PWM
Schematic of MOSFET gate in 60A 3000W PWM
60A 3000W red module PCB line cut to work with Arduino
60A 3000W red module PCB line cut to work with Arduino
60A 3000W red module PCB line cut to work with Arduino
60A 3000W red module PCB line cut to work with Arduino
60A 3000W PWM board 7 input wires
60A 3000W PWM board 7 input wires
60A 3000W PWM board 6
60A 3000W PWM board 6
60A 3000W PWM board 0
60A 3000W PWM board 0
196-Code for XY-1250 12-50V 60A PWM to work with Arduino with Potentiometer
言語: C++
/*
 * Modify XY-1250 12-50V 60A PWM to work with Arduino.
get this code and other resouces http://robojax.com/RTJ162
If you want to control it without a potentiometer, see http://robojax.com/RTJ162
 * 
 * Written by Ahmad Shamshiri
 * on Saturday, June 15, 2019 at 16:14
 * in Ajax, Ontario, Canada
 * www.robojax.com
 * Watch the video instruction: https://youtu.be/k13iTmvPtUU
 */
#define pwmPin1 5
#define pwmPin2 6
#define controlPin A0

void setup() {
  pinMode(pwmPin1,OUTPUT);
  pinMode(pwmPin2,OUTPUT);
  Serial.begin(9600);

}

void loop() {
  int potValue = analogRead(controlPin);
  Serial.print(potValue);
  int pwm =map(potValue, 0,1023, 0, 255);
  
  analogWrite(pwmPin1,pwm);
  analogWrite(pwmPin2,pwm);
  Serial.print(" ");  
  Serial.println(pwm);
  delay(500);
}

/*
 * @brief Converts a percentage value from 0 to 100% to 0-255.
 * @param v An integer value representing a percentage from 0-100.
 * @return A value from 0 to 255.
 */
int toPWM(int v){
  return map(v, 0,100,0,255);
}
197-Code for XY-1250 12-50V 60A PWM to work with Arduino
言語: C++
/*
 *  file: PWM_for_XY1260_module_no_pot
 * Modify XY-1250 12-50V 60A PWM to work with Arduino
 * This code allows you to control the motor without a potentiometer. See video for demonstration.
*  resources page for this project https://robojax.com/RTJ162
Watch the video instruction on youTube: https://youtu.be/ZLZr2AZgmPI
 * 
 * How to use:
 * To control speed at 100%
    motorControl(100);  
    delay(3000);//keep it running for 3 seconds
 * To control speed at 400%
    motorControl(40);  
    delay(3000);//keep it running for 3 seconds
 * To stop motor
    motorControl(0); //set zero
    delay(3000);//keep it running for 3 seconds
 * Written by Ahmad Shamshiri
 * on Saturday, January 30, 2021, at 12:49
 * in Ajax, Ontario, Canada
 * www.Robojax.com
 * Watch the video instruction: https://youtu.be/ZLZr2AZgmPI
 */
#define pwmPin1 3
#define pwmPin2 6
bool defaultMotorON = false;// or set to "true" to make the motor start
unsigned int defaultSpeed= 20;//20% set it in % 0=stop, 100=full speed

int toPWM(int);//prototype
void setup() {
  pinMode(pwmPin1,OUTPUT);
  pinMode(pwmPin2,OUTPUT);
  Serial.begin(9600);
  Serial.print("Control XY-1260 without pot");
  if(defaultMotorON){
  analogWrite(pwmPin1,toPWM(defaultSpeed));
  analogWrite(pwmPin2,toPWM(defaultSpeed));    
  }else{
  analogWrite(pwmPin1,0);
  analogWrite(pwmPin2,0);    
  }


}

void loop() {
    motorControl(100);//set speed to 100%
    delay(3000);//keep motor running at 100% for 3 seconds

    motorControl(0);//stops motor
    delay(4000);//keep motor stopped for 4 seconds

    motorControl(45);//set speed to 45%
    delay(3000);//keep motor running at 45% for 3 seconds

    motorControl(0);//stops motor
    delay(4000);//keep motor stopped for 4 seconds    

    //from 0 to 100% with 50 millisecond delay (increasing speed)
      for(int i=0; i<100; i++)
      {
        motorControl(i);//set speed with value of i from 0 to 100
        delay(50);//give motor 50 milliseconds before going to the next value   
      }//for loop end


    motorControl(0);//stops motor 
    delay(4000);//keep motor stopped for 4 seconds    

    //from 100% to 10 with 50 millisecond delay (decreasing speed)
      for(int i=100; i>0; i--)
      {
        motorControl(i);//set speed with value of i from 0 to 100
        delay(50);//give motor 50 milliseconds before going to the next value   
      }//for loop end
      
    motorControl(0);//stops motor 
    delay(4000);//keep motor stopped for 4 seconds   
      
}//loop end

/*
 * @brief converts % value from 0 to 100% to 0-255
 * @param v is integer value representing % from 0-100
 * @return will return value from 0 to 255
 */
int toPWM(int v){
  return map(v, 0,100,0,255);
}//

/*
 * @brief controls the speed of motor with value from 0 to 100%
 * @param speed is integer value representing % from 0-100
 * @return none
 * written January 30, 2021 by Ahmad Shamshiri
 * www.robojax.com
 * 
 */
void motorControl(int speed)
{
  int pwm= map(speed, 0,100,0,255);  
  analogWrite(pwmPin1,pwm);
  analogWrite(pwmPin2,pwm);  
}

必要かもしれないもの

ファイル📁

ファイルは利用できません。