Задание 6. «Следопыт» Задача: Соберите модель робота на двух моторах и двух оптодатчиках. Реализуйте простейшее линейное следование: • если левый датчик видит темное - поворачивай влево если правый — вправо, если оба — вперёд. Проверяемое: обработка цифровых входов, ветвление.
Ответ нейросети
28 апреля 2026 09:47
Классная задача для базового линейного следования (Sight-following) на двух моторах и двух оптодатчиках. Ниже — подробное решение с пошаговым объяснением, адаптированное под школьную среду. Я дам общую схему, схему соединения и пример кода на Arduino. Если у вас другая платформа, можно адаптировать пины и синтаксис.
Цель задачи
- Реализовать простейшее линейное следование: по входам с двух оптодатчиков выбираются движения моторов.
- Правила: если левый датчик видит темное — поворачивай влево; если правый — вправо; если оба — вперед. Если ни один не видит темное — можно остановиться (для тестирования логики ветвлений).
Компоненты и общая схема
- 2 мотора (левый и правый) через мотор-удлинитель/плата (например, L298N или аналогичная).
- 2 оптодатчика (цифровые, выставлены как датчики линии). Назовем их левый SENSOR_LEFT и правый SENSOR_RIGHT.
- Микроконтроллер: Arduino (или аналог). В коде — примеры под Arduino.
- Источник питания: питание моторов и логики. Важно разделить питание моторов и микроконтроллера, чтобы не было помех.
Схема подключения (типовая)
- Оптодатчики:
- SENSOR_LEFT → цифровой вход Arduino (например D2)
- SENSOR_RIGHT → цифровой вход Arduino (например D3)
- Оба датчикам можно подключить к Vcc через резистор подтяжки и GND, либо использовать INPUT_PULLUP в коде, в зависимости от того, как настроены датчики (проверьте конкретную схему датчика).
- Моторы через драйвер:
- Левый мотор: IN1, IN2 управляют направлением, ENA — ШИМ для скорости.
- Правый мотор: IN3, IN4 управляют направлением, ENB — ШИМ.
- ENA и ENB подключены к PWM-выходам Arduino.
- Источники питания: общий GND между микроконтроллером и драйвером моторов.
Пример параметров (один из вариантов, можно адаптировать под вашу плату)
- Arduino: D2 (SENSOR_LEFT), D3 (SENSOR_RIGHT)
- Левый мотор: ENA = 9 (PWM), IN1 = 8, IN2 = 7
- Правый мотор: ENB = 10 (PWM), IN3 = 12, IN4 = 11
Алгоритм работы
- Считать состояния датчиков: левыйDark и правыйDark (логические значения, зависит от вашей схемы).
- Применить ветвление:
- Если левыйDark и правыйDark — ехать вперед (обе стороны вперед).
- Else если левыйDark — поворот налево (левый мотор остановлен/медленно, правый мотор вперед).
- Else если правыйDark — поворот направо (левый мотор вперед, правый остановлен/медленно).
- Else — остановиться (или выполнять поиск/постоянное движение; в рамках задачи — стоп).
- Для моторов используйте функции управления направлением и скоростью (через PWM).
Пример кода на Arduino (безопасная базовая версия)
- Пример предполагает, что датчики дают HIGH, когда видят темное. Если у вашей схемы иначе, поменяйте сравнения на LOW.
Ниже простой рабочий пример кода:
// Пины датчиков const int LEFT_SENSOR_PIN = 2; const int RIGHT_SENSOR_PIN = 3;
// Левый мотор (через драйвер L298N) const int L_EN = 9; // PWM скорость const int L_IN1 = 8; // направление const int L_IN2 = 7;
// Правый мотор const int R_EN = 10; // PWM скорость const int R_IN1 = 12; // направление const int R_IN2 = 11;
const int FORWARD_SPEED = 180; // скорость 0..255
void setup() { // Настройка пинов pinMode(LEFT_SENSOR_PIN, INPUT); pinMode(RIGHT_SENSOR_PIN, INPUT);
pinMode(L_EN, OUTPUT); pinMode(L_IN1, OUTPUT); pinMode(L_IN2, OUTPUT);
pinMode(R_EN, OUTPUT); pinMode(R_IN1, OUTPUT); pinMode(R_IN2, OUTPUT);
// При желании можно включить подтягивающие резисторы: // INPUT_PULLUP для сенсоров, если они подключены к земле при обнаружении темного // и поменять логику на HIGH/LOW соответствующе. // e.g. можно заменить на: const int leftValDark = HIGH; и т.д. // или оставить как есть и протестировать. }
void loop() { bool leftDark = digitalRead(LEFT_SENSOR_PIN) == HIGH; // меняем на == LOW, если ваши датчики так работают bool rightDark = digitalRead(RIGHT_SENSOR_PIN) == HIGH;
if (leftDark && rightDark) { // оба темные — идти вперед setLeftSpeed(FORWARD_SPEED); setRightSpeed(FORWARD_SPEED); } else if (leftDark) { // левый датчик видит темное — поворот влево setLeftSpeed(0); setRightSpeed(FORWARD_SPEED); } else if (rightDark) { // правый датчик видит темное — поворот вправо setLeftSpeed(FORWARD_SPEED); setRightSpeed(0); } else { // ни один не видит темное — остановиться (для тестов) setLeftSpeed(0); setRightSpeed(0); }
// небольшой лаг для стабильности (по желанию) delay(20); }
// Управление левым мотором: скорость может быть отрицательной (для обратного направления) // Здесь мы используем -Speed только внутри setLeftSpeed/setRightSpeed void setLeftSpeed(int speed) { // speed: 0..255 (мотор вперед). Можно расширить до -255..255 для обратного направления. if (speed > 0) { digitalWrite(L_IN1, HIGH); digitalWrite(L_IN2, LOW); analogWrite(L_EN, constrain(speed, 0, 255)); } else { // стоп analogWrite(L_EN, 0); digitalWrite(L_IN1, LOW); digitalWrite(L_IN2, LOW); } }
void setRightSpeed(int speed) { if (speed > 0) { digitalWrite(R_IN1, HIGH); digitalWrite(R_IN2, LOW); analogWrite(R_EN, constrain(speed, 0, 255)); } else { analogWrite(R_EN, 0); digitalWrite(R_IN1, LOW); digitalWrite(R_IN2, LOW); } }
Пояснения по коду и логике
- Логика ветвления реализует требование задачи: оба датчика темные → вперед; только левый темный → поворот влево; только правый темный → поворот вправо; ни один датчик темный → остановка.
- Управление моторами через PWM на EN-пинах дает возможность регулировать скорость и плавность движения. Для простого варианта можно оставить скорость одинаковой на обоих моторах (FORWARD_SPEED).
- Важно учесть физическую сторону подключения датчиков: у некоторых датчиков темное освещение может давать LOW, у других HIGH. В коде:
- Логика: leftDark = digitalRead(LEFT_SENSOR_PIN) == HIGH; rightDark = digitalRead(RIGHT_SENSOR_PIN) == HIGH;
- Если у вашей схемы темное даёт LOW, поменяйте HIGH на LOW во всех местах, или используйте INPUT_PULLUP и инвертируйте переменные (leftDark = digitalRead(LEFT_SENSOR_PIN) == LOW; и т.д.).
Проверка и отладка
- Шаг 1: Проверка датчиков
- Наблюдайте входы на D2 и D3 через Serial Monitor или светодиоды. Убедитесь, что в темном на линии датчик выдает соответствующий HIGH/LOW сигнал.
- Шаг 2: Проверка управлением моторами
- Вручную вызовите функции setLeftSpeed и setRightSpeed в отдельной программе, чтобы убедиться, что моторы вращаются в нужном направлении и с нужной скоростью.
- Шаг 3: Проверка логики ветвления
- Организуйте тестовую раскладку: удерживайте левый датчик в темном, правый в светлом — должно быть поворот влево; наоборот — вправо; оба темные — движение вперед; оба светлые — стоп.
- Шаг 4: Добавьте вывод в Serial
- Включите serial и печатайте значения leftDark и rightDark, чтобы увидеть, как код реагирует на входы.
Возможные улучшения (опционально)
- Добавить поиск линии: если ни один датчик не видит темное, можно вращаться на месте коротко, чтобы найти линию.
- Реализовать плавные переходы между движениями (например, уменьшение ускорения, вместо резкого остановки).
- Учесть зависимость от цвета пола или разной яркости, калибровать пороги (например, использовать пороги на основе пороговой настройке датчиков).
- Вести журнал ошибок и диагностику через Serial-монитор.
Если у вас другая платформа (например, Raspberry Pi, ESP32 без Arduino-IDE и т. д.), скажите модель, и я адаптирую код под вашу среду и конкретные пины. Также можно привести альтернативный вариант на разных языках (C++, MicroPython и т.д.).
Понравился ответ?
Задай свой вопрос
Напиши любую задачу или вопрос, а нейросеть её решит



