Повороты и развороты
Робот поворачивает на месте на 90° и разворачивается на 180°. Время поворота подбираешь сам.
Результат урока
Робот поворачивает на 90° налево и направо и разворачивается на 180°. Время поворотов подобрано и записано в бортовой журнал, повороты оформлены функциями.
Ты научишься
- Объяснить, почему робот крутится на месте, когда колёса вращаются в разные стороны.
- Подобрать время поворота опытом и проверить его повторением.
- Написать функции turnLeft(), turnRight() и turnAround().
- Предсказать, куда приедет робот по последовательности движений.
Нужно знать
- 2.1 Моторы: едем и останавливаемся
Понадобится
Зачем этот урок
Робот умеет ездить вперёд и назад. Но на поле итоговой задачи нужно сворачивать к грузам и разворачиваться. Сегодня робот научится поворачивать на месте, а ты — подбирать числа опытом, как настоящий инженер.
- Какая команда задаёт направление вращения колеса?
- Что будет, если включить моторы и не написать
stopMotors()? - Чем описание функции отличается от её вызова?
Колёса в разные стороны
10 минЧто должен делать робот. Курьеру нужно менять направление: повернуть к ответвлению и развернуться для обратной поездки. Поворот получим теми же двумя моторами, без отдельного рулевого механизма.
Что используем и как это работает. Когда колёса проходят разные расстояния, корпус поворачивается. Если одно колесо вращается вперёд, а другое назад, робот разворачивается примерно вокруг середины между колёсами. Функция поворота объединяет направления колёс, время вращения и остановку.
Как связать измерение с действием. В этом уроке угол задаём временем работы моторов. Это приближение: заряд батареи, покрытие и проскальзывание меняют результат. Измерим получившийся угол, подберём время и повторим опыт. Имя turnLeft само по себе не гарантирует 90 градусов — это должна подтвердить проверка.
Левое колесо крутится назад, правое — вперёд с той же скоростью. Что сделает робот? Покажи руками.
- Набери скетч
L22_Turn_Testи загрузи его при выключенном питании моторов.
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() {}
- Поставь робота на пол, на лист бумаги. Прочерти карандашом линию вдоль его носа.
- Включи питание моторов и нажми Reset.
Робот крутится на месте налево и останавливается. Нос повернулся, но, скорее всего, не ровно на 90°.
Как это устроено: Почему робот крутится на месте
Колёса толкают робота в разные стороны с одинаковой силой. Вперёд и назад он не едет — он вращается вокруг точки посередине между колёсами. Чем дольше включены моторы, тем больше угол поворота.
Робот должен повернуть налево на месте. Какое колесо должно крутиться вперёд, а какое назад? Запиши до запуска.
- Создай скетч
L22_Turn_Testпо шаблону. ФункцииdriveиstopMotorsиз урока 2.1 уже есть. Напиши поворот вsetup()по своему прогнозу.
// Шаблон среднего уровня. Напиши код в разделе «Твоя часть» по целям в комментариях. 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() {}
- Поставь робота на пол, на лист бумаги. Прочерти карандашом линию вдоль его носа. Включи питание моторов и нажми Reset.
- Измени программу так, чтобы робот повернул направо. Проверь.
Подсказка: Робот едет, а не крутится
Если оба колеса крутятся в одну сторону, робот едет. Для поворота на месте нужны разные направления.
Робот крутится на месте налево, а после твоего изменения — направо. Прогноз проверен.
Требование. В своей программе L21_Moves из урока 2.1 сделай пробу поворота: колёса крутятся в разные стороны с одной скоростью turnSpeed в течение turnMs, потом робот останавливается. Сохрани как L22_Turn_Test.
Исследование: вокруг чего крутится робот.
- Положи робота на лист бумаги и обведи карандашом оба колеса.
- Запусти поворот и обведи колёса снова. Найди точку, вокруг которой повернулся робот.
- Совпадает ли она с серединой между колёсами? Если нет — насколько сантиметров и почему?
Подсказка: Как найти точку поворота
Соедини старое и новое положение каждого колеса. Точка поворота лежит там, где эти положения одинаково далеко.
Проба поворота работает. В журнале — рисунок, точка поворота и объяснение, почему она там.
Подбери время поворота на 90°
20 минНа поворот 90° нужно какое-то время в миллисекундах. Узнать его можно только опытом.
- Начерти на листе две линии под прямым углом (угольник или край тетради).
- Поставь робота носом вдоль первой линии. Запусти программу.
- Если робот не довернул — увеличь
turnMs, если перевернул — уменьши. Меняй понемногу: на 20–50 мс. - Когда поворот получился, повтори его три раза. Запиши время в журнал.
| Попытка | turnMs | Что получилось |
|---|---|---|
| 1 | 400 | |
| 2 | ||
| 3 |
Робот три раза подряд поворачивает примерно на 90°. Время записано в журнале.
Подсказка: Каждый раз поворачивает по-разному
Проверь, что батарея заряжена: от разряженной моторы крутятся медленнее. Пол должен быть ровным и не скользким. Небольшая разница между попытками — нормально.
На поворот 90° нужно какое-то время в миллисекундах. Узнать его можно только опытом. Как подбирать — реши сам, но меняй только turnMs и записывай каждую попытку.
- Начерти на листе две линии под прямым углом. Поставь робота носом вдоль первой.
- Подбирай
turnMs, пока робот не повернёт на 90°. В журнале — не меньше четырёх попыток и объяснение, почему ты выбрал следующее число. - Когда поворот получился, повтори его три раза.
| Попытка | turnMs | Что получилось | Что поменять дальше и почему |
|---|---|---|---|
| 1 | |||
| 2 | |||
| 3 | |||
| 4 |
Подсказка: С какого числа начать
Посмотри, сколько повернулся робот в пробе с turnMs = 400. Больше 90° или меньше?
Подсказка: Каждый раз поворачивает по-разному
Проверь, что батарея заряжена, а пол ровный и не скользкий. Небольшая разница между попытками — нормально.
Робот три раза подряд поворачивает примерно на 90°. В журнале четыре попытки с объяснением и итоговое время.
Подбери время поворота методом и узнай, насколько ему можно доверять.
- Найди одно время, при котором робот явно не доворачивает, и одно, при котором явно перекручивает. Пробуй середину между ними и сужай промежуток, пока ошибка не станет меньше 5°.
- С найденным временем сделай пять поворотов подряд. Для каждого отметь на листе, куда смотрит нос, и измерь транспортиром ошибку в градусах.
- Повтори пункт 2 при другой
turnSpeed(например, 160). При какой скорости повороты точнее и одинаковее? - Повернёт ли робот направо за то же время? Проверь и запиши.
turnSpeed | turnMs | Ошибки 5 поворотов, ° | Самая большая ошибка, ° |
|---|---|---|---|
| 100 | |||
| 160 |
Подсказка: Как измерить ошибку без транспортира
Сравни отметку носа с линией 90° на расстоянии 10 см от центра поворота: 1 см в сторону — это примерно 6°.
В журнале — способ поиска, время для двух скоростей, ошибки пяти поворотов и вывод: какую turnSpeed брать и одинаково ли время налево и направо.
Разворот на 180°
15 минЕсли на 90° нужно, например, 400 мс, сколько нужно на 180°? Запиши свой прогноз.
- Поставь в
turnMsсвоё время, умноженное на 2. Проверь разворот. - Подправь число, если нужно. Запиши время разворота в журнал.
Робот разворачивается и смотрит в обратную сторону. Время разворота записано.
Как это устроено: Почему ровно в два раза не всегда получается
В начале поворота моторам нужно время, чтобы разогнаться, а в конце робот немного проскальзывает по инерции. Поэтому время на 180° может быть чуть меньше двух поворотов на 90°. Опыт важнее расчёта.
Сколько миллисекунд нужно на разворот на 180°, если ты знаешь своё время на 90°? Запиши прогноз.
- Проверь прогноз на полу и подправь число, если нужно. Запиши время разворота.
- Ответь в журнале: получилось ровно вдвое больше, чем на 90°? Если нет, как ты это объяснишь?
Подсказка: Почему не ровно вдвое
Подумай, что происходит в начале поворота, когда колёса только трогаются, и в конце, когда моторы уже выключены.
Робот разворачивается и смотрит в обратную сторону. Время разворота и объяснение записаны.
- Предскажи время разворота по своему времени на 90° и проверь на полу. Подбери точное время тем же методом, что и для 90°.
- Сравни: во сколько раз время на 180° больше времени на 90°? Объясни в журнале, откуда берётся разница. Назови две причины.
- Выведи правило: сколько миллисекунд нужно на один градус при развороте и при повороте на 90°? Какое из чисел точнее подойдёт для поворота на 45°? Проверь.
Время разворота подобрано. В журнале — сравнение с удвоенным поворотом на 90°, две причины разницы и проверка правила на 45°.
Функции поворотов
12 мин- Создай скетч
L22_Turns. Впиши свои времена из журнала вturn90Msиturn180Ms.
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() {}
- Найди разницу между
turnLeft()иturnRight(). Что поменялось местами?
Программа проверяется без ошибок. Ты можешь объяснить, чем отличаются функции поворота.
- Создай скетч
L22_Turnsпо шаблону. Впиши свои времена из журнала вturn90Msиturn180Ms. - Напиши
turnLeft,turnRight,turnAroundи квадрат вsetup()сам. Функцияforwardиз урока 2.1 уже есть — пользуйся ей как образцом.
// Шаблон среднего уровня. Напиши код в разделе «Твоя часть» по целям в комментариях. 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() {}
- Нажми Проверить.
Подсказка: Чем отличаются повороты
Сравни свою пробу поворота: какие колёса и в какую сторону крутятся налево, а какие — направо? А при развороте?
Подсказка: Четыре раза
Повторить одно и то же четыре раза помогает цикл 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); — так робот крутится налево. Что поменять для поворота направо?
Программа выполняет требование и проверяется без ошибок.
Квадрат
18 минПрограмма повторяет 4 раза: «вперёд 1 секунду, налево». Где окажется робот в конце и куда будет смотреть? Нарисуй путь в журнале.
- Отметь старт скотчем. Запусти программу на полу.
- Сравни, где робот остановился, с прогнозом.
- Насколько робот не доехал до старта? Запиши.
Робот проезжает квадрат и возвращается близко к старту, носом в ту же сторону.
У соседей робот едет вперёд, крутится, но квадрат не получается: он ездит туда-обратно. В их turnLeft() стоит delay(turn180Ms). Что не так?
Программа повторяет 4 раза: «вперёд 1 секунду, налево». Нарисуй путь в журнале. Где окажется робот в конце и куда будет смотреть?
- Отметь старт скотчем. Запусти программу на полу три раза.
- Каждый раз измерь, на сколько сантиметров робот не доехал до старта, и на сколько градусов примерно повёрнут его нос.
- Объясни в журнале, почему ошибка в конце больше, чем ошибка одного поворота.
Три заезда с замерами и объяснение накопления ошибки.
У соседей робот едет вперёд, крутится, но квадрат не получается: он ездит туда-обратно. В их turnLeft() стоит delay(turn180Ms). Что не так?
- Запусти квадрат три раза. Каждый раз измерь, насколько робот промахнулся мимо старта (в сантиметрах) и насколько повёрнут нос (в градусах).
- Оцени ошибку одного поворота: раздели ошибку направления в конце на четыре. Совпадает ли она с ошибкой, которую ты мерил при подборе времени?
- Что сильнее портит квадрат: ошибка поворотов или увод на прямой? Как это проверить отдельным опытом? Проведи его и запиши вывод.
У соседей робот едет вперёд, крутится, но квадрат не получается: он ездит туда-обратно. В их turnLeft() стоит delay(turn180Ms). Что не так?
Замеры трёх квадратов, оценка ошибки одного поворота и опыт, который показал главную причину промаха.
Задания по уровням
15 минРобот поворачивает налево и направо на 90° и разворачивается на 180° по твоим временам.
Наклей на пол полоску изоленты. Поставь робота на неё, сделай разворот на 180°. Робот должен снова стоять вдоль полоски, а нос — уходить от неё не дальше её ширины. Так разворот будет работать в итоговой задаче.
Напиши функцию turn(int degrees): положительный угол — налево, отрицательный — направо. Время считай как degrees × msPerDegree, где msPerDegree = turn90Ms / 90. Проверь на 45°, 90° и 180°. Где точность хуже всего и почему?
Проверь себя
Выберите ответы для подготовки. Они не сохраняются и не оцениваются на сайте. Пройдите проверку знаний в программе курса или обсудите ответы с преподавателем.
● Основное
★ Средний уровень
★★ Продвинутый уровень
Отвечай на вопросы своего уровня. Нужно верных ответов: Начальный — 4 из 5; Средний — 4 из 5; Продвинутый — 4 из 5. Ответы проверит преподаватель или программа курса.
Итог
Робот поворачивает по времени, которое ты подобрал опытом. Это простой способ, но он зависит от батареи и пола. В уроке 4.2 робот научится поворачивать точнее — по датчикам: крутиться, пока не найдёт новую линию.
Как подтвердить результат
Для каждого опыта сохраняй условия, версию программы, наблюдение и вывод. Сравнивая попытки, меняй одну причину за раз; неудачные попытки тоже остаются в журнале. Отметка результата относится к уже выполненным действиям, повторять их ради отметки не нужно. Если результат не получен, запиши расхождение и следующую проверяемую гипотезу. Модель, измерения настоящего робота и объяснение — разные виды доказательств.
Словарь урока
| поворот на месте | Колёса крутятся в разные стороны, и робот вращается вокруг середины между колёсами. |
| калибровка | Подбор числа по опыту: например, сколько миллисекунд нужно на поворот 90°. |
| погрешность | Насколько результат отличается от нужного: например, робот повернул на 85° вместо 90°. |