Рубрики
Схемы на Arduino

Робот на Arduino следующий за человеком

В последние годы в робототехнике произошел значительный прогресс, позволивший создавать интеллектуальные машины, способные взаимодействовать с окружающей средой. Одним из интересных применений робототехники является разработка роботов, следующих за человеком. Эти роботы могут отслеживать и следовать за человеком автономно, что делает их полезными в различных сценариях, таких как помощь в людных местах, навигационная поддержка или даже в качестве компаньонов. В этой статье мы подробно рассмотрим, как построить робота, следующего за человеком, с помощью платы Arduino и трех ультразвуковых датчиков.

Создание робота, следующего за человеком, с использованием Arduino и трёх ультразвуковых датчиков — интересный проект. Особенно интересным этот проект делает использование не одного, а трех ультразвуковых датчиков. Это добавляет новое измерение этому опыту, поскольку обычно подобные роботы конструируются с помощью одного ультразвукового, двух инфракрасных датчиков и одного серводвигателя. Но серводвигатель в подобных проектах не играет никакой роли в работе, но добавляет ненужные сложности. Поэтому мы удалили сервопривод и ИК-датчики и использовали 3 ультразвуковых датчика. С помощью ультразвуковых датчиков вы можете измерять расстояние и использовать эту информацию для навигации и отслеживания человеческого тела. Кратко принцип работы нашего робота можно посмотреть в следующем видео.

Необходимые компоненты

  • Плата Arduino UNO (купить на AliExpress).
  • Ультразвуковой датчик HC-SR04 – 3 шт. (купить на AliExpress).
  • Драйвер двигателя L298N (купить на AliExpress).
  • Шасси робота.
  • Двигатели BO — 2 шт.
  • Колеса — 2 шт.
  • Литий-ионный аккумулятор 3,7 В — 2 шт.
  • Держатель батареи.
  • Макетная плата.
  • Держатель ультразвукового датчика — 3 шт.
  • Выключатель и соединительные провода.

Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158

Схема проекта

Схема робота на основе платы Arduino, следующего за человеком, представлена на следующем рисунке.

Представленная схема содержит три ультразвуковых датчика, позволяющих измерять расстояние в трех направлениях: вперед, вправо и влево. Эти датчики подключаются к плате Arduino через соответствующие цифровые контакты. Кроме того, схема включает в себя два двигателя постоянного тока для движения, которые подключены к модулю драйвера двигателя L298N. Модуль драйвера двигателя, в свою очередь, подключается к цифровым контактам платы. Для питания всей установки используются два литий-ионных элемента на 3,7 В, которые подключаются к модулю драйвера двигателя через переключатель.

Внешний вид собранной конструкции робота показан на следующем рисунке.

Один из наших постоянных посетителей напечатал платформу этого робота на 3D принтере и решил поделиться своими файлами для печати этой платформы — скачать вы их можете по следующей ссылке.

Также вы можете посмотреть видео с собранной данной платформой, напечатанной с помощью приведенных выше файлов.

Соединения модуля ультразвукового датчика HC-SR04 и платы Arduino:

  • Подключите контакт VCC каждого ультразвукового датчика к контакту 5 В на плате Arduino.
  • Подключите контакт GND каждого ультразвукового датчика к контакту GND на плате Arduino.
  • Подключите триггерный контакт (TRIG) каждого ультразвукового датчика к отдельным цифровым контактам (2, 4 и 6) на плате Arduino.
  • Подключите эхо-контакт (ECHO) каждого ультразвукового устройства к отдельным цифровым контактам (3, 5 и 7) на плате Arduino.

Соединения Arduino и драйвера двигателя:

  • Подключите цифровые выходные контакты Arduino (цифровые контакты 8, 9, 10 и 11) к соответствующим входным контактам (IN1, IN2, IN3 и IN4) на модуле драйвера двигателя.
  • Подключите контакты ENA и ENB модуля драйвера двигателя к контакту платы Arduino, который будет в состоянии High с помощью разъема типа «мама».
  • Подключите контакты OUT1, OUT2, OUT3 и OUT4 модуля драйвера двигателя к соответствующим клеммам двигателей.
  • Подключите контакты VCC (+5 В) и GND модуля драйвера двигателя к соответствующим разъемам питания (Vin) и земли (GND) на Arduino.

Соединения источника питания:

  • Подключите положительную клемму источника питания к входу +12 В модуля драйвера двигателя.
  • Подключите отрицательную клемму источника питания к контакту GND модуля драйвера двигателя.
  • Подключите контакт GND Arduino к контакту GND модуля драйвера двигателя.

Объяснение кода программы

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

