Project 17.2 モータードライバ/Control Motor with Potentiometer

前回はリレーを使用してモーターをコントロールする方法を学びました。

あわせて読みたい
Project 17.1 リレーとモーター制御/Relay & Motor 前回は2つのシフトレジスタを使用してドットマトリクスLEDのコントロール方法を学びました。 https://kaneshige.org/?p=461 今回はリレーを使用してモーターをコントロ...

今回はモータードライバを使用してコントロールする方法を学びましょう。

目次

モータードライバL293Dについて

L293Dは、4つのモーター駆動ポートを持つICチップ(集積回路チップ)です。4つのポートを使用して単方向DCモーターを1台、2つのポートを使用して双方向DCモーターを1台、またはステッピングモーター(このチュートリアルでは後述)を1台駆動することができます。

L293DでDCモータを駆動する場合、一般的に2つの接続オプションがあります。以下の接続オプションはL293Dの1チャネルを使用し、PWM制御でモータ速度を制御することができます。ただし、この方法ではモータは一方向しか回転できません。

以下の接続ではL293Dの2つのチャンネルを使います。一つのチャンネルはPWM波を出力し、もう一つのチャンネルはGNDに接続します。これにより、モーターの速度制御が可能になります。さらに、この2つのチャンネルの信号を入れ替えることで、モーターの速度だけでなく、回転方向(舵取り)も制御することができます。

実際に使用する場合、通常はモーターをチャネル1と2に接続します。その際、in1とin2に異なるレベルを出力することでモーターの回転方向を制御し、Enable1ピンにPWM波を出力することでモーターの回転速度を制御します。同様に、モーターをチャネル3と4に接続し、 in3とin4 に異なるレベルを出力してモーターの回転方向を制御すると共に、 Enable2 ピンに PWM 波を出力することで、モーターの回転速度を制御することもできます。

回路図

この回路を接続する際には、DCモーターは高出力の部品であるため、細心の注意を払ってください。ESP32-S3から供給される電力でモーターを直接駆動しないでください。ESP32-S3に回復不可能な損傷を与える可能性があります。ロジック回路は、ESP32-S3の電源または外部電源から電力を供給することができますが、必ずESP32-S3 と共通のグランド(GND)を共有する必要があります。

接続図

コード

/**********************************************************************
  Filename    : Control_Motor_by_L293D
  Description : Use PWM to control the direction and speed of the motor.
  Auther      : www.freenove.com
  Modification: 2022/10/25
**********************************************************************/
int in1Pin = 13;      // Define L293D channel 1 pin
int in2Pin = 14;      // Define L293D channel 2 pin
int enable1Pin = 12;  // Define L293D enable 1 pin
int channel = 0;

boolean rotationDir;  // Define a variable to save the motor's rotation direction
int rotationSpeed;    // Define a variable to save the motor rotation speed

void setup() {
  Serial.begin(115200);
  // Initialize the pin into an output mode:
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
  pinMode(enable1Pin, OUTPUT);
  
  ledcSetup(channel,1000,11);         //Set PWM to 11 bits, range is 0-2047
  ledcAttachPin(enable1Pin,channel);
}

void loop() {
  int potenVal = analogRead(A0);      // Convert the voltage of rotary potentiometer into digital
  //Compare the number with value 2048, 
  //if more than 2048, clockwise rotates, otherwise, counter clockwise rotates
  rotationSpeed = potenVal - 2048;
  if (potenVal > 2048)
    rotationDir = true;
  else
    rotationDir = false;
  // Calculate the motor speed
  rotationSpeed = abs(potenVal - 2048);
  //Control the steering and speed of the motor
  Serial.println(rotationSpeed);
  delay(100);
  driveMotor(rotationDir, constrain(rotationSpeed,0,2048));
}

void driveMotor(boolean dir, int spd) {
  // Control motor rotation direction
  if (dir) {
    digitalWrite(in1Pin, HIGH);
    digitalWrite(in2Pin, LOW);
  }
  else {
    digitalWrite(in1Pin, LOW);
    digitalWrite(in2Pin, HIGH);
  }
  // Control motor rotation speed
  ledcWrite(channel, spd);
}

PWMの精度を11ビットに設定し、0から2047までの範囲でモーターの回転速度を制御します。

  ledcSetup(channel,1000,11);         //Set PWM to 11 bits, range is 0-2047

ESP32-S3のADCは12ビットの精度を持ち、0から4095までの値を取ることができます。このプログラムでは、中間の値として2048を設定します。ADC値が2048より小さい場合はモーターを一方向に回転させ、2048より大きい場合は他の方向に回転させます。また、ADC値から2048を引いた値の絶対値をモーターの回転速度として使用します。

  if (potenVal > 2048)
    rotationDir = true;
  else
    rotationDir = false;

driveMotor()関数は、モータの回転方向と速度を制御するために使用されます。dir は方向を表し、spd は速度を表します。dirは上記のrotationDirの値を渡しています。

void driveMotor(boolean dir, int spd) {
  // Control motor rotation direction
  if (dir) {
    digitalWrite(in1Pin, HIGH);
    digitalWrite(in2Pin, LOW);
  }
  else {
    digitalWrite(in1Pin, LOW);
    digitalWrite(in2Pin, HIGH);
  }
  // Control motor rotation speed
  ledcWrite(channel, spd);
}

モーターの制御ができると、プログラムを作った感が出てきますね!

次回はサーボをコントロールしてみましょう!

あわせて読みたい
Project 18.1 サーボの首振り/Servo Sweep 前回はモータードライバについて学びました。 https://kaneshige.org/?p=481 今回はサーボの首振りを試してみましょう。 【サーボモーターとは】 サーボモーターは、DC...
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

金重総合研究所の主席研究員。
子供の頃から研究者を目指し、ライフワークとして日々様々な研究をしています。
経営・マネジメント・金融・DXあたりが本職です。
私を採用したい人、私と一緒に働きたい人、一緒に知識を肥やしていきたい人はぜひお声がけ下さい。

コメント

コメントする

目次