Бесплатный урок с нашим репетитором!

Узнать подробнее

Новая Школа - онлайн-школа подготовки к ЕГЭ
При поддержке
Посмотреть все вопросы нейросети
Бесплатный пробный урок с репетитором

Узнай больше про репетиторов Новой Школы и запишись на бесплатный пробный урок. Мы проверим твой уровень знаний и составим план обучения по любому предмету и классу

Вопрос от Анонимного юзера 28 апреля 2026 09:47

Задание 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

Алгоритм работы

  1. Считать состояния датчиков: левыйDark и правыйDark (логические значения, зависит от вашей схемы).
  2. Применить ветвление:
    • Если левыйDark и правыйDark — ехать вперед (обе стороны вперед).
    • Else если левыйDark — поворот налево (левый мотор остановлен/медленно, правый мотор вперед).
    • Else если правыйDark — поворот направо (левый мотор вперед, правый остановлен/медленно).
    • Else — остановиться (или выполнять поиск/постоянное движение; в рамках задачи — стоп).
  3. Для моторов используйте функции управления направлением и скоростью (через 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 и т.д.).

Задай свой вопрос

Напиши любую задачу или вопрос, а нейросеть её решит

Похожие вопросы 15

Бесплатно Мобильное приложение ГДЗ
Мобильное приложение ГДЗ

Задавай вопросы искуcственному интеллекту текстом или фотографиями в приложении на iPhone или Android

qr-codegoogle-playapp-store

Саша — ассистент в телеграмме

Задание 6. «Следопыт» Задача: Соберите модель робота на двух моторах и двух оптодатчиках. Реализуйте простейшее линейное следование: • если левый датчик видит темное - поворачивай влево если правый — вправо, если оба — вперёд. Проверяемое: обработка цифровых входов, ветвление.
Классная задача для базового линейного следования (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 Алгоритм работы 1) Считать состояния датчиков: левыйDark и правыйDark (логические значения, зависит от вашей схемы). 2) Применить ветвление: - Если левыйDark и правыйDark — ехать вперед (обе стороны вперед). - Else если левыйDark — поворот налево (левый мотор остановлен/медленно, правый мотор вперед). - Else если правыйDark — поворот направо (левый мотор вперед, правый остановлен/медленно). - Else — остановиться (или выполнять поиск/постоянное движение; в рамках задачи — стоп). 3) Для моторов используйте функции управления направлением и скоростью (через 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 и т.д.).