В коде программы мы будем считывать расстояния от трех ультразвуковых датчиков («frontDistance», «leftDistance» и «rightDistance»). Затем мы будем сравнивать эти расстояния, чтобы определить датчик с наименьшим расстоянием. Если это наименьшее расстояние будет ниже порогового значения, наш робот будет перемещаться с помощью соответствующей функции управления двигателем («moveForward()», «turnLeft()», «turnRight()»). Если ни одно из расстояний не ниже порогового значения, двигатель останавливается с помощью функции «stop()».

Сначала в программе  мы задаем контакты для ультразвуковых датчиков и управления двигателем. Переменные S1Trig , S2Trig, S3Trig представляют триггерные контакты трех ультразвуковых датчиков, а S1Echo, S2Echo, S3Echo представляют соответствующие им эхо-контакты.

Переменные LEFT_MOTOR_PIN1, LEFT_MOTOR_PIN2RIGHT_MOTOR_PIN1 и RIGHT_MOTOR_PIN2 определяют контакты для управления двигателями.

Переменные MAX_DISTANCE и MIN_DISTANCE_BACK задают пороговые значения для обнаружения препятствий.

Обязательно отрегулируйте значения «MIN_DISTANCE_BACK» и «MAX_DISTANCE» в соответствии с вашими требованиями и характеристиками вашего робота. При выставлении их значений необходимо будет учитывать такие факторы, как скорость вашего робота, время отклика датчиков и желаемый запас безопасности. Вот несколько общих рекомендаций, которые помогут вам выбрать подходящие значения этих параметров.

MIN_DISTANCE_BACK — это значение представляет собой расстояние, на которое робот должен двигаться назад, когда прямо впереди обнаружено препятствие или рука. Это расстояние должно быть установлено на такое значение, которое позволяет роботу безопасно двигаться задним ходом, не сталкиваясь с препятствием или рукой. Типичное значение может составлять около 5-10 см.

MAX_DISTANCE — это значение представляет собой максимальное расстояние, на котором робот считает путь впереди свободным и может продолжать движение вперед. Значение этого расстояния должно быть установлено таким, чтобы обеспечивалось достаточно места для движения робота без столкновения с какими-либо препятствиями или руками. Если ваша рука и препятствие выходят за пределы этого диапазона, робота следует остановить. Типичное значение может составлять около 30-50 см.

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

Далее в программе мы устанавливаем ограничения скорости двигателя. MAX_SPEED — обозначает верхний предел скорости двигателя, а MIN_SPEED — нижнее значение, используемое для небольшого смещения влево. Значения скорости обычно находятся в диапазоне от 0 до 255 и могут быть скорректированы в соответствии с вашими конкретными требованиями.

В функции setup() мы зададим режимы работы используемых контактов: LEFT_MOTOR_PIN1, LEFT_MOTOR_PIN2, RIGHT_MOTOR_PIN1, RIGHT_MOTOR_PIN2 — на вывод данных, триггерные контакты S1Trig, S2Trig, S3Trig — также на вывод данных, а эхо-контакты S1Echo, S2Echo, S3Echo — на ввод данных. Также мы инициализируем последовательную связь со скоростью 9600 бод для целей отладки.

Следующий фрагмент кода содержит три функции (‘sensorOne()’, ‘sensorTwo()’, ‘sensorThree()’), ответственные за проведение измерений с помощью ультразвуковых датчиков.

Функция sensorOne() измеряет расстояние с помощью первого ультразвукового датчика. При этом при расчете расстояния предполагается что скорость звука равна 343 м/с. Деля на 29 и потом еще на 2 мы обеспечиваем приблизительное преобразование микросекунд в сантиметры.

Функции sensorTwo() и sensorThree() работают аналогичным образом, только для измерения расстояний используют второй и третий ультразвуковой датчики соответственно.

В функции loop() мы первым делом вызываем функции sensorOne(), sensorTwo() и sensorThree() для измерения расстояний от ультразвуковых датчиков. Эти расстояния мы сохраняем в переменных frontDistance, leftDistance и rightDistance. Затем мы выводим эти расстояния в окно монитора последовательной связи.

Далее в программе мы проверяем меньше ли расстояние от переднего датчика чем MIN_DISTANCE_BACK — это будет означать что препятствие находится очень близко. Поэтому робот в данном случае должен двигаться назад чтобы избежать столкновения — соответственно вызывается функция moveBackward().

Если предыдущее условие ложно, то проверяем следующее условие: если переднее расстояние меньше левого расстояния, меньше правого расстояния и меньше порога MAX_DISTANCE. Если это условие истинно, это означает, что переднее расстояние является наименьшим среди трех расстояний, а также ниже порога максимального расстояния. В этом случае вызывается функция moveForward(), чтобы заставить робота двигаться вперед.

