Робот-курьер Урок 2.2 Все курсыДля учителяПройти в программе Ученик Arduino Uno + шилд моторов L298P
Тема 2 · Урок 2.2

Повороты и развороты

Робот поворачивает на месте на 90° и разворачивается на 180°. Время поворота подбираешь сам.

2 × 45 мин1–2 ученика на роботаПрактика

Результат урока

Робот поворачивает на 90° налево и направо и разворачивается на 180°. Время поворотов подобрано и записано в бортовой журнал, повороты оформлены функциями.

Ты научишься

  • Объяснить, почему робот крутится на месте, когда колёса вращаются в разные стороны.
  • Подобрать время поворота опытом и проверить его повторением.
  • Написать функции turnLeft(), turnRight() и turnAround().
  • Предсказать, куда приедет робот по последовательности движений.

Нужно знать

  • 2.1 Моторы: едем и останавливаемся

Понадобится

Мотор-редуктор × 2Шилд моторов L298P (Амперка)Батарейный отсек моторов с выключателем

Зачем этот урок

Робот умеет ездить вперёд и назад. Но на поле итоговой задачи нужно сворачивать к грузам и разворачиваться. Сегодня робот научится поворачивать на месте, а ты — подбирать числа опытом, как настоящий инженер.

Разминка · вспомни
  1. Какая команда задаёт направление вращения колеса?
  2. Что будет, если включить моторы и не написать stopMotors()?
  3. Чем описание функции отличается от её вызова?
1
Занятие 1 · 45 мин
Поворот на месте
1

Колёса в разные стороны

10 мин

Что должен делать робот. Курьеру нужно менять направление: повернуть к ответвлению и развернуться для обратной поездки. Поворот получим теми же двумя моторами, без отдельного рулевого механизма.

Что используем и как это работает. Когда колёса проходят разные расстояния, корпус поворачивается. Если одно колесо вращается вперёд, а другое назад, робот разворачивается примерно вокруг середины между колёсами. Функция поворота объединяет направления колёс, время вращения и остановку.

Как связать измерение с действием. В этом уроке угол задаём временем работы моторов. Это приближение: заряд батареи, покрытие и проскальзывание меняют результат. Измерим получившийся угол, подберём время и повторим опыт. Имя turnLeft само по себе не гарантирует 90 градусов — это должна подтвердить проверка.

Предскажи

Левое колесо крутится назад, правое — вперёд с той же скоростью. Что сделает робот? Покажи руками.

  1. Набери скетч L22_Turn_Test и загрузи его при выключенном питании моторов.
Проба поворотаL22_Turn_Test.ino.ino
const int LEFT_DIR_PIN = 7;const int LEFT_SPEED_PIN = 6;const int RIGHT_DIR_PIN = 4;const int RIGHT_SPEED_PIN = 5;const int FORWARD = HIGH;const int BACKWARD = (FORWARD == HIGH) ? LOW : HIGH; int turnSpeed = 100;int turnMs = 400; // подбираем: время поворота на 90° void drive(int leftDir, int leftSpeed, int rightDir, int rightSpeed) {  digitalWrite(LEFT_DIR_PIN, leftDir);  digitalWrite(RIGHT_DIR_PIN, rightDir);  analogWrite(LEFT_SPEED_PIN, leftSpeed);  analogWrite(RIGHT_SPEED_PIN, rightSpeed);} void stopMotors() {  analogWrite(LEFT_SPEED_PIN, 0);  analogWrite(RIGHT_SPEED_PIN, 0);} void setupMotors() {  pinMode(LEFT_DIR_PIN, OUTPUT);  pinMode(LEFT_SPEED_PIN, OUTPUT);  pinMode(RIGHT_DIR_PIN, OUTPUT);  pinMode(RIGHT_SPEED_PIN, OUTPUT);  stopMotors();} void setup() {  setupMotors();  delay(2000);   // Левое колесо назад, правое вперёд: робот крутится на месте налево.  drive(BACKWARD, turnSpeed, FORWARD, turnSpeed);  delay(turnMs);  stopMotors();} void loop() {}
  1. Поставь робота на пол, на лист бумаги. Прочерти карандашом линию вдоль его носа.
  2. Включи питание моторов и нажми Reset.
