Как запрограммировать робота на ардуино
Перейти к содержимому

Как запрограммировать робота на ардуино

  • автор:

Arduino.ru

как собрать и запрограммировать робота для движения по линии

  • Войдите на сайт для отправки комментариев

Пт, 19/04/2019 — 19:17
sarapulov.vas
Зарегистрирован: 19.04.2019

Расскажите как собрать и запрограммировать робота для движения по линии на ардуино.

  • Войдите на сайт для отправки комментариев

Пт, 19/04/2019 — 19:33
Зарегистрирован: 14.04.2019

К арудино подключаем мотор шилд, к нему подключаем два мотора, необходимо подключить еще два датчика черной линии

в целом алгоритм такой: считываем значения датчиков , и проверяем если черную линию видит левый датчик, то поврот на один delay влево и наоборот

Left_1 = analogRead (LeftSensor_1); //Считываем данные с левого датчика Right_1 = analogRead (RightSensor_1);//Считываем данные с правого датчика //Если левый датчик видит черныйа правый белый, то поворачиваем налево if ((Left_1 > sl1) && (Right_1

Поподробней о движении робота ардуино можешь посмотреть здесь Движение мобильного робота ардуино по черной линии

  • Войдите на сайт для отправки комментариев

Урок 33. Обучаем Arduino робота ездить по линии

При создании любого робота, его нужно оснастить датчиками (показания которых будет считывать робот), управляющими модулями (для вывода результатов работы робота), и скетчем (по алгоритму которого должен работать робот). В нашем случае, мы оснастим машинку, тремя аналоговыми датчиками линий и одним ультразвуковым датчиком расстояния, а в роли управляющих модулей выступят два закрепленных к каркасе моторчика, с колёсами на валах.

Видео:

Схема машинки ездящей по линии

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

  • Если центральный датчик находится на линии, а боковые вне линии, то машинка едет прямо.
  • Если левый датчик находится на линии, а правый вне линии, то машинка поворачивает налево (независимо от показаний центрального датчика)
  • Если правый датчик находится на линии, а левый вне линии, то машинка поворачивает направо (независимо от показаний центрального датчика)
  • Если правый и левый датчики находятся на линии (вне зависимости от показаний центрального датчика), то такое состояние является неопределённым, машинка продолжает предыдущее движение (прямо или с поворотом) в течении 2 секунд (можно менять в скетче). Если в течении этого времени состояние не изменится, то она остановится.
  • Если все три датчика находятся вне линии, то такое состояние является неопределённым (потеря линии). Если этому состоянию предшествовал поворот, то машинка продолжит поворот в течении 2 секунд (можно менять в скетче). Если в течении этого времени состояние не изменится, то она остановится. Если этому состоянию не предшествовал поворот (машинка ехала прямо и линия оборвалась), то машинка сразу остановится.
  • Если перед машинкой появилось препятствие, на расстоянии менее 10 см (можно менять в скетче), то машинка остановится и продолжит движение, как только препятствие исчезнет.

Скорость движения задаётся в константе valSpeed, от 1 до 255. Крутизна поворотов задаётся в константе valTurning, от 1 до 255. Время продолжения движения, при неопределённом состоянии, задаётся в константе tmrDelay, в микросекундах. Направление движения моторов указывается логическими значениями элементов массива arrRoute (0 элемент — правый мотор, 1 элемент — левый мотор), по умолчанию все элементы равны «1». Если вы перепутали полярность при подключении мотора, то измените значение соответствующего элемента этого массива на «0».

Калибровка для светлых, слабоконтрастных или цветных линий:

Машинка настроена на движение по темной линии, но она может ездить по светлым, слабоконтрастным или цветным линиям. Для этого её нужно откалибровать, указав значения для констант valSensor1 (показание датчика находящегося на линии) и valSensor0 (показание датчика находящегося вне линии). Для чего, в коде setup скетча, предусмотрен вывод показаний центрального датчика в монитор последовательного порта.

  • Поместите машинку так, чтобы центральный датчик находился над линией.
  • Подключите Arduino Uno по USB кабелю.
  • Откройте монитор последовательного порта. В мониторе высветится показание датчика на линии.
  • Поместите машинку так, чтобы центральный датчик находился вне линии.
  • Нажмите кнопку reset на Motor Shield. В мониторе высветится показание датчика вне линии.
  • Укажите первое значение константе valSensor1, а второе значение константе valSensor0 и повторно загрузите скетч.

