前回はリレーを使用してモーターをコントロールする方法を学びました。
今回はモータードライバを使用してコントロールする方法を学びましょう。
モータードライバ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);
}
モーターの制御ができると、プログラムを作った感が出てきますね!
次回はサーボをコントロールしてみましょう!
コメント