Должно получиться

Робот крутится на месте налево и останавливается. Нос повернулся, но, скорее всего, не ровно на 90°.

Как это устроено: Почему робот крутится на месте

Колёса толкают робота в разные стороны с одинаковой силой. Вперёд и назад он не едет — он вращается вокруг точки посередине между колёсами. Чем дольше включены моторы, тем больше угол поворота.

Предскажи

Робот должен повернуть налево на месте. Какое колесо должно крутиться вперёд, а какое назад? Запиши до запуска.

  1. Создай скетч L22_Turn_Test по шаблону. Функции drive и stopMotors из урока 2.1 уже есть. Напиши поворот в setup() по своему прогнозу.
Шаблон: проба поворотаL22_Turn_Test_Gaps.ino.ino
// Шаблон среднего уровня. Напиши код в разделе «Твоя часть» по целям в комментариях. const int LEFT_DIR_PIN = 7;const int LEFT_SPEED_PIN = 6;const int RIGHT_DIR_PIN = 4;const int RIGHT_SPEED_PIN = 5;const int FORWARD = HIGH;const int BACKWARD = (FORWARD == HIGH) ? LOW : HIGH;int turnSpeed = 100;int turnMs = 400; // подбираем: время поворота на 90° // ===== Твоя часть: напиши сам ===== void setup() {  setupMotors();  delay(2000);   // Робот крутится на месте налево turnMs миллисекунд и останавливается.} // ===== Готовое из урока 2.1 — не меняй ===== void drive(int leftDir, int leftSpeed, int rightDir, int rightSpeed) {  digitalWrite(LEFT_DIR_PIN, leftDir);  digitalWrite(RIGHT_DIR_PIN, rightDir);  analogWrite(LEFT_SPEED_PIN, leftSpeed);  analogWrite(RIGHT_SPEED_PIN, rightSpeed);} void stopMotors() {  analogWrite(LEFT_SPEED_PIN, 0);  analogWrite(RIGHT_SPEED_PIN, 0);} void setupMotors() {  pinMode(LEFT_DIR_PIN, OUTPUT);  pinMode(LEFT_SPEED_PIN, OUTPUT);  pinMode(RIGHT_DIR_PIN, OUTPUT);  pinMode(RIGHT_SPEED_PIN, OUTPUT);  stopMotors();} void loop() {}
  1. Поставь робота на пол, на лист бумаги. Прочерти карандашом линию вдоль его носа. Включи питание моторов и нажми Reset.
  2. Измени программу так, чтобы робот повернул направо. Проверь.
Подсказка: Робот едет, а не крутится

Если оба колеса крутятся в одну сторону, робот едет. Для поворота на месте нужны разные направления.

Должно получиться

Робот крутится на месте налево, а после твоего изменения — направо. Прогноз проверен.

Требование. В своей программе L21_Moves из урока 2.1 сделай пробу поворота: колёса крутятся в разные стороны с одной скоростью turnSpeed в течение turnMs, потом робот останавливается. Сохрани как L22_Turn_Test.

Исследование: вокруг чего крутится робот.

  1. Положи робота на лист бумаги и обведи карандашом оба колеса.
  2. Запусти поворот и обведи колёса снова. Найди точку, вокруг которой повернулся робот.
  3. Совпадает ли она с серединой между колёсами? Если нет — насколько сантиметров и почему?
Подсказка: Как найти точку поворота

Соедини старое и новое положение каждого колеса. Точка поворота лежит там, где эти положения одинаково далеко.

Должно получиться

Проба поворота работает. В журнале — рисунок, точка поворота и объяснение, почему она там.

2

Подбери время поворота на 90°

20 мин

На поворот 90° нужно какое-то время в миллисекундах. Узнать его можно только опытом.

  1. Начерти на листе две линии под прямым углом (угольник или край тетради).
  2. Поставь робота носом вдоль первой линии. Запусти программу.
  3. Если робот не довернул — увеличь turnMs, если перевернул — уменьши. Меняй понемногу: на 20–50 мс.
  4. Когда поворот получился, повтори его три раза. Запиши время в журнал.