Код программы:

// БИБЛИОТЕКИ: #include // подключаем библиотеку для работы с датчиком // НОМЕРА ВЫВОДОВ: const uint8_t pinSensorL = A3; // Вывод к которому подключен датчик находящийся слева (по направлению движения) const uint8_t pinSensorC = A4; // Вывод к которому подключен датчик находящийся по центру (по направлению движения) const uint8_t pinSensorR = A5; // Вывод к которому подключен датчик находящийся справа (по направлению движения) const uint8_t pinSens_TRIG = 2; // Вывод к которому подключен датчик расстояния HC_SR04 (вывод обозначенный на датчике как TRIG) const uint8_t pinSens_ECHO = 3; // Вывод к которому подключен датчик расстояния HC_SR04 (вывод обозначенный на датчике как ECHO) const uint8_t pinShield_LH = 7; // Вывод направления к которому подключен левый мотор (по направлению движения) const uint8_t pinShield_LE = 6; // Вывод ШИМ к которому подключен левый мотор (по направлению движения) const uint8_t pinShield_RE = 5; // Вывод ШИМ к которому подключен левый мотор (по направлению движения) const uint8_t pinShield_RH = 4; // Вывод направления к которому подключен левый мотор (по направлению движения) // ОБЪЕКТЫ: iarduino_HC_SR04_int hcsr(pinSens_TRIG, pinSens_ECHO); // Объект hcsr для работы с библиотекой iarduino_HC_SR04 (вывод TRIG, вывод ECHO) // УСТАНАВЛИВАЕМЫЕ ЗНАЧЕНИЯ: const uint16_t valSensor1 = 930; // Показание датчика находящегося на линии (указывается для конкретной трассы) const uint16_t valSensor0 = 730; // Показание датчика находящегося вне линии (указывается для конкретной трассы) const uint8_t valSpeed = 255; // Максимальная скорость (число от 1 до 255) const uint32_t tmrDelay = 2000; // Время в течении которого требуется остановиться (если в течении этого времени состояние остаётся неопределённым (линия не обнаружена), то требуется остановиться) const uint8_t valTurning = 10; // Крутизна поворотов (скорость реакции) (число от 1 до 255) const uint8_t valDistance = 20; // Минимально допустимое расстояние до объекта в сантиметрах (если расстояние будет меньше, то требуется остановитьтся) const bool arrRoute[2] = ; // Направление движения для каждого мотора (зависит от полярности, нулевой элемент - правый мотор, первый элемент - левый мотор) // РАССЧИТЫВАЕМЫЕ ЗНАЧЕНИЯ: uint8_t arrSpeed[2]; // Рассчитываемая скорость для каждого мотора (число от 1 до valSpeed, нулевой элемент - правый мотор, первый элемент - левый мотор) uint16_t valSensorM; // Рассчитываемое среднее значение датчика (значение между цветом линии и цветом вне линии) uint8_t valSensor; // Биты рассчитываемых логических уровней всех датчиков (0bxxxxxLCR) bool flgLine; // Флаг указывающий на то, что используется светлая линия (0 - тёмная линия, 1 - светлая линия) int8_t flgTurning; // Флаг наличия и направления поворота (0 - не поворачиваем, -1 - поворачиваем налево, +1 - поворачиваем направо) bool flgPWM; // Флаг указывающий на то, что требуется изменить ШИМ моторов (0 - тёмная линия, 1 - светлая линия) bool flgStop; // Флаг указывающий на необходимость остановиться (0 - без остановки, 1 - требуется остановиться) bool flgDistance; // Флаг обнаружения препятствия (0 - не обнаружено, 1 - обнаружено) uint32_t tmrMillis; // Время совершения последней операции (в миллисекундах) void setup()< // Узнаём цвет линии используемой на трассе, если он светлый, то устанавливаем флаг lineColor тёмный flgLine = (valSensor0>valSensor1); // Если условие (valSensor0>valSensor1) выполняется значит линия светлая и флаг flgLine установится в 1, иначе он сбросится в 0 // Вычисляем среднее значение между показаниями датчиков на линии и все линии if(flgLine) // Если на трассе используется светлая линия else // Если на трассе используется тёмная линия // Устанавливаем значение скорости обоих моторов arrSpeed[1]=valSpeed; // Максимальная скорость на левом моторе arrSpeed[0]=valSpeed; // Максимальная скорость на правом моторе // Устанавливаем флаг ШИМ, сбрасываем флаг наличия поворота, флаг остановки и флаг обнаружения припятствий flgPWM=1; flgTurning=0; flgStop=0; flgDistance=0; // Устанавливаем режим работы выводов и направление обоих моторов pinMode (pinSensorL, INPUT ); // Конфигурируем вывод pinSensorL как вход (для получения данных от левого датчика линии) pinMode (pinSensorC, INPUT ); // Конфигурируем вывод pinSensorC как вход (для получения данных от центрального датчика линии) pinMode (pinSensorR, INPUT ); // Конфигурируем вывод pinSensorR как вход (для получения данных от правого датчика линии) pinMode (pinShield_LH, OUTPUT ); // Конфигурируем вывод pinShield_LH как выход (для управления направлением движения левого мотора) pinMode (pinShield_LE, OUTPUT ); // Конфигурируем вывод pinShield_LE как выход (для управления скоростью вращения левого мотора, при помощи ШИМ) pinMode (pinShield_RE, OUTPUT ); // Конфигурируем вывод pinShield_RE как выход (для управления скоростью вращения правого мотора, при помощи ШИМ) pinMode (pinShield_RH, OUTPUT ); // Конфигурируем вывод pinShield_RH как выход (для управления направлением движения правого мотора) digitalWrite(pinShield_LH, arrRoute[1]); // Устанавливаем на выходе pinShield_LH уровень arrRoute[1] (направление движения левого мотора) digitalWrite(pinShield_RH, arrRoute[0]); // Устанавливаем на выходе pinShield_RH уровень arrRoute[0] (направление движения правого мотора) // Выводим показания центрального датчика линии Serial.begin(9600); while(!Serial)<> // Инициируем передачу данных по последовательному порту (на скорости 9600 бит/сек) Serial.println(analogRead(pinSensorC)); // Выводим показания центрального датчика линии (для указания значений константам valSensor0 и valSensor1) // Устанавливаем задержку и обновляем время совершения последней операции delay(2000); tmrMillis = millis(); > void loop()< // Читаем показания датчиков и преобразуем их в логические уровни // (1 - датчик на линии, 0 - датчик вне линии) valSensor = 0; // сбрасываем все биты переменной valSensor valSensor |= ((analogRead(pinSensorL)>valSensorM)^flgLine)valSensorM)^flgLine)valSensorM)^flgLine)" вернет "1" если значение analogRead(номер_вывода) больше чем значение valSensorM, а значит датчик находится над объектом, который темнее чем значение valSensorM, // Результат возвращённый оператором сравнения ">" нам подходит если используется тёмная линия, но если используется светлая линия, то результат нужно инвертировать . // Оператор побитового XOR "^" выполнит эту инверсию, только если установлен флаг flgLine, указывающий о том, что используется светлая линия // Оператор побитового сдвига влево " if(tmrMillis>millis()) < tmrMillis=0;>// Избавляемся от переполнения millis(); if(tmrMillis+tmrDelay // Останавливаемся если линия потеряна на более чем tmrDelay мс if(hcsr.distance() // Останавливаемся если обнаружено препятствие else if(flgDistance) < tmrMillis=millis(); flgPWM=1; flgDistance=0; >// Продолжаем движение если препятствие исчезло // Устанавливаем ШИМ для моторов if(flgPWM)0) arrSpeed[0]=valSpeed; break; // Уменьшаем скорость левого мотора (поворачиваем налево) case 0: arrSpeed[1]=valSpeed; arrSpeed[0]=valSpeed; break; // Устанавливаем одинаковую скорость (едим прямо) case 1: arrSpeed[1]=valSpeed; if(arrSpeed[0]>0) break; // Уменьшаем скорость правого мотора (поворачиваем направо) > if(flgStop) < arrSpeed[1]=0; arrSpeed[0]=0;>// Останавливаемся если установлен флаг flgStop if(flgDistance) < arrSpeed[1]=0; arrSpeed[0]=0;>// Останавливаемся если установлен флаг flgDistance // Выводим ШИМ analogWrite(pinShield_LE, arrSpeed[1]); analogWrite(pinShield_RE, arrSpeed[0]); > >

