logo
+7 (951) 999-89-94
428003, г. Чебоксары, ул. Федора Гладкова, д.9, оф.319
26.04.2019

Управление двигателем с помощью микросхемы L293D

Управление двигателем с помощью микросхемы L293D

На этом уроке мы используем для управления двигателем микросхему-драйвер L293D.

Компоненты

  • Плата Arduino Uno
  • Макетная плата
  • USB кабель
  • Две АА батарейки
  • Двигатель
  • Драйвер L293D
  • Роторный потенциометр

Схема

Будем использовать выводы платы Uno следующим образом: вывод A0 для считывания положения потенциометра; D9 и D10 для контроля направления вращения двигателя; D11 для генерации ШИМ сигнала, который будет изменять скорость вращения двигателя.

Соединение компонентов

Скетч

Теперь напишем код для управления частотой вращения и направлением вращения двигателя с помощью роторного потенциометра. Когда потенциометр находится в среднем положении, скорость двигателя будет минимальной, а при изменении его положения, скорость будет увеличиваться. Кроме того, если потенциометр отклоняется от среднего положения по часовой стрелке или против часовой стрелки, направление вращения двигателя будет изменяться.

int in1Pin = 10;
int in2Pin = 9;
int enable1Pin = 11;
 
boolean rotationDir;
int rotationSpeed;
 
void setup() { 
  pinMode(in1Pin, OUTPUT); 
  pinMode(in2Pin, OUTPUT); 
  pinMode(enable1Pin, OUTPUT); 
} 
 
void loop() { 
  int potenVal = analogRead(A0);
  rotationSpeed = potenVal - 512; 
  if (potenVal > 512) {
    rotationDir = true;
  } else {
    rotationDir = false;
  }
  rotationSpeed = abs(potenVal - 512); 
  driveMotor(rotationDir,map(rotationSpeed, 0, 512, 0, 255)); 
} 
 
void driveMotor(boolean dir, int spd) { 
  // Control motor rotation direction 
  if (rotationDir) { 
    digitalWrite(in1Pin, HIGH); 
    digitalWrite(in2Pin, LOW); 
  } 
  else { 
    digitalWrite(in1Pin, LOW); 
    digitalWrite(in2Pin, HIGH); 
  } 
  // Control motor rotation speed  
  analogWrite(enable1Pin, constrain(spd, 0, 255)); 
} 

Функция driveMotor() контролирует направление вращения двигателя и его скорость.

void driveMotor(boolean dir, int spd) { 
  // Control motor rotation direction 
  if (rotationDir) { 
    digitalWrite(in1Pin, HIGH); 
    digitalWrite(in2Pin, LOW); 
  } 
  else { 
    digitalWrite(in1Pin, LOW); 
    digitalWrite(in2Pin, HIGH); 
 
  } 
  // Control motor rotation speed 
  analogWrite(enable1Pin, constrain(spd, 0, 255)); 
} 

В функции loop() мы отслеживаем положение роторного потенциометра и меняем скорость вращения двигателя в зависимости от его положения.

void loop() { 
  int potenVal = analogRead(A0);
  rotationSpeed = potenVal - 512; 
  if (potenVal > 512) {
    rotationDir = true;
  } else {
    rotationDir = false;
  }
  rotationSpeed = abs(potenVal - 512); 
  driveMotor(rotationDir, map(rotationSpeed, 0, 512, 0, 255)); 
} 

Функция abs() вычисляет абсолютное значение числа.

Скомпилируйте и загрузите скетч на плату. Далее, меняя положение потенциометра, вы сможете регулировать скорость вращения двигателя.

 

Предыдущий урок | В начало | Следующий урок