Если предыдущее условие ложно, то проверяем следующее условие: если левое расстояние меньше чем правое расстояние, и меньше ли оно порога MAX_DISTANCE. Это условие указывает на то, что левое расстояние является наименьшим среди трех расстояний, а также ниже порога минимального расстояния. Поэтому вызывается функция TurnLeft(), чтобы заставить робота повернуть налево.

Если ни одно из предыдущих условий не выполняется, то проверяем следующее условие. Оно гарантирует, что правое расстояние меньше порога MAX_DISTANCE. Это условие предполагает, что правое расстояние является наименьшим среди трех расстояний и находится ниже порога минимального расстояния. Поэтому в данном случае вызывается функция TurnRight (), чтобы заставить робота повернуть направо.

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

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

https://circuitdigest.com/sites/default/files/other/human-following-robot.mp4

Заключение

Создание робота, следующего за человеком, с использованием платы Arduino и трех ультразвуковых датчиков — увлекательный и полезный проект, сочетающий в себе программирование, электронику и механику.

Роботы, следующие за человеком, имеют широкий спектр применений в различных областях, например, их можно использовать в розничных магазинах, торговых центрах и отелях для оказания персонализированной помощи клиентам. Роботы, следующие за человеком, могут использоваться в системах безопасности и наблюдения для отслеживания и наблюдения за людьми в общественных местах. Их можно использовать в сфере развлечений и мероприятий, ухода за пожилыми людьми, экскурсий, исследований и разработок, образования и исследований, а также личной робототехники.

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

Исходный код программы (скетча)

20 ответов к “Робот на Arduino следующий за человеком”

Я добавил ссылку на скачивание ваших файлов и ссылку на видео в текст статьи — в разделе под фото собранной конструкцией робота. Подскажите только, видео было три или было только одно?

ВИДЕО ОДНО, Я по ошибке три раза пульнул. По схеме поясните. Я его собрал , по подключению мотор редукторов . Ведь там строго надо полярность соблюсти. У меня он начинает движение сразу назад.

Это классическая проблема несоответствия полярности подключения моторов. Логика скетча действительно заставляет робота двигаться назад, когда передний датчик видит препятствие слишком близко (меньше MIN_DISTANCE_BACK, обычно 5-10 см). Если из-за ошибки подключения моторы вращаются в противоположную сторону, то при подаче команды «назад» робот поедет вперед, а при команде «вперед» — назад.

В вашем же случае робот начинает движение сразу назад, значит выполняется условие для движения назад. Это происходит, скорее всего, по двум причинам:
1. Передний ультразвуковой датчик (центральный) показывает очень маленькое расстояние (например, 0 или 2 см) из-за неверного подключения, помех или брака.
2. Вы перепутали контакты моторов: моторы подключены к драйверу L298N так, что при команде moveForward() они вращают колеса назад, а при команде moveBackward() — вперед. Но поскольку робот получает команду назад (по данным датчика), он едет… назад? Давайте разберем оба варианта.

Что делать по шагам
Шаг 1. Проверьте показания переднего датчика через монитор порта
Подключите Arduino к компьютеру, откройте монитор последовательного порта (скорость 9600 бод). Посмотрите, какие значения выводятся для frontDistance, leftDistance, rightDistance. Скорее всего, frontDistance будет очень маленьким (0…3 см) или постоянно меняться.
Решение:
Проверьте правильность подключения выводов переднего датчика: TRIG → pin 2, ECHO → pin 3 (как в статье).
Возможно, датчик неисправен или мешает отражение от корпуса робота. Попробуйте временно отключить передний датчик (только для теста) и посмотрите, перестанет ли робот ехать назад.

Шаг 2. Убедитесь, что полярность моторов логически верна
Для теста загрузите простой скетч, который заставляет робота ехать только вперед (moveForward()) на 2 секунды, потом стоп. Посмотрите, куда он едет.
Если он едет вперед — значит полярность правильная, проблема в датчиках.
Если он едет назад — значит перепутаны контакты моторов (плюс/минус) либо на драйвере, либо местами провода OUT1/OUT2 и OUT3/OUT4.
Как исправить:
Поменяйте местами провода одной из пар (например, OUT1 и OUT2 на драйвере) или измените в коде в функциях moveForward() и moveBackward() уровни HIGH/LOW на противоположные.

