Сергей Коба

Сергей Коба

Веб, блокчейн, мобильная разработка и интернет вещей

Веб тимлид в MobiDev. Цель: изучать и учить чему-то новому без остановки. Основные языки: PHP и Ruby. Также интересно: блокчейн, мобильная разработка, IoT и DevOps. Жизненное кредо: я жив, пока я учу что-то новое.

Строим WiFi робота c камерой (Часть 1 - Ходовая)

21 февраля 2017 09:30

Всем привет! Недавно мне посчастливилось осуществить мечту детства и создать своего собственного робота. Идейным вдохновтелем выступил мой коллега из MobiDev Дима Кораблев, а компания любезно предоставила нам все состовляющие. Таким образом, был создан робот с гордым именем "Pluto":

Итак краткое ТЗ на робота выглядит следующим образом:

  • передвигается с помощью двух колес (третье сзади болтается само по себе);
  • управление осуществлется через браузер с доступом к интернет или локальной WiFi сети;
  • робот передает видео-поток с камеры в браузер в реальном времени;
  • "пилот" робота также может вращать камерой влево-вправо и вверх-вниз для дополнительного обзора.

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

Начать создавать Pluto можно было с разных частей, но я ожидаемо начал с его ходовой (о которой пойдет речь в данной статье), т.к. поскорее хотелой получить что-нибудь движущееся.

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

  • два электромотора постоянного тока (DC Motors) с колесам;
  • модуль драйвера двигателя L298N для управления моторами;
  • Arduino Uno R3 и плата расширения к нему Sensor Shield V5 (с ней подключать различный обвес робота гораздо проще);
  • пластиковая платформа из комплекта, на которую все это можно закрепить;
  • неплохо бы также сразу докупить стойки и крепеж М2 и М3 (винты и шайбы), он всегда пригодится;
  • ну и конечно кабеля, которыми мы будем соединять контакты на Sensor Shield и перефирии робота (я нашел их в остатках старых компьютерных запчастей).

Когда берешь это все в руки сразу возникает вопрос, где взять источник питания. Здесь нас ожидают первые подводные камни... Запитать это от вашего usb через Arduino получится, но моторы крутиться не будут, поэтому этот вариант не подходит. В наборе идет так называемый "Battery Holder" на 4 пальчиковых батарейки или аккумулятора

Для тех же кому повезло (как мне) или кто хочет подольше поездить, советую купить аккумуляторы посерьезнее. Например, мне подошли вот такие трехбаночные аккумуляторы на 11.8 вольт каждый. 

Почему их нужно два? Чтобы отдельно запитать моторы и электронику. Скачки напряжения при вращении колес могут плохо повлиять на  электронный "мозг" Вашего робота. Для начала хватит и одного (для моторов), а электронику запитаем через USB от компьютера. Не пробуйте запитать электронику от аккумулятора больше, чем 5В (необходимых для работы Arduino), для этого нужен трансформатор.

Приступим к базовой сборке! Соединим Arduino Uno R3 и Sensor Shield V5

Теперь подключим моторы к драйверу

Нестрашно, если Вы попутаете провода местами, моторы просто будут вращаться в другую сторону. Это можно будет исправить, поменяв провода местами (припаивать провода к моторам пришлось самим кстати). Следом подключаем дравйвер моторов к нашему Sensor Shield. Для подключения я выбрал следующие PIN-ы (контакты на плате)

ЦветНазначениеArduino Pin (контакт)
ЧерныйСкорость левого мотора (ENA)5
БелыйВращение левого мотора вперед (IN1)11
СерыйВращение левого мотора назад (IN2)9
ФиолетовыйВращение правого мотора вперед (IN3)8
СинийВращение правого мотора назад (IN4)7
ЗеленыйСкорость правого мотора (ENB)6

