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

Мастерство управления двигателями через L298N: схема, PWM, H-мост и код для Arduino

Принципы управления DC-двигателем

Скорость — ШИМ (PWM): быстрое включение/выключение питания, среднее напряжение зависит от скважности. Arduino выдаёт ШИМ на транзистор/МОПТ, который коммутирует мощную нагрузку.

Мастерство управления двигателями через L298N: схема, PWM, H-мост и код для Arduino
Мастерство управления двигателями через L298N: схема, PWM, H-мост и код для Arduino
Мастерство управления двигателями через L298N: схема, PWM, H-мост и код для Arduino

Направление — H-мост: 4 ключа, изменение полярности на двигателе. Комбинация двух ключей задаёт направление тока.

Мастерство управления двигателями через L298N: схема, PWM, H-мост и код для Arduino

L298N — двойной H-мост с входом EN для ШИМ. Два канала, 5–35 В, до 2 А на канал. На плате: клеммники моторов, питание (VCC, GND, 5V), джампер 5V стабилизатора (если моторы ≤12 В — 5V выход для Arduino, иначе джампер снять, подать 5В отдельно). Напряжение на моторах на ~2 В ниже входного.

Мастерство управления двигателями через L298N: схема, PWM, H-мост и код для Arduino
Мастерство управления двигателями через L298N: схема, PWM, H-мост и код для Arduino
Мастерство управления двигателями через L298N: схема, PWM, H-мост и код для Arduino

Пример 1: потенциометр скорости + кнопка реверса

Мастерство управления двигателями через L298N: схема, PWM, H-мост и код для Arduino
/* DC Motor Control - PWM | H-Bridge | L298N - Example 01 */
#define enA 9
#define in1 6
#define in2 7
#define button 4
int rotDirection = 0;
bool pressed = false;

void setup() {
  pinMode(enA, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(button, INPUT);
  digitalWrite(in1, LOW); digitalWrite(in2, HIGH); // начальное направление
}
void loop() {
  int potValue = analogRead(A0);
  int pwmOutput = map(potValue, 0, 1023, 0, 255);
  analogWrite(enA, pwmOutput);

  // Антидребезг кнопки
  if (digitalRead(button)) { pressed = !pressed; }
  while (digitalRead(button)); delay(20);

  if (pressed && rotDirection==0) { digitalWrite(in1,HIGH); digitalWrite(in2,LOW); rotDirection=1; delay(20); }
  if (!pressed && rotDirection==1) { digitalWrite(in1,LOW); digitalWrite(in2,HIGH); rotDirection=0; delay(20); }
}

Пример 2: Arduino Robot Car (джойстик + два мотора)

Мастерство управления двигателями через L298N: схема, PWM, H-мост и код для Arduino
Мастерство управления двигателями через L298N: схема, PWM, H-мост и код для Arduino

Джойстик: два потенциометра на A0 (X), A1 (Y). Центр ~512. Мёртвая зона 470–550.

Логика управления

Полный код робота

/* Arduino Robot Car Control using L298N */
#define enA 9; #define in1 4; #define in2 5;
#define enB 10; #define in3 6; #define in4 7;
int motorSpeedA=0, 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);
  int yAxis = analogRead(A1);

  // Y-axis: forward/backward
  if (yAxis < 470) {
    digitalWrite(in1,HIGH); digitalWrite(in2,LOW);
    digitalWrite(in3,HIGH); digitalWrite(in4,LOW);
    motorSpeedA = map(yAxis,470,0,0,255);
    motorSpeedB = map(yAxis,470,0,0,255);
  } else if (yAxis > 550) {
    digitalWrite(in1,LOW); digitalWrite(in2,HIGH);
    digitalWrite(in3,LOW); digitalWrite(in4,HIGH);
    motorSpeedA = map(yAxis,550,1023,0,255);
    motorSpeedB = map(yAxis,550,1023,0,255);
  } else { motorSpeedA=0; motorSpeedB=0; }

  // X-axis: left/right
  if (xAxis < 470) {
    int xMapped = map(xAxis,470,0,0,255);
    motorSpeedA -= xMapped; motorSpeedB += xMapped;
    if (motorSpeedA<0) motorSpeedA=0; if (motorSpeedB>255) motorSpeedB=255;
  }
  if (xAxis > 550) {
    int xMapped = map(xAxis,550,1023,0,255);
    motorSpeedA += xMapped; motorSpeedB -= xMapped;
    if (motorSpeedA>255) motorSpeedA=255; if (motorSpeedB<0) motorSpeedB=0;
  }

  // Anti-buzzing
  if (motorSpeedA<70) motorSpeedA=0;
  if (motorSpeedB<70) motorSpeedB=0;

  analogWrite(enA, motorSpeedA);
  analogWrite(enB, motorSpeedB);
}

Перспективы

В следующем уроке этот робот получим беспроводное управление (Bluetooth, NRF24L01, HC-12). Все схемы, коды и файлы проектов открыты.

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

  1. Создание универсального ИК-пульта на Arduino: пошаговое руководство
  2. Автономный линий-следующий робот на Arduino UNO
  3. Подключение Arduino Mega к GPS-модулю NEO‑6M: пошаговое руководство
  4. Учебный стенд Arduino Mega 2560: сенсоры, моторы, дисплеи и собственная PCB
  5. Использование термистора: пошаговое руководство для Arduino
  6. DIY манипулятор, управляемый жестами руки: пошаговая сборка на Arduino
  7. Высокопроизводительная библиотека Arduino для управления двигателями постоянного тока
  8. Мини CNC 2D плоттер из старых DVD-приводов на L293D Motor Shield
  9. Мозг-компьютерные интерфейсы: восстановление связи мысли и действия
  10. Моторы прямого привода: преимущества, типы и принципы работы