Робот на smart car, объезжающий препятствия

В этой статье я покажу, как собрать простого робота объезжающего препятствия, используя Arduino.

Для этого нам понадобится следующие компоненты:

  • Плата Arduino UNO
  • Motor Drive Shield dual L239D
  • Сервопривод SG90
  • Ультразвуковой дальномер Ultrasonic Module HC-SR04
  • Платформа smart car на 4 колесах + 4 указателя скорости
  • Держатель для 6 батареек AA

Все компоненты можно приобрести на этом сайте 🙂

Как вы уже догадались, в качестве “глаз” мы будем использовать ультразвуковой дальномер. Он имеет угол обзора примерно 15 градусов. К сожалению, этого не достаточно для обеспечения наших задач. Сервопривод позволит нам обойти это ограничение и выступит в роли “шеи”. Все двигатели, сервопривод и дальномер подключать будем к шилду (Motor Drive Shield dual L239D). Возможности шилда позволяют нам подключить 2 сервопривода + на выбор:

  • 4 мотора постоянного тока с потреблением не больше 600mA, 4.5 – 36В
  • 2 мотора постоянного тока и один шаговый двигатель
  • 2 шаговых двигателя

На борту данного шилда имеется две микросхемы L293D (1). L-ка позволяет управлять слаботочными двигателями с током потребления до 600 мА на канал. Моторы подключаются к разъемам M1, M2, M3, M4 на шилде (2). Центральные выводы на пятипиновых клеммниках соединены с землей и служат для удобства при подключении пятипроводных шаговых двигателей. Для управления на прямую выводами L-ки (IN1, IN2, IN3, IN4), отвечающимими за выбор направления вращения, необходимо 4 вывода, а для двух микросхем целых 8. Для уменьшения количества управляющих выводов в игру вступает сдвиговый регистр 74НС595 (3). Благодаря регистру, управление сводится с 8-ми пинов к 4-ем.

Также, на плату выведены 2 разъема для подключения сервоприводов (4). Управление сервоприводами стандартное с помощью библиотеки Servo.h и никак не связано с библиотекой которую мы будем рассматривать далее.

Питание силовой части производится либо от внешнего клеммника (5) либо замыканием джампера (6).

500_adafruit_motor_shield_details

К явным минусам данного шилда можно отнести то, что он задействует практически все цифровые пины:

Выводы отвечающие за скорость вращения двигателей:

  • Цифровой вывод 11 – DC Мотор №1 / Шаговый №1
  • Цифровой вывод 3 – DC Мотор №2 / Шаговый №1
  • Цифровой вывод 5 – DC Мотор №3 / Шаговый №2
  • Цифровой вывод 6 – DC Мотор №4 / Шаговый №2

Выводы отвечающие за выбор направления вращения двигателей (подключены к микросхеме 74HC595): Цифровые выводы 4, 7, 8 и 12.

Выводы для управления сервоприводами (выведены на штырьки на краю платы):

  • Цифровой вывод 9 – Сервопривод №1
  • Цифровой вывод 10 – Сервопривод №2

В итоге незадействованными цифровыми выводами остаются только пины 2 и 13. Однако есть выход из данной ситуации. У нас остались незадействованные аналоговые входы A0-A5, их можно использовать как цифровые. К ним мы и будем подключить наш ультразвуковой дальномер. В коде они будут записываться как цифровые с 14 по 19.

Следующая проблема, которую необходимо решить – определиться с источником питания для робота. Варианты такие:

  • Питаем Arduino и моторы от одного источника постоянного тока: подключаем этот источник к DC-входу Arduino или EXT_PWR на шилде, замыкаем джампер JP1. Вообще, питать моторы и Arduino от одного источника питания – плохая идея, Arduino может постоянно сбрасываться и вообще нестабильно работать.
  • Питаем Arduino от USB, а моторы – от отдельного источника постоянного тока. Удаляем джампер JP1 на шилде, подключаем USB к Arduino, а питание моторов – на шилд в EXT_PWR.
  • Питаем Arduino и моторы от двух независимых источников постоянного тока. Удаляем джампер JP1 на шилде, подключаем первый источник через DC-вход к Arduino, а второй – в EXT_PWR на шилде.

Внимание: соблюдайте полярность на EXT_PWR: оно подается после высоковольтного защитного диода D1 на Arduino. Если вы все правильно подключили – светодиод должен загореться!

Я решил остановиться на последнем варианте и использовать крону для питания платы Arduino и 6 батареек типа AA для питания моторов.

145840

Настало время собрать все воедино:

  • втыкаем шилд в плату Arduino
  • подключаем моторы к шилду (разъемы M1, M2, M3, M4)
  • подключаем сервопривод к шилду (смотрим на маркировку на плате, чтобы не ошибиться пинами)
  • подключаем дальномер к шилду (Vcc – 5В, Gnd – земля, Trig – к пину A0, Echo – к пину A1)
  • подключаем питание

220258

И последний штрих – запускаем тестовую программу, которая будет управлять моторами: (для запуска потребуется библиотека AFMotor).

Надеюсь у вас все получилось и ваш робот сделал первые “шаги” 🙂

220309

Мы имеем следующие способности и компоненты робота:

  • 4 моторчика, каждым мотором мы можем управлять независимо от других
  • сервопривод с рабочим ходом +\- 85-90 градусов и большой скоростью поворота
  • ультразвуковой дальномер с углом обзора примерно 15 градусов

Зная характеристики и возможности железа, мы можем накидать алгоритм для программы:

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

Итак, задача ясна. Ниже представлена готовая и откомментированная программа. По-моему мнению, это наилучший способ разъяснить, как она работает 🙂

Помните, что робот имеет только один сервопривод – следовательно осматриваться он может только в одной плоскости и помехи, которые будут находится ниже и выше угла обзора дальномера, будут просто игнорироваться и робот в них врежется. Частично это можно обойти, играясь с этим условием (get_distance() < 50).

На этом все, спасибо за внимание 🙂

Видео с очень похожим роботом:

Инфомрация взята с:

  • http://zelectro.com.ua/Adafruit_motor_shield
  • http://mk90.blogspot.ru/2009/03/motorshield-adafruit.html
  • http://learn.adafruit.com/adafruit-motor-shield/overview

Материал прислал: Александр Укштейн

Возможно, вам потребуются файлы:

8 thoughts on “Робот на smart car, объезжающий препятствия

  1. Иван says:

    Спасибо автору! Искал информацию по сборке и наконец то нашел. Но по не опытности купил другую плату (UNO V3) и шилд на L298.

  2. Алик says:

    А возможно ли сделать так чтоб он постоянно вращал налево /направо сонар а не только когда увидит препятствие?

  3. Расул says:

    в программе косяк, при проверке кода выдает ошибки по 4-5 строкам, в программировании не силен

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