ПопыткаturnMsЧто получилось
1400
2
3
Должно получиться

Робот три раза подряд поворачивает примерно на 90°. Время записано в журнале.

Подсказка: Каждый раз поворачивает по-разному

Проверь, что батарея заряжена: от разряженной моторы крутятся медленнее. Пол должен быть ровным и не скользким. Небольшая разница между попытками — нормально.

На поворот 90° нужно какое-то время в миллисекундах. Узнать его можно только опытом. Как подбирать — реши сам, но меняй только turnMs и записывай каждую попытку.

  1. Начерти на листе две линии под прямым углом. Поставь робота носом вдоль первой.
  2. Подбирай turnMs, пока робот не повернёт на 90°. В журнале — не меньше четырёх попыток и объяснение, почему ты выбрал следующее число.
  3. Когда поворот получился, повтори его три раза.
ПопыткаturnMsЧто получилосьЧто поменять дальше и почему
1
2
3
4
Подсказка: С какого числа начать

Посмотри, сколько повернулся робот в пробе с turnMs = 400. Больше 90° или меньше?

Подсказка: Каждый раз поворачивает по-разному

Проверь, что батарея заряжена, а пол ровный и не скользкий. Небольшая разница между попытками — нормально.

Должно получиться

Робот три раза подряд поворачивает примерно на 90°. В журнале четыре попытки с объяснением и итоговое время.

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

  1. Найди одно время, при котором робот явно не доворачивает, и одно, при котором явно перекручивает. Пробуй середину между ними и сужай промежуток, пока ошибка не станет меньше 5°.
  2. С найденным временем сделай пять поворотов подряд. Для каждого отметь на листе, куда смотрит нос, и измерь транспортиром ошибку в градусах.
  3. Повтори пункт 2 при другой turnSpeed (например, 160). При какой скорости повороты точнее и одинаковее?
  4. Повернёт ли робот направо за то же время? Проверь и запиши.
turnSpeedturnMsОшибки 5 поворотов, °Самая большая ошибка, °
100
160
Подсказка: Как измерить ошибку без транспортира

Сравни отметку носа с линией 90° на расстоянии 10 см от центра поворота: 1 см в сторону — это примерно 6°.

Должно получиться

В журнале — способ поиска, время для двух скоростей, ошибки пяти поворотов и вывод: какую turnSpeed брать и одинаково ли время налево и направо.

3

Разворот на 180°

15 мин
Предскажи

Если на 90° нужно, например, 400 мс, сколько нужно на 180°? Запиши свой прогноз.

  1. Поставь в turnMs своё время, умноженное на 2. Проверь разворот.
  2. Подправь число, если нужно. Запиши время разворота в журнал.
Должно получиться

Робот разворачивается и смотрит в обратную сторону. Время разворота записано.

Как это устроено: Почему ровно в два раза не всегда получается

В начале поворота моторам нужно время, чтобы разогнаться, а в конце робот немного проскальзывает по инерции. Поэтому время на 180° может быть чуть меньше двух поворотов на 90°. Опыт важнее расчёта.

Предскажи

Сколько миллисекунд нужно на разворот на 180°, если ты знаешь своё время на 90°? Запиши прогноз.

  1. Проверь прогноз на полу и подправь число, если нужно. Запиши время разворота.
  2. Ответь в журнале: получилось ровно вдвое больше, чем на 90°? Если нет, как ты это объяснишь?
Подсказка: Почему не ровно вдвое

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

Должно получиться

Робот разворачивается и смотрит в обратную сторону. Время разворота и объяснение записаны.

  1. Предскажи время разворота по своему времени на 90° и проверь на полу. Подбери точное время тем же методом, что и для 90°.
  2. Сравни: во сколько раз время на 180° больше времени на 90°? Объясни в журнале, откуда берётся разница. Назови две причины.
  3. Выведи правило: сколько миллисекунд нужно на один градус при развороте и при повороте на 90°? Какое из чисел точнее подойдёт для поворота на 45°? Проверь.