Ссылки:

  • Код программы.
  • Библиотека iarduino_HC_SR04_int.
  • Wiki — Установка библиотек в Arduino IDE .
  • Wiki — Датчик линии, аналоговый.
  • Wiki — Ультразвуковой датчик расстояния HC-SR04 .
  • Wiki — Trema Shield.

Как сделать робота на Ардуино: подробная видео инструкция

Подробная видео инструкция как сделать робота на ардуино: простой робот с видео камерой, объездом препятствий и функциями распознавания, управляемый с персонального компьютера (или ноутбука) с любой точки мира с помощью программы для управления роботами Arduino Robot Control.

Его величество робот

DIY роботПрограмма для управления роботом ардуино

Робот собран на основе одного из самых дешевых DIY конструкторов, который я нашел на алиэкспресс, в основе управления Arduino совместимая плата Wemos D1 на базе ESP8266., шасси, два самых обычных 5 вольтовых DC мотора, датчик расстояния HC-SR04, ну и собственно набор проводов. в общем, руль сиденья и колеса присутствуют. все в лучших традициях. Робот управляется с персонального компьютера или ноутбука на базе операционной системы Windows c помощью кнопок клавиатуры через программу ARC по средствам WiFi соединения. Видео с робота на компьютер также передается по Wi-Fi. Для того, чтобы повторить мой проект вам ничего не нужно программировать, необходимо просто собрать конструктор, подключить все провода и произвести пару интуитивно понятных настроек в интерфейсе программы ARC — весь процесс показан в полной видео инструкции.

