В этой статье я покажу, как собрать простого робота объезжающего препятствия, используя 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).
К явным минусам данного шилда можно отнести то, что он задействует практически все цифровые пины:
Выводы отвечающие за скорость вращения двигателей:
- Цифровой вывод 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 для питания моторов.
Настало время собрать все воедино:
- втыкаем шилд в плату Arduino
- подключаем моторы к шилду (разъемы M1, M2, M3, M4)
- подключаем сервопривод к шилду (смотрим на маркировку на плате, чтобы не ошибиться пинами)
- подключаем дальномер к шилду (Vcc – 5В, Gnd – земля, Trig – к пину A0, Echo – к пину A1)
- подключаем питание
И последний штрих – запускаем тестовую программу, которая будет управлять моторами: (для запуска потребуется библиотека AFMotor).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
#include "AFMotor.h" // Подключаем библиотеку для работы с шилдом // Подключаем моторы к клеммникам M1, M2, M3, M4 AF_DCMotor motor1(1); AF_DCMotor motor2(2); AF_DCMotor motor3(3); AF_DCMotor motor4(4); void setup(){ // Задаем максимальную скорость вращения моторов (аналог работы PWM) motor1.setSpeed(255); motor1.run(RELEASE); motor2.setSpeed(255); motor2.run(RELEASE); motor3.setSpeed(255); motor3.run(RELEASE); motor4.setSpeed(255); motor4.run(RELEASE); } void loop(){ // Двигаемся условно вперед одну секунду motor1.run(FORWARD); // Задаем движение вперед motor2.run(FORWARD); motor3.run(FORWARD); motor4.run(FORWARD); motor1.setSpeed(255); // Задаем скорость движения motor2.setSpeed(255); motor3.setSpeed(255); motor4.setSpeed(255); delay(1000); // Останавливаем двигатели /* Очень не рекомендуем резко переключать направление вращения двигателей. Лучше дать небольшой промежуток времени.*/ motor1.run(RELEASE); motor2.run(RELEASE); motor3.run(RELEASE); motor4.run(RELEASE); delay(500); // Двигаемся в обратном направлении motor1.run(BACKWARD); // Задаем движение назад motor2.run(BACKWARD); motor3.run(BACKWARD); motor4.run(BACKWARD); motor1.setSpeed(255); // Задаем скорость движения motor2.setSpeed(255); motor3.setSpeed(255); motor4.setSpeed(255); delay(1000); // Останавливаем двигатели motor1.run(RELEASE); motor2.run(RELEASE); motor3.run(RELEASE); motor4.run(RELEASE); delay(500); } |
Надеюсь у вас все получилось и ваш робот сделал первые “шаги” 🙂
Мы имеем следующие способности и компоненты робота:
- 4 моторчика, каждым мотором мы можем управлять независимо от других
- сервопривод с рабочим ходом +\- 85-90 градусов и большой скоростью поворота
- ультразвуковой дальномер с углом обзора примерно 15 градусов
Зная характеристики и возможности железа, мы можем накидать алгоритм для программы:
- робот должен ехать прямо, пока не увидит препятствие
- увидев препятствие, он должен оглядеться и определить оптимальный маршрут (поехать в ту сторону, где помеха находятся дальше или отсутствует)
- если препятствие оказалось слишком близко, робот по каким либо причинам его не заметил и уткнулся в него (слабая отражающая способность, крохотная преграда, или робот подъезжал к нему под таким углом, что звук просто не мог отразиться обратно) – необходимо отъехать назад и дальше следовать второму пункту данного алгоритма
- после завершения маневра ехать по прямой линии до следующей преграды
Итак, задача ясна. Ниже представлена готовая и откомментированная программа. По-моему мнению, это наилучший способ разъяснить, как она работает 🙂
Скачать код: Robot.zip
Помните, что робот имеет только один сервопривод – следовательно осматриваться он может только в одной плоскости и помехи, которые будут находится ниже и выше угла обзора дальномера, будут просто игнорироваться и робот в них врежется. Частично это можно обойти, играясь с этим условием (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
Материал прислал: Александр Укштейн
Возможно, вам потребуются файлы:
- библиотека AFMotor
Спасибо автору! Искал информацию по сборке и наконец то нашел. Но по не опытности купил другую плату (UNO V3) и шилд на L298.
обычно все по неопытности так и делают)))
А возможно ли сделать так чтоб он постоянно вращал налево /направо сонар а не только когда увидит препятствие?
да, это возможно. нужно изменить часть кода.
в программе косяк, при проверке кода выдает ошибки по 4-5 строкам, в программировании не силен
Возможно, вы не подключили библиотеку AFMotor.h
что означает 1t
а где это встречается?
Что такое < и >
Это не корректно отображались открывающая и закрывающая кавычки. Исправлено. Спасибо за замечание! 🙂
Вы выслали сообщение об ошибке, но не выслали ваш код, на который нужно посмотреть, чтобы указать вам на ошибку!
Вы выслали сообщение об ошибке, но не выслали ваш код, на который нужно посмотреть, чтобы указать вам на ошибку!
Вставлял выше написанную программу в 217 строк по управлению “робот smart car”(вся программа не записывается, вставляю первые строки).
// Подключаем нужные библиотеки
#include “Servo.h” // для работы с сервоприводом
#include “AFMotor.h” // для работы с шилдом
// задаем пины, к которым мы подключили ультразвуковой дальномер
…
Попробуйте скачать снова. Перезалил, сделал чтобы можно было скачать файлом.
Спасибо, закачал Вашу программу все пошло.