Шаг 3. Проверьте значение MIN_DISTANCE_BACK в коде
Возможно, оно установлено слишком большим (например, 30 см). Тогда робот будет считать, что перед ним препятствие, даже если оно далеко, и ехать назад.
Решение:
Откройте скетч и найдите строчку:
define MIN_DISTANCE_BACK 10 // или другое число
Увеличьте его до 3-5 см или временно поставьте 0, чтобы отключить движение назад. Загрузите скетч — если робот перестал сразу ехать назад, значит дело в пороге.

Шаг 4. Проверьте подключение питания драйвера L298N
Если питание драйвера недостаточное (например, аккумуляторы 3,7 В × 2 = 7,4 В, но они разряжены), драйвер может работать некорректно, моторы самопроизвольно дергаться. Убедитесь, что на вход +12V драйвера подается не менее 7 В (измерьте мультиметром).

Краткое резюме
Скорее всего, передний датчик «врет» из-за ошибки подключения или отражений. Проверьте его показания в мониторе порта. Если значения нормальные (больше 10 см) — тогда меняйте полярность моторов или переопределите в коде функции движения, поменяв местами digitalWrite(L_MOTOR_PIN1, HIGH/LOW).

при подключении к монитору порта нормально все три сонара показывают. имитируя препятствие все три сонара реагируют правильно. тут тоже все правильно// Distance thresholds for obstacle detection
#define MAX_DISTANCE 40
#define MIN_DISTANCE_BACK 5

// Maximum and minimum motor speeds
#define MAX_SPEED 100
#define MIN_SPEED 30
скорость немного уменьшил min и max. Поиграл с перестановкой полярности на моторах. У меня такая общая проблема. Я после пайки коммутационных проводов ( китайские тонкие ) заливаю место пайки термоклеем до изоляции. Ну такая практика сложилась ( чтоб металл CU в месте пайки не обламывался ). Все пины сонаров залиты термоклеем.Но плюсовые пины боковых сонаров доступны. Я их отпаял ( получается вывел эти сонары в нерабочее состояние ). Запустил робота в работу. Он стал работать по такому алгоритм — пару тройку секунд думает, потом едет вправо назад тож пару секунд, т.е. делает поворот примерно градусов на 100 ( не на девяносто градусов не под прямым углом , а именно примерно на 100 градусов ). Затем четко совершает движение вперед!!! На препятствие не реагирует. вот такой расклад. Может по этой информации что-то подскажешь куда дальше копать.

По вашему описанию и логу с монитора порта, все три сонара работают корректно. Проблема в том, что после отпаивания боковых сонаров (они теперь неактивны) и заливки контактов термоклеем, робот стал вести себя странно: сначала «думает», потом произвольно поворачивает (~100°), затем едет прямо и не реагирует на препятствия.

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

Главная причина: код «ждёт» показаний от отключённых сонаров
В коде, который вы используете, логика принятия решений построена на сравнении расстояний с трёх датчиков (frontDistance, leftDistance, rightDistance). Если боковые датчики отпаяны, их выводы ECHO (сигнальный) «висят в воздухе». Arduino читает с них случайный шум, который часто интерпретируется как 0 см или очень маленькое/большое хаотичное значение.
Это приводит к сбою в цепочке условий (if), которая находится в loop(). Робот не может выбрать правильное направление, «зависает» на пару секунд, затем выполняет какое-то действие по умолчанию (которое вы наблюдаете), а после начала движения препятствия не видит, потому что условие для движения вперёд (frontDistance < MAX_DISTANCE) может не выполняться из-за мусора с боковых датчиков. Конкретные шаги для решения (от простого к сложному) 1. Быстрый тест: закомментируйте боковые датчики в коде
Самый надёжный способ — временно убрать из логики «левые» и «правые» показания. Найдите в скетче функцию loop() и замените всю цепочку условий на упрощённый вариант, работающий только по переднему датчику:
void loop() {
frontDistance = sensorOne(); // Измеряем только передним датчиком
Serial.println(frontDistance);

if (frontDistance < MIN_DISTANCE_BACK) { moveBackward(); } else if (frontDistance < MAX_DISTANCE) { moveForward(); } else { stop(); } delay(50); } Если после загрузки такого скетча робот начнёт адекватно реагировать на препятствие спереди (ехать вперёд, когда рука близко, и назад, когда очень близко) — значит проблема точно в показаниях отпаянных боковых датчиков. Тогда нужно править основной код. 2. Правильная доработка основного кода (без боковых сонаров)
Если вы хотите permanently оставить только один передний датчик, измените логику основного скетча. Удалите вызовы sensorTwo() и sensorThree(), а в условия добавьте проверку, что показания левого/правого датчиков игнорируются (например, задайте им заведомо большое число, если датчик не используется).
Пример исправления в loop():
loop() {
frontDistance = sensorOne();
leftDistance = 999; // Игнорируем левый
rightDistance = 999; // Игнорируем правый

// … остальная логика (можно оставить как есть, но теперь left/right всегда большие)
}
Тогда условия if (leftDistance < rightDistance && leftDistance < MAX_DISTANCE) никогда не сработают, и робот будет реагировать только на передний датчик. 3. Аппаратная проверка: не мешает ли термоклей?
Хотя вы пишете, что в мониторе порта всё работает, термоклей на пинах сонаров может создавать микро-трещины или плохой контакт при вибрации или нагреве. Особенно если китайские провода тонкие. Попробуйте:
Аккуратно удалить термоклей с пинов переднего датчика (хотя бы с ECHO и TRIG).
Прозвонить мультиметром целостность соединений от пинов сонара до платы Arduino.