Базовые функциональные возможности робота:

  1. Управление роботом по Wi-Fi c персонального компьютера или ноутбука;
  2. Автоматический объезд препятствий;
  3. Переключение скоростей (три режима);
  4. Передача видеопотока с камеры робота в интерфейс программы;
  5. Распознавание лиц человека с помощью компьютерного зрения.

Список комплектующих робота:

  1. Набор робота
  2. Камера
  3. Схема подключения проводов
  4. Текстовая инструкция по сборке робота
  5. Исходный код проекта
  6. Полная видеоинструкция по сборке, настройке и запуску робота

Программа для управления роботами Arduino Robot Control

Идея программы состоит в том, чтобы превратить ваш персональный компьютер или ноутбук, работающий на основе операционной системы Windows 7/10/11 в универсальный пульт управления DIY роботами на базе контроллеров семейства Arduino., функциональные возможности позволяют использовать программу для участия в робофестах и соревнованиях. ARC позволяет создать ваш робопроект не написав ни единой строчки arduino кода и по большому счету пользователю необходимо всего лишь правильно собрать робота из конструктора, подключить провода согласно схеме проекта и произвести базовые настройки с помощью конфигуратора встроенного в программу., для загрузки программы управления на вашего робота даже не потребуется установка Arduino IDE и танцы с кодом., весь процесс максимально автоматизирован.

Функциональные возможности программы Arduino Robot Control:

  1. Возможность управления роботами на базе Arduino, Raspberry PI, Orange PI, Beaglebone, EV3, Banana PI и прочими аналогами;
  2. Универсальный шаблон разработки «Custom» который позволяет настроить управление вашими уже готовыми роботами с ПК/ноутбука;
  3. Распознавание лиц с помощью компьютерного зрения с голосовой озвучкой OpenCV;
  4. Поддержка интерфейсов управления роботом: WiFi в режиме AP, WiFi в режиме STA, MQTT, радиоканал nRF24L01;
  5. Поддержка одновременного подключения и передачи видео в интерфейс программы (до 3-х камер одновременно). Можно использовать любые Wi-Fi камеры с поддержкой RTSP или HTTP потоков, также поддерживаются FPV камеры;
  6. Встроенный конфигуратор проектов и компилятор кода arduino;
  7. Встроенный готовые шаблоны проектов DIY (на текущий момент добавлено 3 готовых шаблона);
  8. Распознавание QR кодов с помощью компьютерного зрения OpenCV;
  9. Езда по линии с помощью компьютерного зрения OpenCV;
  10. Встроенный конфигуратор и монитор радиоканалов nRF24L01;
  11. Логирование процесса управления роботом;
  12. Видеозапись всего процесса управления роботом из интерфейса программы;
  13. Передача данных с датчиков установленных на роботе на онлайн треды в интерфейс программы (до 20-ти сигналов ввода/вывода);
  14. Анимация управления роботом и скорости на базе 3d модели (возможен вывод положения на 3d модель по осям X,Y,Z c гироскопа робота).

