Ускорение и торможение движения робота
В предыдущем задании мы рассматривали сигналы широтно-импульсной модуляции (ШИМ, 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:
1 2 3 4 |
for (инициализация; условие; выражение) { действия (тело цикла); } |
Конструкция команды используется для повторения блока выражений, заключённых в фигурные скобки заданное число раз.
Наращиваемый счётчик часто используется для увеличения и прекращения цикла. Есть три части, разделённые точкой с запятой, в заголовке цикла for: «инициализация» локальной переменной, или счётчика, имеет место в самом начале и происходит только один раз. При каждом проходе цикла проверяется «условие». Если условие остаётся истинным, то следующее выражение и блок выполняются, а условие проверяется вновь. Когда условие становится ложным, цикл завершается.
Конструкция, позволяющая нам последовательно увеличивать или уменьшать значение ШИМ, включает цикл for (инициализация; условие; приращение) и блок операторов, заключенный в скобки.
1 2 3 4 5 6 |
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), как мы делали ранее,
1 2 3 4 5 6 7 |
void setup() { pinMode (DIR_R, OUTPUT); pinMode (SPEED_R, OUTPUT); pinMode (DIR_L, OUTPUT); pinMode (SPEED_L, OUTPUT); } |
пишем цикл, в котором в качестве переменной i указываем номера пинов.
1 2 3 4 5 |
voidsetup () { for (inti=2; i<=5; i++) { pinMode (i, OUTPUT); } } |
Переходим к практической части задания.
Листинг кода
Скопируйте текст программы и вставьте его в скетч Arduino IDE. После проверки загрузите код в контроллер и включите питание на роботе. Итак, код программы готов, сравните его с тем, что получилось у вас.