Алгоритмическая структура «Ветвление» (условный оператор) является одной из трех базовых конструкций структурного программирования наряду со следованием и циклом. Она позволяет программе принимать решения и изменять порядок выполнения команд в зависимости от выполнения или невыполнения некоторого условия . В робототехнике ветвление — это механизм, с помощью которого робот реагирует на данные, поступающие от датчиков, адаптируя своё поведение к изменяющимся условиям окружающей среды.
1. Алгоритмическая структура «Ветвление»
Ветвление — это алгоритмическая конструкция, обеспечивающая выбор одного из нескольких вариантов (блоков команд) в зависимости от значения логического условия .
1.1. Полная и неполная формы ветвления
| Форма ветвления | Синтаксис (C++/Arduino) | Блок-схема | Назначение |
|---|---|---|---|
| Полная (if-else) | if (условие) { блок_1 } else { блок_2 } | Ромб с двумя ветвями (ДА/НЕТ) | Выполнение одного из двух блоков команд в зависимости от истинности условия |
| Неполная (if) | if (условие) { блок } | Ромб с одной ветвью «ДА» | Выполнение блока команд только при истинности условия (при ложности — пропуск) |
1.2. Логические условия
Условие в ветвлении — это логическое выражение, которое может принимать значение истина (true) или ложь (false). В робототехнике условия чаще всего строятся на основе:
Сравнения значений датчиков с пороговыми величинами:
distance < 20(расстояние меньше 20 см),lightSensor > 500(освещённость выше порога).Состояния кнопок и переключателей:
buttonPressed == HIGH(кнопка нажата).Логических операций:
&&(И — оба условия истинны),||(ИЛИ — хотя бы одно условие истинно),!(НЕ — отрицание).
1.3. Множественное ветвление (if-else if-else)
При необходимости выбора из нескольких вариантов используется конструкция с несколькими проверками:
if (условие_1) { // действия для условия_1 } else if (условие_2) { // действия для условия_2 } else if (условие_3) { // действия для условия_3 } else { // действия, если ни одно условие не выполнено }
2. Применение ветвления в робототехнике
В робототехнике ветвление является основой для реализации адаптивного поведения — способности робота изменять свои действия в ответ на изменения окружающей среды.
2.1. Обнаружение и объезд препятствий
Самая распространённая задача, решаемая с помощью ветвления. Робот с ультразвуковым датчиком расстояния проверяет, есть ли препятствие впереди, и в зависимости от результата либо продолжает движение, либо выполняет манёвр объезда.
2.2. Следование по линии
Робот с датчиками линии постоянно проверяет положение линии под собой и корректирует направление движения:
int leftSensor = analogRead(A0); // левый датчик линии int rightSensor = analogRead(A1); // правый датчик линии if (leftSensor < threshold && rightSensor < threshold) { // оба датчика над линией — движение прямо moveForward(); } else if (leftSensor > threshold && rightSensor < threshold) { // левый датчик видит светлую поверхность — поворот налево turnLeft(); } else if (leftSensor < threshold && rightSensor > threshold) { // правый датчик видит светлую поверхность — поворот направо turnRight(); } else { // оба датчика потеряли линию — остановка или поиск stopRobot(); }
2.3. Реагирование на уровень освещённости
Робот может включать фары при наступлении темноты или менять режим движения в зависимости от освещённости.
3. Практическая работа «Применение основных алгоритмических структур. Контроль движения при помощи датчиков»
Цель работы: Научиться применять алгоритмическую структуру «Ветвление» для управления движением робота на основе данных, получаемых с датчиков (расстояния, линии, освещённости) .
Оборудование и материалы:
Микроконтроллер (Arduino Uno/Nano)
Драйвер моторов (L298N или TB6612)
2 DC-мотора с колёсами
Ультразвуковой датчик расстояния HC-SR04
2 аналоговых датчика линии (TCRT5000)
Датчик освещённости (фоторезистор)
Аккумуляторная батарея (6–9 В)
Соединительные провода, макетная плата
Компьютер со средой Arduino IDE
3.1. Задание и порядок выполнения
Задание: Создать программу для колёсного робота, который:
Движется вперёд, пока путь свободен.
При обнаружении препятствия (расстояние < 20 см) останавливается, оценивает обстановку и объезжает препятствие.
При движении по линии корректирует направление на основе показаний датчиков линии.
В темноте автоматически включает фару (светодиод).
Этапы выполнения:
| № | Этап | Содержание работы | Результат |
|---|---|---|---|
| 1 | Сборка схемы | Подключить датчики и моторы к микроконтроллеру согласно схемам | Готовая электрическая схема |
| 2 | Тестирование датчиков | Написать программы для проверки каждого датчика, определить пороговые значения | Калибровочные данные |
| 3 | Программирование базовых движений | Создать функции moveForward(), moveBackward(), turnLeft(), turnRight(), stopRobot() | Библиотека движений |
| 4 | Реализация объезда препятствий | Написать программу с ветвлением для обнаружения препятствия и выбора направления объезда | Функция avoidObstacle() |
| 5 | Реализация следования по линии | Написать программу с множественным ветвлением для коррекции движения по линии | Функция followLine() |
| 6 | Интеграция и тестирование | Объединить все функции в основном цикле loop(), протестировать работу робота в различных сценариях | Работоспособная программа |
3.2. Пример программы (объезд препятствий)
#include <Ultrasonic.h> // Определение пинов const int trigPin = 9; const int echoPin = 10; const int enA = 5; // ШИМ правых моторов const int enB = 6; // ШИМ левых моторов const int in1 = 7; const int in2 = 8; const int in3 = 11; const int in4 = 12; Ultrasonic ultrasonic(trigPin, echoPin); int distance; void setup() { // Настройка пинов моторов pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); pinMode(enA, OUTPUT); pinMode(enB, OUTPUT); Serial.begin(9600); } void moveForward() { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); analogWrite(enA, 150); analogWrite(enB, 150); } void turnRight() { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); analogWrite(enA, 150); analogWrite(enB, 150); delay(500); stopRobot(); } void turnLeft() { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); analogWrite(enA, 150); analogWrite(enB, 150); delay(500); stopRobot(); } void stopRobot() { digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, LOW); } void loop() { distance = ultrasonic.read(); // измерение расстояния в см Serial.print("Distance: "); Serial.println(distance); // ВЕТВЛЕНИЕ: проверка наличия препятствия if (distance > 20) { // Условие истинно — путь свободен moveForward(); } else { // Условие ложно — обнаружено препятствие stopRobot(); delay(500); // Принимаем решение о направлении объезда // (можно добавить проверку датчиков с обеих сторон) turnLeft(); // поворот налево moveForward(); delay(1000); turnRight(); // возврат на курс } delay(100); }
3.3. Пример программы (следование по линии с множественным ветвлением)
// Датчики линии: левый на A0, правый на A1 const int leftLinePin = A0; const int rightLinePin = A1; const int threshold = 500; // порог (белое > threshold, чёрное < threshold) void loop() { int leftValue = analogRead(leftLinePin); int rightValue = analogRead(rightLinePin); // МНОЖЕСТВЕННОЕ ВЕТВЛЕНИЕ if (leftValue > threshold && rightValue > threshold) { // оба датчика на белом — движение прямо moveForward(); } else if (leftValue < threshold && rightValue > threshold) { // левый на чёрном (линии), правый на белом — поворот налево turnLeft(); } else if (leftValue > threshold && rightValue < threshold) { // правый на чёрном (линии), левый на белом — поворот направо turnRight(); } else if (leftValue < threshold && rightValue < threshold) { // оба датчика на чёрном — перекрёсток или конец линии stopRobot(); } delay(50); }
3.4. Карта контроля выполнения работы
| Технологическая операция | Критерий оценки | Выполнение |
|---|---|---|
| Сборка электрической схемы | Правильность подключений, отсутствие коротких замыканий | +/– |
| Тестирование датчиков | Корректное отображение показаний в Serial Monitor | +/– |
| Функции базовых движений | Робот правильно движется вперёд, назад, поворачивает | +/– |
| Обнаружение препятствия | Остановка при расстоянии < 20 см | +/– |
| Объезд препятствия | Робот объезжает препятствие и возвращается на курс | +/– |
| Следование по линии | Робот удерживается на линии на всём протяжении | +/– |
| Работа фары в темноте | Светодиод включается при низкой освещённости | +/– |
Вывод: Алгоритмическая структура «Ветвление» является ключевым инструментом для создания адаптивного поведения роботов, позволяя им принимать решения на основе данных от датчиков. Выполнение практической работы по контролю движения с использованием ветвлений формирует навыки разработки логически сложных программ, включающих проверку условий, выбор направления объезда препятствий и коррекцию движения по линии . Полученные компетенции являются фундаментом для дальнейшего изучения более сложных алгоритмов, таких как планирование маршрута, навигация и групповое взаимодействие роботов.
Список использованных источников
Алгоритмическая структура «Ветвление». Программирование ветвлений на языке Python / Инфоурок, 2025
Алгоритмическая структура «ветвление»: разбор с примерами / Блог Skysmart, 2025
Алгоритмическая структура ветвления. Типы ветвлений. Примеры с решениями / Блог Хекслета, 2024
Практическая работа «Программирование робота с датчиком расстояния» / Учебный портал, 2025
Урок «Программирование роботов: ветвление и датчики» / Мультиурок, 2024
Примеры условного оператора if в Arduino: управление движением / ArduinoMaster.ru, 2025
Практическая работа по робототехнике «Объезд препятствий» / Инфоурок, 2024