// Даём понятное имя пину направления вращения левого мотора #define PIN_ML_DIR 7 // Даём понятное имя пину управления скоростью вращения левого мотора #define PIN_ML_SPEED 6 // Даём понятное имя пину направления вращения правого мотора #define PIN_MR_DIR 4 // Даём понятное имя пину управления скоростью вращения правого мотора #define PIN_MR_SPEED 5 // Даём понятное имя пину левого датчика линии #define PIN_LINE_L A0 // Даём понятное имя пину правого датчика линии #define PIN_LINE_R A1 // Настраиваем направление вращения моторов // Если мотор вращается в обратную сторону, меняем false на true constexpr bool ML_INVERT = false; constexpr bool MR_INVERT = false; // Задаем порог, ниже которого считаем, что датчик видит чёрную линию constexpr int LINE_BLACK = 20; // Задаём скорост вращения мотора при повороте constexpr int TURN_SPEED = 128; // Задаём время для сьезда с линии при повороте в миллисекундах constexpr int TURN_WAIT = 150; // Задаем время поворота робота назад для выравнивания по линии constexpr int TURN_BACK = 200; void setup() { // Настраиваем пины управления моторами в режим выхода pinMode(PIN_ML_DIR, OUTPUT); pinMode(PIN_ML_SPEED, OUTPUT); pinMode(PIN_MR_DIR, OUTPUT); pinMode(PIN_MR_SPEED, OUTPUT); // Настраиваем пины датчиков линии в режим входа pinMode(PIN_LINE_L, INPUT); pinMode(PIN_LINE_R, INPUT); // Делаем паузу 10 секунд, чтобы успеть поставить робота на поле delay(10000); } void loop() { // Поворачиваем направо turnBackR(TURN_SPEED, TURN_WAIT); // Делаем паузу 10 секунд delay(10000); // Поворачиваем налево turnBackL(TURN_SPEED, TURN_WAIT); // Делаем паузу 10 секунд delay(10000); } // Функция возврата после поворота направо void turnBackR(int speed, int waitTime) { // Включаем левый мотор в обратную сторону motorsDrive(-speed, 0); // Ждём, пока левый датчик снова увидит линию while (readLineL() > LINE_BLACK) { delay(10); } // Даем время, чтобы выровнять робота delay(waitTime); // Останавливаем моторы motorsDrive(0, 0); delay(250); } // Функция возврата после поворота налево void turnBackL(int speed, int waitTime) { // Включаем левый мотор в обратную сторону motorsDrive(0, -speed); // Ждём, пока левый датчик снова увидит линию while (readLineR() > LINE_BLACK) { delay(10); } // Даем время, чтобы выровнять робота delay(waitTime); // Останавливаем моторы motorsDrive(0, 0); delay(250); } // Функция управления моторами void motorsDrive(int ml, int mr) { // Определяем направление вращения левого мотора bool mlDir = ml < 0; // Определяем направление вращения правого мотора bool mrDir = mr < 0; // При необходимости инвертируем направление моторов if (ML_INVERT) mlDir = !mlDir; if (MR_INVERT) mrDir = !mrDir; // Задаём направление вращения моторов digitalWrite(PIN_ML_DIR, mlDir); digitalWrite(PIN_MR_DIR, mrDir); // Задаём скорость вращения моторов analogWrite(PIN_ML_SPEED, abs(ml)); analogWrite(PIN_MR_SPEED, abs(mr)); } // Считывание левого датчика линии int readLineL() { return map(analogRead(PIN_LINE_L), 0, 1024, 100, 0); } // Считывание правого датчика линии int readLineR() { return map(analogRead(PIN_LINE_R), 0, 1024, 100, 0); }