Где скачать программу ARC:

  1. Прямая ссылка для скачивания: Arduino Robot Control
  2. По любым вопросам работы программы со мной можно связаться по почте: aabilityuk@mail.ru

Примечания

*Для возможности управления роботом не из домашней сети WiFi, а через интернет с любой точки, необходимо использовать/подключить статический IP адрес на роутере либо сконфигурировать DDNS сервис, а также настроить проброску портов (Port Forwarding) на роутере.

Слова благодарности

Хочу поблагодарить моего товарища программиста из Москвы Алексея за помощь в создании программы Arduino Robot Control на всех этапах: графика, система регистрации, настройка и установка библиотек и многое другое.

Заключение

Это моя первая статья на Habr, постарался изложить все кратко и без воды, основные детали проекта показал на видео, надеюсь что материал будет полезен. Если идея найдет отражение, в последующих постах планирую выложить видео и описание других готовых робопроектов. Благодарю за внимание, готов ответить на ваши вопросы.

  • как сделать робота
  • как собрать робота
  • собираем робота
  • инструкция по сборке робота
  • собираем робота на ардуино
  • как сделать робота на ардуино
  • собираем простого робота
  • opencv
  • wifi
  • программа управления роботами
  • Разработка под Arduino
  • Робототехника
  • DIY или Сделай сам

Движение робота ардуино по черной линии

В этой статье мы разберем, как запрограммировать мобильного робота Adruino для движения по черной линии. Чтобы робот ардуино перемещался вдоль черной линии, ему нужно подсоединить два световых датчика, схема подсоединения датчиков света представлена на рисунке.

схема мобильного робота ардуино для движения по черной линии

Для движения мобильного робота ардуино по черной линии возьмем за основу подвижную платформу мобильного робота Ардуино, схема которого разобрана на уроке мобильный робот Arduino.
Световые датчики или датчики черной линии подсоединяются к плате ардуино следующим образом: порт датчика черной линии GND подсоединяется к GND через макетной платы, порт датчика VCC подсоединяется к шине питания через макетную плату в 5V, А0 подсоединяется к аналоговым портам платы ардуино A0, A1. Чтобы считать данные со светового датчика, используется команда
analogRead (номер пина);
Эта команда считывает значение датчика с номером пина.
Подробнее о работе светового датчика описано на уроке Считывание и калибровка датчиков Arduino.

Алгоритм движения по черной линии мобильного робота Ардуино

Если робот ардуино заезжает левым датчиком на черную линию, то он поворачивается определенное количество времени налево.
Если робот ардуино заезжает правым датчиком на черную линию, то он поворачивается определенное количество времени направо.
Если оба датчика белые, то тогда робот едет определенное количество времени вперед.
Мы разбираем пример без остановки на перекрестке. Если оба датчика черные, то тогда робот едет на определенное количество времени вперед.
Чтобы понять, что датчик заехал на черную линию, нужно считать данные с датчика и сравнить его с откалиброванным значением. Если значение считанное с датчика черной линии больше откалиброванного значения, то мы заехали на черную линию, если меньше, то на белую (Это зависит от работы конкретного датчика черной линии). Чтобы выполнялось одновремменоо два условия необходимо использовать оператор условия и логическую операции И && Подробонее об условиях и логических операциях в Си.
Разберем алгоритм движения по черной линии робота адрдуино
Left_1 = analogRead (LeftSensor_1); //Считываем данные с левого датчика
Right_1 = analogRead (RightSensor_1);//Считываем данные с правого датчика
Таким образом, при заезде мобильного робота Ардуино левым датчиком на черную линию:
Left_1 = analogRead (LeftSensor_1); //Считываем данные с левого датчика
Right_1 = analogRead (RightSensor_1);//Считываем данные с правого датчика
//Если левый датчик видит черныйа правый белый, то поворачиваем налево
if ((Left_1 > sl1) && (Right_1 < sp1))) analogWrite(SPEED_1, pov);
digitalWrite(DIR_1,LOW);
analogWrite(SPEED_2,povt);
digitalWrite(DIR_2, HIGH);
delay(1);
>
При заезде мобильного робота Arduino на черную линию правым датчиком:
Left_1 = analogRead (LeftSensor_1); //Считываем данные с левого датчика
Right_1 = analogRead (RightSensor_1);//Считываем данные с правого датчика
// Если правый датчик видит черный, а левый датчик белый, то поворачиваем направо
if ((Right_1 > sp1) && (Left_1 < sl1)) analogWrite(SPEED_1, povt);
digitalWrite(DIR_1,HIGH);
analogWrite(SPEED_2,pov);
digitalWrite(DIR_2, LOW);
delay(1);
>
Когда оба датчика мобильного робота Ардуино видят белую линию:
Left_1 = analogRead (LeftSensor_1); //Считываем данные с левого датчика
Right_1 = analogRead (RightSensor_1);//Считываем данные с правого датчика
//Если оба датчика белые, то едем вперед
if ((Left_1 < sl1) && (Right_1 < sp1)) analogWrite(SPEED_1,v);
digitalWrite(DIR_1,HIGH);
analogWrite(SPEED_2,v);
digitalWrite(DIR_2, HIGH);
delay(1);
>
Когда оба датчика мобильного робота Adruino видят черную линию:
Left_1 = analogRead (LeftSensor_1); //Считываем данные с левого датчика
Right_1 = analogRead (RightSensor_1);//Считываем данные с правого датчика
//Если оба датчика черные, то едем вперед
if ((Left_1 > sl1) && (Right_1 > sp1)) analogWrite(SPEED_1,v);
digitalWrite(DIR_1,HIGH);
analogWrite(SPEED_2,v);
digitalWrite(DIR_2, HIGH);
delay(1);
>
Мы создадим процедуру движения по черной линии мобильного робота ардуина назовём ее lin
Чтобы робот ехал по черной линии бесконечно мы должны вызывать процедуру в теле основной программы
void loop() lin();
>
Полный текст программы для движения робота arduino по черной линии