4. Проверьте питание после отпайки
Когда вы отпаяли боковые сонары, общая нагрузка на стабилизатор 5V Arduino уменьшилась. Это иногда приводит к повышению напряжения на линии 5V. Хотя это редкая проблема, она может влиять на логические уровни. Убедитесь, что на выводе 5V Arduino держится стабильно 4.8–5.2 В при работающих моторах.

Почему робот поворачивает (~100°) перед движением вперёд?
Это очень похоже на «отработку» случайных условий в цикле, пока показания с отпаянных датчиков «плавают». Например:
В первый момент leftDistance прочитался как 0 (шум), rightDistance = 999, frontDistance = 40.
Код видит: leftDistance < rightDistance и leftDistance < MAX_DISTANCE → вызывает TurnLeft(). При следующем проходе цикла значения шума изменились, и робот вызвал moveForward(). Из-за того, что двигатели инерционные, получается движение по сложной траектории. Вывод: что делать прямо сейчас
Загрузите упрощённый скетч из пункта №1. Убедитесь, что робот начал нормально ехать вперёд и назад на руку.
Если да — вернитесь к полному скетчу и задайте фиктивные большие значения для отключённых боковых датчиков (как в пункте №2).
Если нет — проверьте, не повреждён ли передний датчик или его провода под термоклеем (замените датчик).
И последнее: в коде из статьи есть важный нюанс — робот едет вперёд только когда переднее расстояние наименьшее из трёх (if (frontDistance < leftDistance && frontDistance < rightDistance && frontDistance < MAX_DISTANCE)). Если боковые датчики выдают 0, это условие никогда не выполнится. Поэтому робот и не едет вперёд на препятствие — он «думает», что слева или справа что-то ближе. Отключая боковые сонары, вы должны соответственно изменить это условие, как показано выше.

спасибо за оперативный и исчерпывающий ответ. Колесную платформу , STL — файл , смоделирую сам ( с учетом компоновки и размещения всех комплектующих на ней ) в КОМПАСЕ

Да и вам спасибо что цените мой труд. Мне тоже отрадно когда человек, собрав один проект с моего сайта, возвращается чтобы попробовать собрать другой.
Если у вас с проектированием этой платформы все успешно получится просьба прислать ее STL файл, прикреплю к статье — это может помочь другим энтузиастам, планирующих собрать данный проект

добрый день! файлы платформы пришлю сегодня или завтра. Они будут двух видов в STL и чертеже КОМПАСа ( может кто захочет что — то подправить под свои хотелки). И еще я не знаю как работать с файлообменниками, поэтому кину файлы прям сюда.

Добрый день! чет у меня не получается тут файлы STL и Компаса прикрепить. Может подскажите как это сделать. Или по какому нибудь другому варианту.

Добрый вечер. Здесь к комментариям к сожалению нельзя файлы прикрепить, движок сайта уже старый, не позволяет это сделать. А вы пользуетесь яндекс диском или облаком от mail.ru? Туда можно без проблем файлы загрузить и здесь написать ссылку на их скачивание. Если не пользуетесь, то могу вам на почту написать, а вы мне в ответном письме файлы пришлете

и еще следом один вопрос : Данный проект можно ли реализовать на плате Arduino NANO ?

добрый вечер! Дайте , пожалуйста, ссылку на STL файлы для печати платформы , на которой собирается данный проект. И еще вопрос — не пойму как вся конструкция собрана на одной колесной паре ( на одной оси ). Она же не сбалансирована, будет заваливаться вперед или назад? Заранее благодарю за ответ.

Добрый день. STL файлов для данного проекта нет, это обычная готовая колесная платформа, которую можно купить, к примеру, на Алиэкспресс. Конечно же в данном проекте не одна колесная пара, впереди у платформы есть еще колесо, его просто не видно на снимках

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

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