Должно получиться

Время разворота подобрано. В журнале — сравнение с удвоенным поворотом на 90°, две причины разницы и проверка правила на 45°.

2
Занятие 2 · 45 мин
Функции поворотов
4

Функции поворотов

12 мин
  1. Создай скетч L22_Turns. Впиши свои времена из журнала в turn90Ms и turn180Ms.
Функции поворотовL22_Turns.ino.ino
const int LEFT_DIR_PIN = 7;const int LEFT_SPEED_PIN = 6;const int RIGHT_DIR_PIN = 4;const int RIGHT_SPEED_PIN = 5;const int FORWARD = HIGH;const int BACKWARD = (FORWARD == HIGH) ? LOW : HIGH; int speed = 100;int turnSpeed = 100;int turn90Ms = 400;  // впиши своё время из журналаint turn180Ms = 800; // впиши своё время из журнала void drive(int leftDir, int leftSpeed, int rightDir, int rightSpeed) {  digitalWrite(LEFT_DIR_PIN, leftDir);  digitalWrite(RIGHT_DIR_PIN, rightDir);  analogWrite(LEFT_SPEED_PIN, leftSpeed);  analogWrite(RIGHT_SPEED_PIN, rightSpeed);} void stopMotors() {  analogWrite(LEFT_SPEED_PIN, 0);  analogWrite(RIGHT_SPEED_PIN, 0);} void setupMotors() {  pinMode(LEFT_DIR_PIN, OUTPUT);  pinMode(LEFT_SPEED_PIN, OUTPUT);  pinMode(RIGHT_DIR_PIN, OUTPUT);  pinMode(RIGHT_SPEED_PIN, OUTPUT);  stopMotors();} void forward(int ms) {  drive(FORWARD, speed, FORWARD, speed);  delay(ms);  stopMotors();} void turnLeft() {  drive(BACKWARD, turnSpeed, FORWARD, turnSpeed);  delay(turn90Ms);  stopMotors();} void turnRight() {  drive(FORWARD, turnSpeed, BACKWARD, turnSpeed);  delay(turn90Ms);  stopMotors();} void turnAround() {  drive(BACKWARD, turnSpeed, FORWARD, turnSpeed);  delay(turn180Ms);  stopMotors();} void setup() {  setupMotors();  delay(2000);   for (int i = 0; i < 4; i++) {    forward(1000);    delay(300);    turnLeft();    delay(300);  }} void loop() {}
  1. Найди разницу между turnLeft() и turnRight(). Что поменялось местами?
Должно получиться

Программа проверяется без ошибок. Ты можешь объяснить, чем отличаются функции поворота.

  1. Создай скетч L22_Turns по шаблону. Впиши свои времена из журнала в turn90Ms и turn180Ms.
  2. Напиши turnLeft, turnRight, turnAround и квадрат в setup() сам. Функция forward из урока 2.1 уже есть — пользуйся ей как образцом.
Шаблон: функции поворотовL22_Turns_Gaps.ino.ino
// Шаблон среднего уровня. Напиши код в разделе «Твоя часть» по целям в комментариях. const int LEFT_DIR_PIN = 7;const int LEFT_SPEED_PIN = 6;const int RIGHT_DIR_PIN = 4;const int RIGHT_SPEED_PIN = 5;const int FORWARD = HIGH;const int BACKWARD = (FORWARD == HIGH) ? LOW : HIGH;int speed = 100;int turnSpeed = 100;int turn90Ms = 400;  // впиши своё время из журналаint turn180Ms = 800; // впиши своё время из журнала // ===== Твоя часть: напиши сам ===== void turnLeft() {  // Поворот на месте налево на 90° по времени turn90Ms; в конце колёса стоят.} void turnRight() {  // Поворот на месте направо на 90° по времени turn90Ms; в конце колёса стоят.} void turnAround() {  // Разворот на месте на 180° по времени turn180Ms; в конце колёса стоят.} void setup() {  setupMotors();  delay(2000);   // Квадрат: четыре раза — вперёд 1 секунду, пауза, поворот налево, пауза.} // ===== Готовое из урока 2.1 — не меняй ===== void drive(int leftDir, int leftSpeed, int rightDir, int rightSpeed) {  digitalWrite(LEFT_DIR_PIN, leftDir);  digitalWrite(RIGHT_DIR_PIN, rightDir);  analogWrite(LEFT_SPEED_PIN, leftSpeed);  analogWrite(RIGHT_SPEED_PIN, rightSpeed);} void stopMotors() {  analogWrite(LEFT_SPEED_PIN, 0);  analogWrite(RIGHT_SPEED_PIN, 0);} void setupMotors() {  pinMode(LEFT_DIR_PIN, OUTPUT);  pinMode(LEFT_SPEED_PIN, OUTPUT);  pinMode(RIGHT_DIR_PIN, OUTPUT);  pinMode(RIGHT_SPEED_PIN, OUTPUT);  stopMotors();} void forward(int ms) {  drive(FORWARD, speed, FORWARD, speed);  delay(ms);  stopMotors();} void loop() {}
  1. Нажми Проверить.
