Регулировка скорости движения.
Метод широтно импульсной модуляции (ШИМ, англ. pulse-width modulation (PWM)) широко применяется для управления мощностью, подводимой к нагрузке, путём изменения скважности импульсов, при постоянной частоте.
Если на выходе устройства, генерирующего ШИМ сигнал установить фильтр низких частот (ФНЧ), то уровень постоянного напряжения на выходе фильтра будет определяться скважностью импульсов ШИМ. Фильтр не пропускает несущую частоту ШИМ. На выходе фильтра формируется сигнал с постоянной составляющей. Сам фильтр может состоять из простейшей интегрирующей RC цепи.
В нашем случае нагрузкой является электродвигатель. Он достаточно инерционен. Поэтому не требуется дополнительных фильтров.
Таким образом, управляя длительностью «единицы» и «ноля» мы получаем необходимое нам значение аналогового сигнала, а в нашем случае напряжение питания электромотора.
Основным достоинством ШИМ-управления является то, что электронный ключ (обычно транзистор) работает в ключевом режиме, что заметно повышает экономичность схемы, так как потери на активных элементах сводятся к минимуму.
В схеме управления электромотором с помощью ШИМ сигнала параллельно мотору необходимо устанавливать диод для защиты транзистора Q1 от индукционных всплесков, появляющимся в момент выключения и включения. Благодаря использованию диода, индукционный импульс разряжается через него и внутреннее сопротивление двигателя, защищая тем самым транзистор.
Для сглаживания всплесков питания между клеммами мотора, можно подключить конденсатор небольшой емкости (100nF). Это снизит помехи, создаваемые частыми переключениями транзистора Q1.
В контроллере Arduino есть специальные контакты, которые могут формировать сигнал с широтно-импульсной модуляцией. Это D3, D5, D6, D9, D11.
В блоке R-5 пины D3, D5 подключены к входам драйвера, отвечающих за регулировку скорости вращения электромоторов. Соответственно, вызвав функцию analogWrite() мы сможем изменять действующее значение напряжения питания электромоторов и соответственно изменять скорость движения робота.
Пишем код.
Пример 1. УСКОРЕНИЕ.
Последовательно увеличиваем значение ШИМ. С увеличением значения ШИМ скорость движения робота увеличивается.
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#define DIR_R 2
#define SPEED_R 3
#define DIR_L 4
#define SPEED_L 5
void setup()
{
pinMode (DIR_R, OUTPUT);
pinMode (SPEED_R, OUTPUT);
pinMode (DIR_L, OUTPUT);
pinMode (SPEED_L, OUTPUT);
}
void loop()
{
digitalWrite (DIR_R, HIGH);
analogWrite (SPEED_R, 0); // Значение ШИМ равно нулю, двигатель не вращается
digitalWrite (DIR_L, HIGH);
analogWrite (SPEED_L, 0);
delay(1000); // пауза 1 сек.
digitalWrite (DIR_R, HIGH);
analogWrite (SPEED_R, 70); // Значение ШИМ 70. Скорость низкая
digitalWrite (DIR_L, HIGH);
analogWrite (SPEED_L, 100);
delay(2000);
digitalWrite (DIR_R, HIGH);
analogWrite (SPEED_R, 170); // Значение ШИМ 170. Скорость выше
digitalWrite (DIR_L, HIGH);
analogWrite (SPEED_L, 170);
delay(2000);
digitalWrite (DIR_R, HIGH);
analogWrite (SPEED_R, 255); // Значение ШИМ 255. Скорость максимальная
digitalWrite (DIR_L, HIGH);
analogWrite (SPEED_L, 255);
delay(2000);
}
|
Скопируйте текст программы и вставьте его в Arduino IDE.
После проверки загрузите код в контроллер. Установите контроллер в блок R-5 и включите питание робота.
Пример 2. ЗМЕЙКА.
Попеременно устанавливаем разное значение ШИМ для правого и левого колес. Соответственно колеса будут вращаться с разной скоростью, и наш робот будет двигаться змейкой.
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
29
30
31
32
33
|
#define DIR_R 2
#define SPEED_R 3
#define DIR_L 4
#define SPEED_L 5
void setup()
{
pinMode (DIR_R, OUTPUT);
pinMode (SPEED_R, OUTPUT);
pinMode (DIR_L, OUTPUT);
pinMode (SPEED_L, OUTPUT);
}
void loop()
{
digitalWrite (DIR_R, HIGH);
analogWrite (SPEED_R, 0);
digitalWrite (DIR_L, HIGH);
analogWrite (SPEED_L, 0);
delay(1000); // пауза 1 сек.
digitalWrite (DIR_R, HIGH);
analogWrite (SPEED_R, 100);
digitalWrite (DIR_L, HIGH);
analogWrite (SPEED_L, 255);
delay(1000);
digitalWrite (DIR_R, HIGH);
analogWrite (SPEED_R, 255);
digitalWrite (DIR_L, HIGH);
analogWrite (SPEED_L, 100);
delay(1000);
}
|
Пример 3. УСКОРЕНИЕ. ТОРМОЖЕНИЕ.
С помощью сигналов ШИМ мы можем плавно увеличивать и уменьшать скорость движения робота. Для этого нам необходимо воспользоваться оператором
for.
Конструкция, позволяющая нам последовательно увеличивать или уменьшать значение ШИМ, включает цикл
for (initialization; condition; increment) и блок операторов, заключенный в скобки.
for (int i = 40; i < 255; i++)
{
analogWrite (SPEED_R, i);
analogWrite (SPEED_L, i);
delay(50);
}
Инициализация (Initialization) выполняется самой первой и один раз. Каждый раз в цикле проверяется
условие (condition), если оно верно, выполняется блок операторов и
приращение (increment), затем условие проверяется вновь. Когда логическое значение условия становится ложным, цикл завершается.
Эта запись означает следующее:
К целочисленной переменной
i, которая вначале равна 40 прибавляется
1 (i++), пока её значение меньше либо равно
255. При каждом значении переменной
i будут выполняться операции, записанные в фигурных скобках (тело цикла). Т.е. значение ШИМ каждые
50 мили секунд от значения
40 будет возрастать до значения
255. Каждый раз в цикле проверяется условие
i<255. Если условие, верно, то выполняется блок операторов и приращение значения
i. Затем условие проверяется вновь. Когда логическое значение условия становится ложным, цикл завершается. И наш робот начинает двигаться с постоянной максимальной скоростью.
Точно так же будет происходить и уменьшение скорости.
for (int i = 255; i > 0; i--)
Цикл
for мы можем использовать так же и для записи однотипных команд. В блоке
setup нам необходимо пины 2,3,4,5 определить, как выходы. И вместо команды для каждого пина, как мы делали ранее,
void setup()
{
pinMode (DIR_R, OUTPUT);
pinMode (SPEED_R, OUTPUT);
pinMode (DIR_L, OUTPUT);
pinMode (SPEED_L, OUTPUT);
пишем цикл, в котором в качестве переменной
i указываем номера пинов.
void setup () {
for (int i=2; i<=5; i++) {
pinMode (i, OUTPUT);
}
}
Пишем итоговый код.
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
29
30
31
32
33
34
|
#define DIR_R 2
#define SPEED_R 3
#define DIR_L 4
#define SPEED_L 5
void setup () {
for (int i=2; i<=5; i++) {
pinMode (i, OUTPUT);
}
// укажем, что изначально моторы остановлены
digitalWrite (SPEED_R, LOW);
digitalWrite (SPEED_L, LOW);
}
void loop()
{
digitalWrite (DIR_R, HIGH);
digitalWrite (DIR_L, HIGH);
for (int i = 40; i < 255; i++)
{
analogWrite (SPEED_R, i);
analogWrite (SPEED_L, i);
delay(50);
}
for (int i = 255; i > 0; i--)
{
analogWrite (SPEED_R, i);
analogWrite (SPEED_L, i);
delay(50);
}
digitalWrite (SPEED_R, LOW);
digitalWrite (SPEED_L, LOW);
delay(1000);
}
|