Задание 5. Ускорение и торможение движения робота.
В предыдущем задании мы рассматривали сигналы широтно-импульсной модуляции (ШИМ, PWM). С помощью сигналов ШИМ мы можем плавно увеличивать и уменьшать скорость движения робота.
Описание команды analogWrite
Команда analogWrite (pin, value) записывает значение, используя схему с широтно-импульсной модуляцией (ШИМ, PWM), на выходной вывод, помеченный как PWM. Смотрите карту выводов.
На модуле Arduino с микропроцессором ATmega168 (328) эта функция работает на выводах 3, 5, 6, 9, 10 и 11. Значение может быть задано как переменная или константа в диапазоне 0–255. Значение 0 генерирует устойчивое напряжение 0 вольт на выходе заданного вывода; значение 255 генерирует 5 вольт на выходе заданного вывода. Для значений между 0 и 255 вывод быстро переходит от 0 к 5 вольтам: чем больше значение, тем чаще вывод в состоянии HIGH (5 вольт).
Например, на диаграмме действующих значений, представленной здесь выше, при значении 64 вывод будет в 0 три четверти времени, а в состоянии 5 вольт – одну четверть; при значении 128 половину времени будет вывод будет в 0, а половину – в 5 вольт; при значении 192 четверть времени вывод будет в 0 и три четверти – в 5 вольт.
Описание конструкции for
Для организации ветвления необходимо воспользоваться оператором for:
for (инициализация; условие; выражение)
{
действия (тело цикла);
}
Конструкция команды используется для повторения блока выражений, заключённых в фигурные скобки заданное число раз.
Наращиваемый счётчик часто используется для увеличения и прекращения цикла. Есть три части, разделённые точкой с запятой, в заголовке цикла for: «инициализация» локальной переменной, или счётчика, имеет место в самом начале и происходит только один раз. При каждом проходе цикла проверяется «условие». Если условие остаётся истинным, то следующее выражение и блок выполняются, а условие проверяется вновь. Когда условие становится ложным, цикл завершается.
Конструкция, позволяющая нам последовательно увеличивать или уменьшать значение ШИМ, включает цикл for (инициализация; условие; приращение) и блок операторов, заключенный в скобки.
for (int i = 40; i < 255; i++)
{
analogWrite (SPEED_R, i);
analogWrite (SPEED_L, i);
delay(50);
}
Эта запись означает следующее:
К целочисленной переменной i, которая вначале равна 40 прибавляется единичка 1 (i++), пока её значение меньше либо равно 255. При каждом значении переменной i будут выполняться операции, записанные в фигурных скобках (тело цикла). Значение ШИМ, читай напряжение на моторе, каждый цикл продолжительностью 50 миллисекунд от значения 40 будет возрастать до значения 255. Каждый раз в цикле проверяется условие i<255. Если условие верно, то выполняется блок операторов и приращение значения i. Затем условие проверяется вновь. Когда логическое значение условия становится ложным, цикл завершается. В результате наш робот начинает двигаться с постоянной максимальной скоростью.
Торможение робота
Точно так же будет происходить и уменьшение скорости.
for (inti = 255; i > 0; i--)
Цикл for мы можем использовать так же и для записи однотипных команд. В блоке setup нам необходимо пины 2,3,4,5 определить как выходы (OUTPUT). И вместо команды для каждого пина (pin), как мы делали ранее,
void setup()
{
pinMode (DIR_R, OUTPUT);
pinMode (SPEED_R, OUTPUT);
pinMode (DIR_L, OUTPUT);
pinMode (SPEED_L, OUTPUT);
пишем цикл, в котором в качестве переменной i указываем номера пинов.
voidsetup () {
for (inti=2; i<=5; i++) {
pinMode (i, OUTPUT);
}
}
Переходим к практической части задания.
Листинг кода здесь.
Скопируйте текст программы и вставьте его в скетч Arduino IDE. После проверки загрузите код в контроллер и включите питание на роботе. Итак, код программы готов.
Файл загрузки Arduino IDE здесь, сравните его с тем, что получилось у вас.
Материал подготовил методист Разумов Ю. И.