Подсказка: Чем отличаются повороты

Сравни свою пробу поворота: какие колёса и в какую сторону крутятся налево, а какие — направо? А при развороте?

Подсказка: Четыре раза

Повторить одно и то же четыре раза помогает цикл for из урока 1.1.

Должно получиться

Программа проверяется без ошибок. Ты можешь объяснить, чем отличаются функции поворота.

Требование. Продолжи свою программу L21_Moves из урока 2.1 и сохрани как L22_Turns:

  • turnLeft(), turnRight(), turnAround() — повороты на 90° и разворот по твоим временам, каждый заканчивается остановкой;
  • времена — именованные переменные в начале скетча; если в шаге подбора время налево и направо получилось разным, у каждого поворота своя переменная;
  • направление и скорость колёс задаёт только drive;
  • в setup() — квадрат для следующего шага: четыре раза «вперёд 1 секунду, налево».
Подсказка: Идея (1 из 2)

Поворот — это drive с колёсами в разные стороны, ожидание и остановка.

Подсказка: Фрагмент кода (2 из 2)

drive(BACKWARD, turnSpeed, FORWARD, turnSpeed); — так робот крутится налево. Что поменять для поворота направо?

Должно получиться

Программа выполняет требование и проверяется без ошибок.

5

Квадрат

18 мин
Предскажи

Программа повторяет 4 раза: «вперёд 1 секунду, налево». Где окажется робот в конце и куда будет смотреть? Нарисуй путь в журнале.

  1. Отметь старт скотчем. Запусти программу на полу.
  2. Сравни, где робот остановился, с прогнозом.
  3. Насколько робот не доехал до старта? Запиши.
Должно получиться

Робот проезжает квадрат и возвращается близко к старту, носом в ту же сторону.

Найди ошибку · Квадрат превратился в линию

У соседей робот едет вперёд, крутится, но квадрат не получается: он ездит туда-обратно. В их turnLeft() стоит delay(turn180Ms). Что не так?

Предскажи

Программа повторяет 4 раза: «вперёд 1 секунду, налево». Нарисуй путь в журнале. Где окажется робот в конце и куда будет смотреть?

  1. Отметь старт скотчем. Запусти программу на полу три раза.
  2. Каждый раз измерь, на сколько сантиметров робот не доехал до старта, и на сколько градусов примерно повёрнут его нос.
  3. Объясни в журнале, почему ошибка в конце больше, чем ошибка одного поворота.
Должно получиться

Три заезда с замерами и объяснение накопления ошибки.

Найди ошибку · Квадрат превратился в линию

У соседей робот едет вперёд, крутится, но квадрат не получается: он ездит туда-обратно. В их turnLeft() стоит delay(turn180Ms). Что не так?

  1. Запусти квадрат три раза. Каждый раз измерь, насколько робот промахнулся мимо старта (в сантиметрах) и насколько повёрнут нос (в градусах).
  2. Оцени ошибку одного поворота: раздели ошибку направления в конце на четыре. Совпадает ли она с ошибкой, которую ты мерил при подборе времени?
  3. Что сильнее портит квадрат: ошибка поворотов или увод на прямой? Как это проверить отдельным опытом? Проведи его и запиши вывод.
