Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Драйвер двигателя L298N — интерфейс Arduino, как это работает, коды, схемы

<основной класс="главный сайт" id="главный">

В этом уроке по Arduino мы узнаем, как управлять двигателями постоянного тока с помощью Arduino. Мы рассмотрим некоторые основные методы управления двигателями постоянного тока и приведем два примера, на которых мы научимся управлять двигателями постоянного тока с помощью драйвера двигателя L298N и платы Arduino.

Вы можете посмотреть следующее видео или прочитать письменное руководство ниже.

 

Мы можем управлять скоростью двигателя постоянного тока, просто контролируя входное напряжение двигателя, и наиболее распространенный способ сделать это — использовать сигнал ШИМ.

ШИМ-управление двигателем постоянного тока

ШИМ или широтно-импульсная модуляция — это метод, который позволяет нам регулировать среднее значение напряжения, подаваемого на электронное устройство, путем быстрого включения и выключения питания. Среднее напряжение зависит от рабочего цикла или количества времени, в течение которого сигнал включен, по сравнению с количеством времени, в течение которого сигнал выключен за один период времени.

Таким образом, в зависимости от размера двигателя, мы можем просто подключить выход Arduino PWM к базе транзистора или затвору MOSFET и контролировать скорость двигателя, управляя выходом PWM. ШИМ-сигнал малой мощности Arduino включает и выключает затвор на полевом МОП-транзисторе, через который приводится в действие мощный двигатель.

H-мост управления двигателем постоянного тока

С другой стороны, для управления направлением вращения нам просто нужно изменить направление тока, протекающего через двигатель, и наиболее распространенный способ сделать это — использовать Н-мост. Схема Н-моста содержит четыре переключающих элемента, транзистора или полевого МОП-транзистора, с двигателем в центре, образующим Н-подобную конфигурацию. Активировав два определенных переключателя одновременно, мы можем изменить направление тока, таким образом изменив направление вращения двигателя.

Итак, если мы объединим эти два метода, ШИМ и H-мост, мы сможем полностью контролировать двигатель постоянного тока. Существует множество драйверов двигателей постоянного тока с такими функциями, и L298N — один из них.

Драйвер L298N

L298N — это драйвер двигателей с двойным Н-мостом, который позволяет одновременно управлять скоростью и направлением двух двигателей постоянного тока. Модуль может управлять двигателями постоянного тока с напряжением от 5 до 35 В и пиковым током до 2 А.

Давайте подробнее рассмотрим распиновку модуля L298N и объясним, как он работает. Модуль имеет две винтовые клеммные колодки для двигателей A и B, а также другую винтовую клеммную колодку для контакта заземления, VCC для двигателя и контакт 5 В, который может быть входом или выходом.

Это зависит от напряжения, используемого на двигателях VCC. Модуль имеет встроенный стабилизатор 5 В, который включается или отключается с помощью перемычки. Если напряжение питания двигателя составляет до 12 В, мы можем включить регулятор 5 В, а контакт 5 В можно использовать в качестве выхода, например, для питания нашей платы Arduino. Но если напряжение двигателя выше 12 В, мы должны отключить перемычку, потому что это напряжение приведет к повреждению встроенного регулятора 5 В. В этом случае контакт 5 В будет использоваться в качестве входа, так как нам нужно подключить его к источнику питания 5 В, чтобы микросхема работала правильно.

Здесь мы можем отметить, что эта ИС создает падение напряжения около 2В. Так, например, если мы используем источник питания 12 В, напряжение на клеммах двигателя будет около 10 В, а это означает, что мы не сможем получить максимальную скорость от нашего двигателя постоянного тока 12 В.

Далее идут входы логического управления. Контакты Enable A и Enable B используются для включения и управления скоростью двигателя. Если на этом выводе установлена ​​перемычка, двигатель будет включен и будет работать на максимальной скорости, а если мы уберем перемычку, то сможем подключить к этому выводу ШИМ-вход и таким образом управлять скоростью двигателя. Если мы подключим этот контакт к земле, двигатель будет отключен.

Затем контакты Input 1 и Input 2 используются для управления направлением вращения двигателя A, а входы 3 и 4 — для двигателя B. С помощью этих контактов мы фактически управляем переключателями H-моста внутри микросхемы L298N. Если вход 1 НИЗКИЙ, а вход 2 ВЫСОКИЙ, двигатель будет двигаться вперед, и наоборот, если вход 1 ВЫСОКИЙ, а вход 2 НИЗКИЙ, двигатель будет двигаться назад. Если оба входа совпадают, НИЗКИЙ или ВЫСОКИЙ, двигатель остановится. То же самое относится к входам 3 и 4 и двигателю B.

Драйвер двигателя Arduino и L298N

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

Итак, нам нужен драйвер двигателя L298N, двигатель постоянного тока, потенциометр, кнопка и плата Arduino.

Компоненты, необходимые для этого руководства по Arduino, можно получить по ссылкам ниже:

Код Arduino

Вот код Arduino:

/*  Arduino DC Motor Control - PWM | H-Bridge | L298N  -  Example 01

    by Dejan Nedelkovski, www.HowToMechatronics.com
*/

#define enA 9
#define in1 6
#define in2 7
#define button 4

int rotDirection = 0;
int pressed = false;

void setup() {
  pinMode(enA, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(button, INPUT);
  // Set initial rotation direction
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
}

void loop() {
  int potValue = analogRead(A0); // Read potentiometer value
  int pwmOutput = map(potValue, 0, 1023, 0 , 255); // Map the potentiometer value from 0 to 255
  analogWrite(enA, pwmOutput); // Send PWM signal to L298N Enable pin

  // Read button - Debounce
  if (digitalRead(button) == true) {
    pressed = !pressed;
  }
  while (digitalRead(button) == true);
  delay(20);

  // If button is pressed - change rotation direction
  if (pressed == true  & rotDirection == 0) {
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    rotDirection = 1;
    delay(20);
  }
  // If button is pressed - change rotation direction
  if (pressed == false & rotDirection == 1) {
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    rotDirection = 0;
    delay(20);
  }
}
Code language: Arduino (arduino)

Описание: Итак, сначала нам нужно определить выводы и некоторые переменные, необходимые для программы. В разделе настройки нам нужно установить режимы выводов и начальное направление вращения двигателя. В секции контура мы начинаем со считывания значения потенциометра, а затем сопоставляем полученное с него значение от 0 до 1023 со значением от 0 до 255 для ШИМ-сигнала или со значением рабочего цикла от 0 до 100 %. сигнал ШИМ. Затем, используя функцию AnalogWrite(), мы отправляем сигнал PWM на контакт Enable платы L298N, который фактически приводит в действие двигатель.

Далее мы проверяем, нажали ли мы кнопку, и если это так, то изменим направление вращения мотора, установив состояния Входа 1 и Входа 2 в обратном порядке. Кнопка будет работать как кнопка-переключатель, и каждый раз, когда мы ее нажимаем, она меняет направление вращения двигателя.

Управление роботом-автомобилем Arduino с помощью драйвера двигателя L298N

Итак, как только мы узнали это, теперь мы можем построить нашу собственную роботизированную машину Arduino. Вот принципиальная схема:

Все, что нам нужно, это 2 двигателя постоянного тока, драйвер двигателя L298N, плата Arduino и джойстик для управления. Что касается источника питания, я решил использовать три литий-ионных аккумулятора 3,7 В, что в сумме дает 11 В. Я сделал шасси из клееной фанеры толщиной 3 мм, прикрепил к нему моторы с помощью металлических скоб, к моторам прикрепил колеса, а спереди прикрепил поворотное колесо.

Теперь давайте взглянем на код Arduino и посмотрим, как он работает. (Внизу вы можете найти полный код)

int xAxis = analogRead(A0); // Read Joysticks X-axis
int yAxis = analogRead(A1); // Read Joysticks Y-axisCode language: Arduino (arduino)

После определения контактов в разделе циклов мы начинаем со считывания значений осей X и Y джойстика. Джойстик на самом деле состоит из двух потенциометров, которые подключены к аналоговым входам Arduino и имеют значения от 0 до 1023. Когда джойстик остается в центральном положении, значение обоих потенциометров или осей составляет около 512.

Добавим немного допуска и будем считать значения от 470 до 550 центральными. Таким образом, если мы переместим ось Y джойстика назад и значение упадет ниже 470, мы установим направление вращения двух двигателей назад, используя четыре входных контакта. Затем мы преобразуем уменьшающиеся значения от 470 до 0 в возрастающие значения ШИМ от 0 до 255, что на самом деле является скоростью двигателя.

// Y-axis used for forward and backward control
  if (yAxis < 470) {
    // Set Motor A backward
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    // Set Motor B backward
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    // Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedA = map(yAxis, 470, 0, 0, 255);
    motorSpeedB = map(yAxis, 470, 0, 0, 255);
  }Code language: Arduino (arduino)

Аналогично, если мы переместим ось Y джойстика вперед и значение превысит 550, мы настроим двигатели на движение вперед и преобразуем показания от 550 до 1023 в значения ШИМ от 0 до 255. Если джойстик остается в центре, скорость двигателей будет равна нулю.

Далее давайте посмотрим, как мы используем ось X для левого и правого управления автомобилем.

// X-axis used for left and right control
  if (xAxis < 470) {
    // Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value
    int xMapped = map(xAxis, 470, 0, 0, 255);
    // Move to left - decrease left motor speed, increase right motor speed
    motorSpeedA = motorSpeedA - xMapped;
    motorSpeedB = motorSpeedB + xMapped;
    // Confine the range from 0 to 255
    if (motorSpeedA < 0) {
      motorSpeedA = 0;
    }
    if (motorSpeedB > 255) {
      motorSpeedB = 255;
    }
  }Code language: Arduino (arduino)

Итак, опять же, сначала нам нужно преобразовать показания оси X в значения скорости от 0 до 255. Для движения влево мы используем это значение, чтобы уменьшить скорость левого двигателя и увеличить скорость правого двигателя. Здесь из-за арифметических функций мы используем два дополнительных оператора «если», чтобы ограничить диапазон скорости двигателя от 0 до 255.

Тот же метод используется для перемещения автомобиля вправо.

Связанный: Как сделать ШИМ-регулятор скорости двигателя постоянного тока с помощью микросхемы таймера 555

В зависимости от приложенного напряжения и самого двигателя, на более низких скоростях двигатель не может начать движение и издает жужжащий звук. В моем случае двигатели не могли двигаться, если значение ШИМ-сигнала было ниже 70. Поэтому, используя эти два оператора if, я фактически ограничил диапазон скоростей от 70 до 255. В конце мы просто отправляем конечные скорости двигателя или Сигнал ШИМ на контакты включения драйвера L298N.

// Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70)
  if (motorSpeedA < 70) {
    motorSpeedA = 0;
  }
  if (motorSpeedB < 70) {
    motorSpeedB = 0;
  }
  analogWrite(enA, motorSpeedA); // Send PWM signal to motor A
  analogWrite(enB, motorSpeedB); // Send PWM signal to motor BCode language: Arduino (arduino)

Вот полный код примера автомобиля-робота Arduino:

/*  Arduino DC Motor Control - PWM | H-Bridge | L298N
         Example 02 - Arduino Robot Car Control
    by Dejan Nedelkovski, www.HowToMechatronics.com
*/

#define enA 9
#define in1 4
#define in2 5
#define enB 10
#define in3 6
#define in4 7

int motorSpeedA = 0;
int motorSpeedB = 0;

void setup() {
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
}

void loop() {
  int xAxis = analogRead(A0); // Read Joysticks X-axis
  int yAxis = analogRead(A1); // Read Joysticks Y-axis

  // Y-axis used for forward and backward control
  if (yAxis < 470) {
    // Set Motor A backward
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    // Set Motor B backward
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    // Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedA = map(yAxis, 470, 0, 0, 255);
    motorSpeedB = map(yAxis, 470, 0, 0, 255);
  }
  else if (yAxis > 550) {
    // Set Motor A forward
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    // Set Motor B forward
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    // Convert the increasing Y-axis readings for going forward from 550 to 1023 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedA = map(yAxis, 550, 1023, 0, 255);
    motorSpeedB = map(yAxis, 550, 1023, 0, 255);
  }
  // If joystick stays in middle the motors are not moving
  else {
    motorSpeedA = 0;
    motorSpeedB = 0;
  }

  // X-axis used for left and right control
  if (xAxis < 470) {
    // Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value
    int xMapped = map(xAxis, 470, 0, 0, 255);
    // Move to left - decrease left motor speed, increase right motor speed
    motorSpeedA = motorSpeedA - xMapped;
    motorSpeedB = motorSpeedB + xMapped;
    // Confine the range from 0 to 255
    if (motorSpeedA < 0) {
      motorSpeedA = 0;
    }
    if (motorSpeedB > 255) {
      motorSpeedB = 255;
    }
  }
  if (xAxis > 550) {
    // Convert the increasing X-axis readings from 550 to 1023 into 0 to 255 value
    int xMapped = map(xAxis, 550, 1023, 0, 255);
    // Move right - decrease right motor speed, increase left motor speed
    motorSpeedA = motorSpeedA + xMapped;
    motorSpeedB = motorSpeedB - xMapped;
    // Confine the range from 0 to 255
    if (motorSpeedA > 255) {
      motorSpeedA = 255;
    }
    if (motorSpeedB < 0) {
      motorSpeedB = 0;
    }
  }
  // Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70)
  if (motorSpeedA < 70) {
    motorSpeedA = 0;
  }
  if (motorSpeedB < 70) {
    motorSpeedB = 0;
  }
  analogWrite(enA, motorSpeedA); // Send PWM signal to motor A
  analogWrite(enB, motorSpeedB); // Send PWM signal to motor B
}Code language: Arduino (arduino)

Вот и все для этого урока, и в моем следующем видео мы модернизируем этот робот-автомобиль Arduino, добавив устройства Bluetooth и радио для включения смартфона и беспроводного управления.

Не стесняйтесь задавать любые вопросы в разделе комментариев ниже и не забудьте проверить мою коллекцию проектов Arduino.


Производственный процесс

  1. Как взломать ИК-пульты
  2. Робот-последователь линии
  3. Как связать Arduino Mega с GPS-модулем NEO-6M
  4. Учебная платформа Arduino
  5. Насколько легко использовать термистор ?!
  6. Самодельная рука робота Arduino - управляемая жестами рук
  7. Библиотека управления двигателями постоянного тока
  8. Как сделать мини-плоттер с ЧПУ 2D с помощью DVD-привода для лома, L293D
  9. Вот идея:как работает интерфейс мозг-компьютер
  10. Преимущества двигателей с прямым приводом — что это такое и как это работает.