Управление двигателем постоянного тока с применением драйвера l298n и arduino uno

Как подключить моторчик к Arduino

Для занятия нам понадобятся следующие детали:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • мотор постоянного тока (Motor DC);
  • транзистор полевой/биполярный;
  • драйвер двигателей L298N;
  • провода «папа-папа», «папа-мама».

Перед выбором способа управления двигателем от Arduino Uno r3, уточните на какое напряжение рассчитан ваш моторчик. Если питание требуется более 5 Вольт, то следует использовать транзистор или драйвер. Распиновка транзисторов может отличаться от приведенного примера (следует уточнить распиновку для своего типа). Драйвер L298N позволит не только включать мотор, но и изменять направление вращения.

Скетч. Подключение мотора напрямую

Управление двигателем постоянного тока с применением драйвера l298n и arduino uno
Схема. Управление моторчиком от Ардуино напрямую Подключение мотора к Ардуино напрямую — самый простой вариант включения вентилятора на Arduino или машинки. Команда для включения двигателя не отличается, от команды при подключении светодиода к микроконтроллеру. Функция digitalWrite включает/выключает подачу напряжения на цифровой порт, к которому подключен двигатель постоянного тока. Соберите схему и загрузите программу.

void setup() { pinMode(12, OUTPUT); // объявляем пин 12 как выход } void loop() { digitalWrite(12, HIGH); // включаем мотор delay(1000); // ждем 1 секунду digitalWrite(12, LOW); // выключаем мотор delay(1000); // ждем 1 секунду }

Пояснения к коду:

  1. для подключения мотора без драйвера можно использовать любой порт;
  2. если двигатель не включается, то, возможно, не хватает силы тока на цифровом выходе, подключите двигатель через транзистор к порту 3,3V или 5V.

Скетч. Подключение мотора через транзистор

Подключение мотора через транзистор к Ардуино потребуется, если двигатель никак не хочет включаться от платы напрямую, то следует использовать порт 5 Вольт на микроконтроллере или внешний источник питания. Транзистор будет играть роль ключа, замыкая/размыкая электрическую цепь. Сам транзистор управляется цифровым портом. Соберите схему, как на картинке и загрузите программу.

Управление двигателем постоянного тока с применением драйвера l298n и arduino uno
Подключение FA-130 мотора постоянного тока — Motor DC Arduino void setup() { pinMode(13, OUTPUT); // объявляем пин 13 как выход } void loop() { digitalWrite(13, HIGH); // включаем мотор delay(1000); // ждем 1 секунду digitalWrite(13, LOW); // выключаем мотор delay(1000); // ждем 1 секунду }

Пояснения к коду:

  1. при необходимости можно подключить два мотора FA-130 к Ардуино;
  2. в зависимости от характеристик, двигатель подключается к 3,3 или 5 Вольтам.

Скетч. Подключение мотора через драйвер

Управление двигателем постоянного тока с применением драйвера l298n и arduino uno
Схема подключения двух моторов через драйвер l298n Подключение мотора к Ардуино через драйвер L298N или Motor Shield L293D позволит менять направление вращения ротора. Но для использования данных модулей потребуется установить соответствующие библиотеки для Ардуино. В примере мы использовали схему подключения двигателя с помощью модуля L298N. Соберите схему, как на картинке ниже и загрузите следующий скетч с использованием.

// задаем имена для портов #define IN1 3 #define IN2 4 #define IN3 5 #define IN4 6 void setup() { pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); } void loop() { // вращаем моторчики в одну сторону digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); delay(2000); // ждем 2 секунды digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); delay(1000); // выключаем на 1 секунду // вращаем моторчики в обратную сторону digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); delay(2000); // ждем 2 секунды digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); delay(1000); // выключаем на 1 секунду }

Stepper.h library example code for L298N driver with stepper motor and Arduino

You can upload the following example code to your Arduino using the Arduino IDE.

This example uses the Stepper.h library, which should come pre-installed with the Arduino IDE. You can find it by going to Sketch > Include Library > Stepper.

This sketch turns the stepper motor 1 revolution in one direction, pauses, and then turns 1 revolution in the other direction.

/* Example sketch to control a stepper motor with L298N motor driver, Arduino UNO and Stepper.h library. More info: https://www.makerguides.com */

// Include the Stepper library:
#include <Stepper.h>

// Define number of steps per revolution:
const int stepsPerRevolution = 200;

// Initialize the stepper library on pins 8 through 11:
Stepper myStepper = Stepper(stepsPerRevolution, 8, 9, 10, 11);

void setup() {
  // Set the motor speed (RPMs):
  myStepper.setSpeed(100);
}

void loop() {
  // Step one revolution in one direction:
  myStepper.step(200);

  delay(2000);

  // Step on revolution in the other direction:
  myStepper.step(-200);

  delay(2000);
}

How the code works:

The sketch starts by including the Stepper.h Arduino library. More information about this library can be found on the Arduino website.

// Include the Stepper library:
#include <Stepper.h>

Next we need to define how many steps it takes for the motor to rotate 1 revolution. n this example we will be using the motor in full-step mode. This means it takes 200 steps to rotate 360 degrees. You can change this value if you want if you are using a different type of stepper motor or setup.

// Define number of steps per revolution:
const int stepsPerRevolution = 200;

After this, you need to create a new instance of the Stepper class, which represents a particular stepper motor connected to the Arduino. For this we use the function  where steps is the number of steps per revolution and pin1 through pin4 are the pins used to drive the stepper motor. In our case these are pins 8, 9, 10 and 11.

// Initialize the stepper library on pins 8 through 11:
Stepper myStepper = Stepper(stepsPerRevolution, 8, 9, 10, 11);

In this case I called the stepper motor ‘myStepper’ but you can use other names as well, like ‘z_motor’ or ‘liftmotor’ etc. . The name ‘myStepper’ will be used to set the speed and number of steps for this particular motor. Note that you can create multiple stepper objects with different names if you want to control more than one motor.

In the  we define the speed of the motor. You can set the speed of the motor in RPM with the function . I set it to 100, so we should see around 1.6 revolutions per second.

  // Set the motor speed (RPMs):
  myStepper.setSpeed(100);

In the loop section of code, we simply call the  function which turns the motor a specific number of steps at a speed determined by the  function. Passing a negative number to this function reverses the spinning direction of the motor.

void loop() {
  // Step one revolution in one direction:
  myStepper.step(200);

  delay(2000);

  // Step on revolution in the other direction:
  myStepper.step(-200);

  delay(2000);
}

Note that the step(steps) function is blocking, this means it will wait until the motor has finished moving to pass control to the next line in your sketch.

Популярные статьи  Логические модули logo! для промышленной автоматизации

Готовый программный код для управления Motor Shield L293D

Для работы датчика на Arduino нужно скачать и установить библиотеку AFMotor .

Скачать библиотеку можно здесь .

После того, как мы скачали нужную библиотеку, ее нужно правильно установить. Скачанные файлы нужно переместить по следующему пути :

Диск C Progtam Files Arduino Libraries

Управление двигателем постоянного тока с применением драйвера l298n и arduino uno

После того, как мы все сделали перейдем к самой важной ступеньке, а именно к программированию. Мы рассмотрим два программных кода с подключением одного и нескольких электродвигателей к L293D

Рассмотрим два случая для того, чтобы вы увидели тонкости и особенности этого программного кода.

Мы рассмотрим два программных кода с подключением одного и нескольких электродвигателей к L293D . Рассмотрим два случая для того, чтобы вы увидели тонкости и особенности этого программного кода..

Для начала рассмотрим подключение одного мотора к Motor Shield L293D и Arduino.

#include // Подключаем библиотеку для работы с шилдом int i; AF_DCMotor motor1(1);// Подключаем моторы к клеммникам M1 void setup() { motor1.setSpeed(255);// Задаем максимальную скорость вращения моторов motor1.run(RELEASE); } void loop() { motor1.run(FORWARD); // Задаем движение вперед motor1.setSpeed(255); // Задаем скорость движения delay(3000); //Указываем время движения motor1.run(RELEASE); // Останавливаем двигатели delay(500); // Указываем время задержки motor1.run(BACKWARD); // Задаем движение назад motor1.setSpeed(255); // Задаем скорость движения delay(3000); // Указываем время движения motor1.run(RELEASE); // Останавливаем двигатели delay(500); // Указываем время задержки // Разгоняем двигатели в одном направлении от нулевой скорости, до максимальной motor1.run(FORWARD); for (i=0; i<255; i++) { motor1.setSpeed(i); delay(10); } motor1.run(RELEASE); // Останавливаем двигатели delay(500); // Указываем время задержки motor1.run(BACKWARD);// Разгоняем двигатели в обратном направлении for (i=255; i>=0; i—) { motor1.setSpeed(i); delay(10); } motor1.run(RELEASE); // Останавливаем двигатели delay(500); // Указываем время задержки }

Перейдем ко второму коду, для управления уже несколькими электромоторами.

#include // Подключаем библиотеку для работы с шилдом int i; AF_DCMotor motor1(1);// Подключаем моторы к клеммникам M1 AF_DCMotor motor2(2);// Подключаем моторы к клеммникам M2 AF_DCMotor motor3(3);// Подключаем моторы к клеммникам M3 AF_DCMotor motor4(4);// Подключаем моторы к клеммникам M4 void setup() { motor1.setSpeed(255);// Задаем максимальную скорость вращения моторов motor1.run(RELEASE); motor2.setSpeed(255); motor2.run(RELEASE); motor3.setSpeed(255); motor3.run(RELEASE); motor4.setSpeed(255); motor4.run(RELEASE); } void loop() { motor1.run(FORWARD); motor1.setSpeed(255); motor2.run(FORWARD); motor2.setSpeed(255); motor3.run(FORWARD); motor3.setSpeed(255); motor4.run(FORWARD); motor4.setSpeed(255); delay(3000); //Указываем время движения motor1.run(RELEASE); // Останавливаем двигатели motor2.run(RELEASE); motor3.run(RELEASE); motor4.run(RELEASE); delay(500); // Указываем время задержки motor1.run(BACKWARD); // Задаем движение назад motor1.setSpeed(255); // Задаем скорость движения motor2.run(BACKWARD); motor2.setSpeed(255); motor3.run(BACKWARD); motor3.setSpeed(255); motor4.run(BACKWARD); motor4.setSpeed(255); delay(3000); // Указываем время движения motor1.run(RELEASE); // Останавливаем двигатели motor2.run(RELEASE); motor3.run(RELEASE); motor4.run(RELEASE); delay(500); // Указываем время задержки // Разгоняем двигатели в одном направлении от нулевой скорости, до максимальной motor1.run(FORWARD); motor2.run(FORWARD); motor3.run(FORWARD); motor4.run(FORWARD); for (i=0; i<255; i++) { motor1.setSpeed(i); motor2.setSpeed(i); motor3.setSpeed(i); motor4.setSpeed(i); delay(10); } motor1.run(RELEASE); // Останавливаем двигатели motor2.run(RELEASE); motor3.run(RELEASE); motor4.run(RELEASE); delay(500); // Указываем время задержки motor1.run(FORWARD); // Разгоняем двигатели в обратном направлении motor2.run(FORWARD); motor3.run(FORWARD); motor4.run(FORWARD); for (i=255; i>=0; i—) { motor1.setSpeed(i); motor2.setSpeed(i); motor3.setSpeed(i); motor4.setSpeed(i); delay(10); } motor1.run(RELEASE); // Останавливаем двигатели motor2.run(RELEASE); motor3.run(RELEASE); motor4.run(RELEASE); delay(500); // Указываем время задержки }

Wiring Diagram

Управление двигателем постоянного тока с применением драйвера l298n и arduino uno

Image is developed using Fritzing. Click to enlarge image

※ NOTE THAT:

  • Please keep all three jumpers on the L298N module in place (in case motor’s power supply ≤ 12V)

  • Order of the pins on stepper motors may vary between manufacturers. Please check the below table for correct wiring.

Wiring table between L298N Driver and Stepper motor

Important!: Please do not care about the wire order of the stepper motor on the above wiring diagram image. It is just an example. The order of the pins on stepper motors may vary between manufacturers. Make sure that your wiring follows the below table.

L298N pins Stepper motor pins Or Or
OUT1 A+ A A
OUT2 A- A C
OUT3 B+ B B
OUT4 B- B D

Before buying a stepper motor, we would recommend you check the check datasheet, specification, or manual of the stepper motor. Make sure that they provide the mapping between the pin’s color and name. For example, This stepper motor provides the mapping as below image:

Управление двигателем постоянного тока с применением драйвера l298n и arduino uno

Based on that mapping, the wiring table becomes:

L298N pins stepper motor pins wire color
OUT1 A black wire
OUT2 C green wire
OUT3 B red wire
OUT4 D blue wire

Полезная информация

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

Мы специально взяли слабый по току блок питания (9V, 600 мА), чтобы наглядно показать просадку напряжения. Наблюдайте за светодиодом и вы все увидите сами.

P.S. Мы использовали танковую платформу, учитывая что мотор крутит редуктор и гусеницы, то для его запуска требуется приличный ток. При замерах оказалось, что при резком запуске одного мотора, кратковременный скачок тока составил порядка 0.7- 0.9A (при номинальном 0.2A), а при включении сразу двух моторов до 1.8A. При плавном разгоне мы фиксировали редкие скачки тока до 0.3А. Об эффективности плавного разгона судите сами.

Continuous rotation AccelStepper example code

The following sketch can be used to run one or more stepper motors continuously at a constant speed. (No acceleration or deceleration is used).

/* Example sketch to control a stepper motor with L298N motor driver, Arduino UNO and AccelStepper.h library. Contiuous rotation. More info: https://www.makerguides.com */

// Include the AccelStepper library:
#include <AccelStepper.h>

// Define the AccelStepper interface type:
#define MotorInterfaceType 4

// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(MotorInterfaceType, 8, 9, 10, 11);

void setup() {
  // Set the maximum speed in steps per second:
  stepper.setMaxSpeed(1000);
}

void loop() {
  // Set the speed of the motor in steps per second:
  stepper.setSpeed(500);
  // Step the motor with constant speed as set by setSpeed():
  stepper.runSpeed();
}

How the code works:

The first step is to include the library with .

// Include the AccelStepper library:
#include <AccelStepper.h>

The next step is to define the motor interface type. The motor interface type must be set to 4 when using a 4 wire stepper motor in full-step mode (200 steps/revolution). You can find the other interface types .

The statement  is used to give a name to a constant value. The compiler will replace any references to this constant with the defined value when the program is compiled. So everywhere you mention , the compiler will replace it with the value 4 when the program is compiled.

// Define the AccelStepper interface type:
#define MotorInterfaceType 4

Next, you need to create a new instance of the AccelStepper class with the appropriate motor interface type and connections.

Популярные статьи  Почему светодиодный светильник продолжает тускло светиться при выключенном двухклавишном выключателе?

In this case I called the stepper motor ‘stepper’ but you can use other names as well, like ‘z_motor’ or ‘liftmotor’ etc. . As you saw in the previous example, the name that you give to the stepper motor will be used later to set the speed, position, and acceleration for that particular motor. You can create multiple instances of the AccelStepper class with different names and pins. This allows you to easily control 2 or more stepper motors at the same time.

// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(MotorInterfaceType, 8, 9, 10, 11);

In the  section of the code we define the maximum speed in steps/second. Speeds of more than 1000 steps per second can be unreliable, so I set this as the maximum. Note that I specify the name of the stepper motor (‘stepper’), for which I want to define the maximum speed. If you have multiple stepper motors connected, you can specify a different speed for each motor:

void setup() {
  // Set the maximum speed in steps per second:
  stepper.setMaxSpeed(1000);
  stepper2.setMaxSpeed(300);
}

In the  we first set the speed that we want the motor to run at. For this, we use the function . (you can also place this in the setup section of the code).

 polls the motor and when a step is due executes 1 step. This depends on the set speed and the time since the last step. If you want to change the direction of the motor, you can set a negative speed:  turns the motor the other way.

void loop() {
  // Set the speed of the motor in steps per second:
  stepper.setSpeed(500);
  // Step the motor with constant speed as set by setSpeed():
  stepper.runSpeed();
}

Контакты контроля направления вращения

Используя контакты IN1-IN4, можно менять направление вращения электромоторов (различные уровни напряжения на этих контактах приводят к замыканию нужных пар ключей Н-Моста драйвера L298N) — по часовой стрелке или в обратном направлении.

Контакты IN1 IN2 управляют направлением вращение первого электоромотора (А), IN3 IN4 — второго электромотора (В) Направление вращения моторов зависит от того, какой уровень напряжения (высокий или низкий) подаётся на эти контакты.

Возможно 4 варианта:

  • Низкий уровень напряжения на обоих контактах — мотор выключен
  • Высокий уровень напряжения на обоих контактах — мотор выключен
  • In1 высокий уровень, In2 низкий уровень — мотор вращается вперёд
  • Ln1 низкий уровень, In 2 высокий уровень — мотор вращается назад

Исходный код программы

По умолчанию все необходимые заголовочные файлы подключаются автоматически самой средой ARDUINO IDE, она же конфигурирует сама и все регистры, необходимые для работы ШИМ, поэтому нам в программе уже не нужно заботиться об этих вещах. Все что нам нужно будет сделать – это определить на каком контакте мы будем использовать ШИМ.

То есть для использования ШИМ на нужном контакте нам необходимо сделать следующие вещи:

Сначала мы должны выбрать один из доступных 6 выходов (контактов) ШИМ. Потом необходимо установить этот контакт в режим на вывод данных.

После этого мы должны задействовать функции ШИМ на этом выходе используя функцию “analogWrite(pin, value)”. Здесь ‘pin’ обозначает номер контакта, на котором мы будем использовать ШИМ, в нашем случае это будет 3-й контакт.

Value в этой функции представляет собой цикл занятости (коэффициент заполнения) ШИМ, оно может принимать значения от 0 (всегда выключено) до 255 (всегда включено). Мы будем увеличивать и уменьшать это значение с помощью кнопок, присутствующих на схеме.

Плата Arduino UNO имеет максимальное разрешение (разрешающую способность) ШИМ, равную 8, что означает что value в функции analogWrite(pin, value) может принимать значения от 0 до 255. Но если в этом есть необходимость, мы можем уменьшать разрешение ШИМ используя функцию “analogWriteResolution()”, в скобках которой мы можем записать число в диапазоне 4-8, которое и будет определять разрешающую способность ШИМ платы Arduino UNO.

Переключатель на схеме служит для изменения направления вращения двигателя.

А теперь непосредственно сам код программы с комментариями.

Arduino

volatile int i=0; // инициализируем переменную целого типа для увеличения и уменьшения коэффициента заполнения ШИМ
void setup()
{
pinMode(3, OUTPUT); // устанавливаем pin3 на вывод данных
pinMode(0, INPUT); // устанавливаем pin0 на ввод данных
pinMode(1, INPUT); // устанавливаем pin1 на ввод данных
}

void loop()
{
analogWrite(3, i); // analogWrite values from 0 to 255
if (digitalRead(0)==LOW)
{
if (i<255) //если первая кнопка нажата (подключенная к pin0) и коэффициент заполнения ШИМ (i) меньше чем 255
{
i++;
delay(30);
}
}
if (digitalRead(1)==LOW)
{
if (i>0) // если вторая кнопка нажата (подключенная к pin1) и коэффициент заполнения ШИМ (i) больше 0
{
i—;
delay(30);
}
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

volatileinti=;// инициализируем переменную целого типа для увеличения и уменьшения коэффициента заполнения ШИМ      

voidsetup()

{

pinMode(3,OUTPUT);// устанавливаем pin3 на вывод данных

pinMode(,INPUT);// устанавливаем pin0 на ввод данных

pinMode(1,INPUT);// устанавливаем pin1 на ввод данных

}

voidloop()

{

analogWrite(3,i);// analogWrite values from 0 to 255

if(digitalRead()==LOW)

{

if(i<255)//если первая кнопка нажата (подключенная к pin0) и коэффициент заполнения ШИМ (i) меньше чем 255

{

i++;

delay(30);

}

}

if(digitalRead(1)==LOW)

{

if(i>)// если вторая кнопка нажата (подключенная к pin1) и коэффициент заполнения ШИМ (i) больше 0

{

i—;

delay(30);

}

}

}

Подключение шагового двигателя к Ардуино

Подключение будет рассмотрено на примере униполярного двигателя 28BYj-48 и драйверов L298 и ULN2003. В качестве платы будет использоваться Arduino Uno.

Управление двигателем постоянного тока с применением драйвера l298n и arduino unoПодключение шагового двигателя к Ардуино

Еще один вариант схемы с использованием L298:

Управление двигателем постоянного тока с применением драйвера l298n и arduino unoПодключение шагового двигателя к Ардуино на базе L298

Схема подключения на базе ULN2003 изображена на рисунке ниже. Управляющие выходы с драйвера IN1-IN4 подключаются к любым цифровым контактам на Ардуино. В данном случае используются цифровые контакты 8-11. Питание подключается к 5В. Также для двигателя желательно использовать отдельный источник питания, чтобы не перегрелась плата Ардуино.

Управление двигателем постоянного тока с применением драйвера l298n и arduino uno Подключение шагового двигателя к Ардуино

Принципиальная схема подключения.

Управление двигателем постоянного тока с применением драйвера l298n и arduino uno Принципиальная схема подключения шагового двигателя

Еще одна схема подключения биполярного шагового двигателя Nema17 через драйвер L298 выглядит следующим образом.

Управление двигателем постоянного тока с применением драйвера l298n и arduino uno

L298N, Arduino и двигатель постоянного тока

Данный модуль дает возможность управлять одним или двумя двигателями постоянного тока. Для начала, подключите двигатели к пинам A и B на контроллере L298N.

Если вы используете в проекте несколько двигателей, убедитесь, что у них выдержана одинаковая полярность при подключении. Иначе, при задании движения, например, по часовой стрелке, один из них будет вращаться в противоположном направлении. Поверьте, с точки зрения программирования Arduino это неудобно.

Популярные статьи  Подрозетники для деревянного дома

После этого подключите источник питания. Плюс — к четвертому пину на L298N, минус (GND) — к 5 пину. Если ваш источник питания до 12 вольт, коннектор, отмеченный 3 на рисунке выше, можно оставить. При этом будет возможность использовать 5 вольтовый пин 6 с модуля.

Данный пин можно использовать для питания Arduino. При этом не забудьте подключить пин GND с микроконтроллера к 5 пину на L298N для замыкания цепи. Теперь вам понадобится 6 цифровых пинов на Arduino. Причем некоторые пины должны поддерживать ШИМ-модуляцию.

ШИМ-пины обозначены знаком “~” рядом с порядковым номером.

Теперь подключите цифровые пины Arduino к драйверу. В нашем примере два двигателя постоянного тока, так что цифровые пины D9, D8, D7 и D6 будут подключены к пинам IN1, IN2, IN3 и IN4 соответственно. После этого подключите пин D10 к пину 7 на L298N (предварительно убрав коннектор) и D5 к пину 12 (опять таки, убрав коннектор).

Направление вращения ротора двигателя управляется сигналами HIGH или LOW на каждый привод (или канал). Например, для первого мотора, HIGH на IN1 и LOW на IN2 обеспечит вращение в одном направлении, а LOW и HIGH заставит вращаться в противоположную сторону.

При этом двигатели не будут вращаться, пока не будет сигнала HIGH на пине 7 для первого двигателя или на 12 пине для второго. Остановить их вращение можно подачей сигнала LOW на те же указанные выше пины. Для управления скоростью вращения используется ШИМ-сигнал.

Скетч приведенный ниже, отрабатывает в соответствии со схемой подключения, которую мы рассматривали выше. Двигатели постоянного тока и Arduino питаются от внешнего источника питания.

// подключите пины контроллера к цифровым пинам Arduino

// первый двигатель

int enA = 10;

int in1 = 9;

int in2 = 8;

// второй двигатель

int enB = 5;

int in3 = 7;

int in4 = 6;

void setup()

{

// инициализируем все пины для управления двигателями как outputs

pinMode(enA, OUTPUT);

pinMode(enB, OUTPUT);

pinMode(in1, OUTPUT);

pinMode(in2, OUTPUT);

pinMode(in3, OUTPUT);

pinMode(in4, OUTPUT);

}

void demoOne()

{

// эта функция обеспечит вращение двигателей в двух направлениях на установленной скорости

// запуск двигателя A

digitalWrite(in1, HIGH);

digitalWrite(in2, LOW);

// устанавливаем скорость 200 из доступного диапазона 0~255

analogWrite(enA, 200);

// запуск двигателя B

digitalWrite(in3, HIGH);

digitalWrite(in4, LOW);

// устанавливаем скорость 200 из доступного диапазона 0~255

analogWrite(enB, 200);

delay(2000);

// меняем направление вращения двигателей

digitalWrite(in1, LOW);

digitalWrite(in2, HIGH);

digitalWrite(in3, LOW);

digitalWrite(in4, HIGH);

delay(2000);

// выключаем двигатели

digitalWrite(in1, LOW);

digitalWrite(in2, LOW);

digitalWrite(in3, LOW);

digitalWrite(in4, LOW);

}

void demoTwo()

{

// эта функция обеспечивает работу двигателей во всем диапазоне возможных скоростей

// обратите внимание, что максимальная скорость определяется самим двигателем и напряжением питания

// ШИМ-значения генерируются функцией analogWrite()

// и зависят от вашей платы управления

// запускают двигатели

digitalWrite(in1, LOW);

digitalWrite(in2, HIGH);

digitalWrite(in3, LOW);

digitalWrite(in4, HIGH);

// ускорение от нуля до максимального значения

for (int i = 0; i < 256; i++)

{

analogWrite(enA, i);

analogWrite(enB, i);

delay(20);

}

// торможение от максимального значения к минимальному

for (int i = 255; i >= 0; —i)

{

analogWrite(enA, i);

analogWrite(enB, i);

delay(20);

}

// теперь отключаем моторы

digitalWrite(in1, LOW);

digitalWrite(in2, LOW);

digitalWrite(in3, LOW);

digitalWrite(in4, LOW);

}

void loop()

{

demoOne();

delay(1000);

demoTwo();

delay(1000);

}

Драйвер двигателя в проектах ардуино

Для чего нужен драйвер двигателя?

Как известно, плата ардуино имеет существенные ограничения по силе тока присоединенной к ней нагрузки. Для платы это 800 mA, а для каждого отдельного вывода – и того меньше, 40mA. Мы не можем подключить напрямую к Arduino Uno, Mega или Nano даже самый маленький двигатель постоянного тока. Любой из этих двигателей в момент запуска или остановки создаст пиковые броски тока, превышающие этот предел.

Как же тогда подключить двигатель к ардуино? Есть несколько вариантов действий:

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

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

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

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

Микросхема или плата расширения Motor Shield

Motor Shield – плата расширения для Ардуино, которая обеспечивает работу двигателей постоянного тока и шаговых двигателей. Самыми популярными платами Motor Shield являются схемы на базе чипов L298N и L293D, которые могут управлять несколькими двигателями. На плате установлен комплект сквозных колодок Ардуино Rev3, позволяющие устанавливать другие платы расширения. Также на плате имеется возможность выбора источника напряжения – Motor Shield может питаться как от Ардуино, так и от внешнего источника. На плате имеется светодиод, который показывает, работает ли устройство. Все это делает использование драйвера очень простым и надежным – не нужно самим изобретать велосипеды и решать уже кем-то решенные проблемы. В этой статье мы будем говорить именно о шилдах.

Принцип действия H-моста

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

Схема моста изображена на рисунке. Q1…Q4 0 полевые, биполярные или IGBT транзисторы. Последние используются в высоковольтных сетях. Биполярные транзисторы практически не используются, они могут присутствовать в маломощных схемах. Для больших токов берут полевые транзисторы с изолированным затвором. Ключи не должны быть замкнуты вместе одновременно, чтобы не произошло короткого замыкания источника. Диоды D1…D4 ограничительные, обычно используются диоды Шоттки.

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

Q1 Q2 Q3 Q4 Состояние
1 1 Поворот мотора вправо
1 1 Поворот мотора влево
Свободное вращение
1 1 Торможение
1 1 Торможение
1 1 Короткое замыкание
1 1 Короткое замыкание

Оцените статью
( Пока оценок нет )
Добавить комментарий