Найди ошибку · Квадрат превратился в линию

У соседей робот едет вперёд, крутится, но квадрат не получается: он ездит туда-обратно. В их turnLeft() стоит delay(turn180Ms). Что не так?

Должно получиться

Замеры трёх квадратов, оценка ошибки одного поворота и опыт, который показал главную причину промаха.

6

Задания по уровням

15 мин
Основное · Поворот и разворот

Робот поворачивает налево и направо на 90° и разворачивается на 180° по твоим временам.

Средний уровень · Разворот обратно на линию

Наклей на пол полоску изоленты. Поставь робота на неё, сделай разворот на 180°. Робот должен снова стоять вдоль полоски, а нос — уходить от неё не дальше её ширины. Так разворот будет работать в итоговой задаче.

Продвинутый уровень · Поворот на любой угол

Напиши функцию turn(int degrees): положительный угол — налево, отрицательный — направо. Время считай как degrees × msPerDegree, где msPerDegree = turn90Ms / 90. Проверь на 45°, 90° и 180°. Где точность хуже всего и почему?

Проверь себя

Проверь себя

Выберите ответы для подготовки. Они не сохраняются и не оцениваются на сайте. Пройдите проверку знаний в программе курса или обсудите ответы с преподавателем.

● Основное

1.Левое колесо крутится вперёд, правое — назад с той же скоростью. Что делает робот?
2.Робот не доворачивает до 90°. Что изменить?
3.Почему время поворота подбирают опытом, а не берут из учебника?
4.Программа: 4 раза «вперёд, налево». Где окажется робот?
5.Батарея разрядилась. Что, скорее всего, случится с поворотами по времени?

★ Средний уровень

1.Разворот на 180° длится 900 мс, но робот немного недоворачивает. Что сделать?
2.Зачем проверять разворот на полоске изоленты?
3.При turnMs = 400 робот повернул на 70°. Какое число попробовать следующим?
4.Почему разворот на 180° может длиться не ровно вдвое дольше поворота на 90°?
5.Чем turnRight() отличается от turnLeft()?

★★ Продвинутый уровень

1.turn90Ms = 600. Сколько миллисекунд займёт turn(45), если msPerDegree = turn90Ms / 90?
2.Как функция turn(int degrees) понимает, куда поворачивать?
3.Ошибки пяти поворотов: при turnSpeed = 100 — +4°, −6°, +5°, −3°, +2°; при 160 — +1°, −2°, +2°, 0°, −1°. Какую скорость выбрать?
4.При 300 мс робот явно не доворачивает, при 500 мс — явно перекручивает. Что попробовать дальше?
5.turn90Ms = 400. Для 45° по коэффициенту из 90° вышло 200 мс, а робот повернул только на 35°. Почему?

Отвечай на вопросы своего уровня. Нужно верных ответов: Начальный — 4 из 5; Средний — 4 из 5; Продвинутый — 4 из 5. Ответы проверит преподаватель или программа курса.

Итог

Робот поворачивает по времени, которое ты подобрал опытом. Это простой способ, но он зависит от батареи и пола. В уроке 4.2 робот научится поворачивать точнее — по датчикам: крутиться, пока не найдёт новую линию.

Как подтвердить результат

Для каждого опыта сохраняй условия, версию программы, наблюдение и вывод. Сравнивая попытки, меняй одну причину за раз; неудачные попытки тоже остаются в журнале. Отметка результата относится к уже выполненным действиям, повторять их ради отметки не нужно. Если результат не получен, запиши расхождение и следующую проверяемую гипотезу. Модель, измерения настоящего робота и объяснение — разные виды доказательств.

Словарь урока

поворот на местеКолёса крутятся в разные стороны, и робот вращается вокруг середины между колёсами.
калибровкаПодбор числа по опыту: например, сколько миллисекунд нужно на поворот 90°.
погрешностьНасколько результат отличается от нужного: например, робот повернул на 85° вместо 90°.