Пины ENA и ENB драйвера мотора необходимо подключить к пинам Arduino, которые обозначены на плате следующим символом "~", это так называемые пины, которые поддерживают ШИМ. В данном случае это 5 и 6 пины. Не советую подключать моторы к пинам 2 и 3, т.к. они поддерживают прерывания и понадобятся нам позже в следющих статьях.

Для разработки программ и прошивки Arduino я использовал стандартную Arduino IDE. Качаем, устанавливаем, подключаем Arduino к USB разъему

далее запускаем Arduino IDE. Под Linux лучше сразу запускать с правами администратора, т.к. они нужны для работы с USB портом (sudo ./arduino). Для начала мы напишем очень простую программу, которая вращает колеса  вперед и назад и умеет менять скорость вращения.

#define MotorLeftSpeedPin    5  // Левый (А) мотор СКОРОСТЬ — ENA
#define MotorLeftForwardPin 11 // Левый (А) мотор ВПЕРЕД — IN1
#define MotorLeftBackPin 9 // Левый (А) мотор НАЗАД — IN2
#define MotorRightForwardPin 8 // Правый (В) мотор ВПЕРЕД — IN3
#define MotorRightBackPin 7 // Правый (В) мотор НАЗАД — IN4
#define MotorRightSpeedPin 6 // Правый (В) мотор СКОРОСТЬ — ENB
void setup() {
/* настраиваем режим работы пинов */
pinMode(MotorLeftForwardPin, OUTPUT);
pinMode(MotorLeftBackPin, OUTPUT);
pinMode(MotorLeftSpeedPin, OUTPUT);
pinMode(MotorRightForwardPin, OUTPUT);
pinMode(MotorRightBackPin, OUTPUT);
pinMode(MotorRightSpeedPin, OUTPUT);
}
void loop() {
/* устанавливаем скорость моторов */
analogWrite(MotorRightSpeedPin, 80);
analogWrite(MotorLeftSpeedPin, 80);
/* едем вперед 2 секунды */
digitalWrite(MotorRightForwardPin, HIGH);
digitalWrite(MotorLeftForwardPin, HIGH);
digitalWrite(MotorRightBackPin, LOW);
digitalWrite(MotorLeftBackPin, LOW);
delay(2000);
/* устанавливаем скорость моторов */
analogWrite(MotorRightSpeedPin, 120);
analogWrite(MotorLeftSpeedPin, 120);
/* едем назад 2 секунды */
digitalWrite(MotorRightForwardPin, LOW);
digitalWrite(MotorLeftForwardPin, LOW);
digitalWrite(MotorRightBackPin, HIGH);
digitalWrite(MotorLeftBackPin, HIGH);
delay(2000);
}

Каждое изменение кода необходимо заново загружать в Arduino (стрелка вправо не тулбаре сверху "Upload"). Также не забудьте выбрать правильный USB порт в меню Tools -> Port.
Данный код содержит 2 функции: setup - выполняется 1 раз и содержит инициализацию и настройку пинов, loop - выполняется покругу, пока на Arduino подано питание. ШИМ пины ENA и ENB отвечают за скорость и отправка им данных происходит с помощью функции analogWrite, которая принимает значение от 0 до 255. Остальные пины отвечают за направление вращения моторов. Они имеют два состояния HIGH и LOW, которые изменяются функцией digitalWrite. При передачи значения на пин мы передаем его номер первым параметром, а вторым идет значение.

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

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

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

Вот и все на сегодня, а в следующей статье мы научим Pluto принимать основные команды по Serial порту, ездить вперед-назад и разворачиваться влево-вправо.

HAVE FUN!

Полный рабочий код Вы можете найти здесь.

Все статьи о Плуто доступны по следующим ссылкам:

Строим WiFi робота c камерой (Часть 1 - Ходовая)

Строим WiFi робота c камерой (Часть 2 - Первая поездка)

Строим WiFi робота c камерой (Часть 3 - Веб сервер)

Строим WiFi робота c камерой (Часть 4 - Камера)

Назад