#define SPEED_1 6 // скорость первого мотора
#define DIR_1 7 // направление первого мотора
#define DIR_2 4 // направление второго мотора
#define SPEED_2 5 // скорость второго мотора

int Left_1; // прописываем левый датчик
int Right_1; // прописываем правый датчик

// Подсоединение к пинам
#define RightSensor_1 A0
#define LeftSensor_1 A1

// Сюда записываем данные с калибровки датчиков
int sl1=193;// Средняя освещённость левого датчика
int sp1=206;// Средняя освещёность правого датчика

// Переменные для регулировки скорости робота
int povt=30;
int pov=60;
int v=70;

void setup() Serial.begin(9600);
for(int i = 4; i < 8; i++) // определяем порты для моторов
pinMode(i, OUTPUT);
pinMode(A0, INPUT);// настраиваем порты для датчиков черной линии
pinMode(A1, INPUT);
delay(1000);
>
void lin() <
Left_1 = analogRead (LeftSensor_1);
Right_1 = analogRead (RightSensor_1);
//Если левый датчик видит черный, то поворачиваем налево
if ((Left_1 > sl1) && (Right_1 < sp1)) analogWrite(SPEED_1, pov);
digitalWrite(DIR_1,LOW);
analogWrite(SPEED_2,povt);
digitalWrite(DIR_2, HIGH);
delay(1);
>
Left_1 = analogRead (LeftSensor_1);
Right_1 = analogRead (RightSensor_1);
// Если правый датчик видит черный, по поворачиваем направо
if ((Right_1 > sp1) && (Left_1 < sl1)) analogWrite(SPEED_1, povt);
digitalWrite(DIR_1,HIGH);
analogWrite(SPEED_2,pov);
digitalWrite(DIR_2, LOW);
delay(1);
>
Left_1 = analogRead (LeftSensor_1);
Right_1 = analogRead (RightSensor_1);
//Если оба датчика черные, то едем вперед
if ((Left_1 > sl1) && (Right_1 > sp1)) analogWrite(SPEED_1,v);
digitalWrite(DIR_1,HIGH);
analogWrite(SPEED_2,v);
digitalWrite(DIR_2, HIGH);
delay(1);
>
Left_1 = analogRead (LeftSensor_1);
Right_1 = analogRead (RightSensor_1);
//Если оба датчика белые, то едем вперед
if ((Left_1 < sl1) && (Right_1 < sp1)) analogWrite(SPEED_1,v);
digitalWrite(DIR_1,HIGH);
analogWrite(SPEED_2,v);
digitalWrite(DIR_2, HIGH);
delay(1);
>
>

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *