Роботы на arduino uno. Робототехнический набор Двухколёсный Robot Car

Заключительная часть статьи о маленьком роботе, которого мы собираем на шасси - крышке от пластикового контейнера для еды. Мозгом нашего робота является плата Arduino UNO, двигателями и сервоприводом управляет плата Driver Motor Shield, датчик препятствий - Ультразвуковой сонар - глазки как у Валли (из мультика) - «HC-SR04 Ultrasonic Sensor». , . Как создать робота на Arduino?

9. Подключение батареи и моторов

При подключении батареи нужно быть абсолютно уверенным в правильности соблюдения полярности, как говорится 7 раз отмерь, один раз подключи. Старайтесь соблюдать такое правило - красны провод всегда к + питания, черный провод - земля, он же минус, он же GND. Производители стараются соблюдать такие же правила. Поэтому провода идущие от аккумуляторного отсека подсоединяем к колодке +M и GND, на плате управления двигателями. Провода от ходовых двигателей подключаем к колодкам M1, M2 платы управления двигателями. Левая сторона, по ходу движения подсоединяется к колодке M1, правая сторона к колодке M2. По поводу полярности двигателей пока волноваться не стоит, её можно будет поменять, если во время теста пойдёт что то не так.

10. Проверяем полярность и правильность соединения модулей

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

11. Этап программирования Arduino

Программа в микроконтроллер Arduino заливается из компьютера, посредством USB кабеля и специальной программы - среды программирования и редактирования скетчей (программ) - Arduino IDE. Взять программу можно с сайта arduino.cc, раздел Download, там всегда можно скачать последнюю, самую свежую версию программы. После того как среда программирования установлена остаётся только выбрать из меню программы драйвера для какой платы вы хотите использовать, - в нашем случае Arduino UNO, и COM порт через который посредством эмуляции USB подключена Arduino. На этот счёт очень много всяческих мануалов, поэтому этот этап мы пропускаем (на всякий случай - меню Tools > Serial Port) .

Программу для микро робота можно с нашего сайта, правда только после регистрации, шутка Мини робот на Arduino. Для того чтобы программа заработала необходимы дополнительные библиотеки - AFMotor.h, Sevo.h, NewPing.h, все они есть в архиве, вам необходимо распаковать архив в папку установленной программы Arduino IDE. У меня -это директория c:Program Files (x86)Arduino, библиотеки нужно положить в папку c:Program Files (x86)Arduinolibraries. Затем войти в директорию c:Program Files (x86)ArduinolibrariesAPC_4_ROBOT и два раза щёлкнуть мышкой по APC_4_ROBOT.ino это и есть сам скетч, затем запустится среда программирования. Подсоединяем голую плату Arduino Uno (это значит без подключенных модулей) через шнур USB к компьютеру, жмём кнопку со стрелочкой в право, программа начнёт заливаться в контроллер. Весь процесс занимает несколько секунд, и если всё правильно подсоединено, то не должно загораться никаких красных надписей, а индикатор в нижнем правом углу закончит свое движение на 100%. Программа для Arduino установлена в контроллер Atmega328.

12. Запуск робота

Мини робот на Arduino — готов к движению. Robot Wally

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

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

P.S. Это был достаточно вольный перевод статьи найденной, когда-то давно, на бескрайних просторах интернет, больше конечно отсебятины, т.к всё делалось по новой, рисунки доработаны, ссылок на источник нет, потому как документ был вордовский.

В итоге получился довольно забавный робот , который может видеть перед собой препятствия, анализировать ситуацию и затем, только выбрав лучший маршрут, едет дальше. Робот получился очень маневренным. Он способен разворачиваться на 180 градусов, а угол поворота составляет 45 и 90 градусов. В качестве основного контроллера автор использовал Iteaduino, который является аналогом Arduino.

Материалы и инструменты для изготовления робота:
- микроконтроллер (Arduino или ему подобный Iteaduino);
- ультразвуковой датчик;
- держатель для батареек;
- китайские игрушки для создания колесной базы (можно купить готовую);
- кусачки;
- клей;
- провода;
- моторчики;
- ДВП;
- лобзик;
- транзисторы (D882 P).

Процесс изготовления робота:

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

Выбирая машинки, лучше всего брать игрушки с обычными колесами, так как, по словам автора, с такими шипами как у него, робот сильно скачет.

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


Шаг второй. Изготовление верхней крышки
Верхняя крышка робота изготавливается из ДВП, также для этих целей можно использовать толстый картон. В крышке можно увидеть прямоугольно отверстие, оно должно быть расположено так, чтобы ось сервопривода, которая будет в него вставлена, располагалась симметрично. Что касается отверстия посередине, то через него будут выводиться провода.


Шаг третий. Начинка робота
Для подключения шасси лучше всего использовать отдельный источник питания, поскольку для питания контроллера требуется 9В, а для моторчиков нужно всего 3В. Вообще в шасси таких машинок уже встроены держатели батареек, их просто нужно соединить параллельно.








К контроллеру моторчики подключаются при помощи транзисторов типа D882 P. Они были вытащены из старого пульта управления машинкой. Лучше всего конечно использовать силовые транзисторы типа TIP120Б, но автор выбирал просто по подходящим характеристикам. Вся электронная часть подключается по указанной схеме.

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

Что касается датчиков, то ультразвуковой нужно подключить к 7-му цифровому выходу микроконтроллера. Серводвигатель подключается к 3-му цифровому входу, база транзистора левого мотора подключается к 11 контакту, а база правого к 10-му.

Если в качестве питания будет использоваться Крона, то минус подключается к GND, а плюс к VIN. Еще к GND нужно подключить эмиттер транзистора и отрицательный контакт от источника питания шасси робота.

Давайте поговорим о том как можно использовать Ардуино для создания робота, который балансирует как Сигвей.

Сигвей от англ. Segway – двухколесное средство передвижения стоя, оснащенное электроприводом. Еще их называют гироскутерами или электрическими самокатами.

Вы когда-нибудь задумывались, как работает Сигвей? В этом уроке мы постараемся показать вам, как сделать робота Ардуино, который уравновешивает себя точно так же, как Segway.

Чтобы сбалансировать робота, двигатели должны противодействовать падению робота. Это действие требует обратной связи и корректирующих элементов. Элемент обратной связи - , который обеспечивает как ускорение, так и вращение во всех трех осях (). Ардуино использует это, чтобы знать текущую ориентацию робота. Корректирующим элементом является комбинация двигателя и колеса.

В итоге должен получиться примерно такой друг:

Схема робота

Модуль драйвера двигателя L298N:

Мотор редуктора постоянного тока с колесом:

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

Завершенный вариант самостоятельно балансирующего робота можно посмотреть на рисунке выше. В верхней части находятся шесть Ni-Cd-батарей для питания печатной платы. В промежутках между моторами используется 9-вольтовая батарея для драйвера двигателя.

Теория

В теории управления, удерживая некоторую переменную (в данном случае позицию робота), требуется специальный контроллер, называемый ПИД (пропорциональная интегральная производная). Каждый из этих параметров имеет «прирост», обычно называемый Kp, Ki и Kd. PID обеспечивает коррекцию между желаемым значением (или входом) и фактическим значением (или выходом). Разница между входом и выходом называется «ошибкой».

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

PID требует, чтобы значения Kp, Ki и Kd были настроены на оптимальные значения. Инженеры используют программное обеспечение, такое как MATLAB, для автоматического вычисления этих значений. К сожалению, мы не можем использовать MATLAB в нашем случае, потому что это еще больше усложнит проект. Вместо этого мы будем настраивать значения PID. Вот как это сделать:

  1. Сделайте Kp, Ki и Kd равными нулю.
  2. Отрегулируйте Kp. Слишком маленький Kp заставит робота упасть, потому что исправления недостаточно. Слишком много Kp заставляет робота идти дико вперед и назад. Хороший Kp сделает так, что робот будет совсем немного отклоняться назад и вперед (или немного осциллирует).
  3. Как только Kp установлен, отрегулируйте Kd. Хорошее значение Kd уменьшит колебания, пока робот не станет почти устойчивым. Кроме того, правильное Kd будет удерживать робота, даже если его толькать.
  4. Наконец, установите Ki. При включении робот будет колебаться, даже если Kp и Kd установлены, но будет стабилизироваться во времени. Правильное значение Ki сократит время, необходимое для стабилизации робота.

Поведение робота можно посмотреть ниже на видео:

Код Ардуино самобалансирующего робота

Нам понадобилось четыре внешних библиотеки, для создания нашего робота. Библиотека PID упрощает вычисление значений P, I и D. Библиотека LMotorController используется для управления двумя двигателями с модулем L298N. Библиотека I2Cdev и библиотека MPU6050_6_Axis_MotionApps20 предназначены для чтения данных с MPU6050. Вы можете загрузить код, включая библиотеки в этом репозитории .

#include #include #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #define MIN_ABS_SPEED 20 MPU6050 mpu; // MPU control/status vars bool dmpReady = false; // set true if DMP init was successful uint8_t mpuIntStatus; // holds actual interrupt status byte from MPU uint8_t devStatus; // return status after each device operation (0 = success, !0 = error) uint16_t packetSize; // expected DMP packet size (default is 42 bytes) uint16_t fifoCount; // count of all bytes currently in FIFO uint8_t fifoBuffer; // FIFO storage buffer // orientation/motion vars Quaternion q; // quaternion container VectorFloat gravity; // gravity vector float ypr; // yaw/pitch/roll container and gravity vector //PID double originalSetpoint = 173; double setpoint = originalSetpoint; double movingAngleOffset = 0.1; double input, output; //adjust these values to fit your own design double Kp = 50; double Kd = 1.4; double Ki = 60; PID pid(&input, &output, &setpoint, Kp, Ki, Kd, DIRECT); double motorSpeedFactorLeft = 0.6; double motorSpeedFactorRight = 0.5; //MOTOR CONTROLLER int ENA = 5; int IN1 = 6; int IN2 = 7; int IN3 = 8; int IN4 = 9; int ENB = 10; LMotorController motorController(ENA, IN1, IN2, ENB, IN3, IN4, motorSpeedFactorLeft, motorSpeedFactorRight); volatile bool mpuInterrupt = false; // indicates whether MPU interrupt pin has gone high void dmpDataReady() { mpuInterrupt = true; } void setup() { // join I2C bus (I2Cdev library doesn"t do this automatically) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin(); TWBR = 24; // 400kHz I2C clock (200kHz if CPU is 8MHz) #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire::setup(400, true); #endif mpu.initialize(); devStatus = mpu.dmpInitialize(); // supply your own gyro offsets here, scaled for min sensitivity mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); // 1688 factory default for my test chip // make sure it worked (returns 0 if so) if (devStatus == 0) { // turn on the DMP, now that it"s ready mpu.setDMPEnabled(true); // enable Arduino interrupt detection attachInterrupt(0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus(); // set our DMP Ready flag so the main loop() function knows it"s okay to use it dmpReady = true; // get expected DMP packet size for later comparison packetSize = mpu.dmpGetFIFOPacketSize(); //setup PID pid.SetMode(AUTOMATIC); pid.SetSampleTime(10); pid.SetOutputLimits(-255, 255); } else { // ERROR! // 1 = initial memory load failed // 2 = DMP configuration updates failed // (if it"s going to break, usually the code will be 1) Serial.print(F("DMP Initialization failed (code ")); Serial.print(devStatus); Serial.println(F(")")); } } void loop() { // if programming failed, don"t try to do anything if (!dmpReady) return; // wait for MPU interrupt or extra packet(s) available while (!mpuInterrupt && fifoCount < packetSize) { //no mpu data - performing PID calculations and output to motors pid.Compute(); motorController.move(output, MIN_ABS_SPEED); } // reset interrupt flag and get INT_STATUS byte mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus(); // get current FIFO count fifoCount = mpu.getFIFOCount(); // check for overflow (this should never happen unless our code is too inefficient) if ((mpuIntStatus & 0x10) || fifoCount == 1024) { // reset so we can continue cleanly mpu.resetFIFO(); Serial.println(F("FIFO overflow!")); // otherwise, check for DMP data ready interrupt (this should happen frequently) } else if (mpuIntStatus & 0x02) { // wait for correct available data length, should be a VERY short wait while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount(); // read a packet from FIFO mpu.getFIFOBytes(fifoBuffer, packetSize); // track FIFO count here in case there is > 1 packet available // (this lets us immediately read more without waiting for an interrupt) fifoCount -= packetSize; mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); input = ypr * 180/M_PI + 180; } }

Значения Kp, Ki, Kd могут работать или не работать. Если они этого не делают, выполните шаги, описанные выше. Обратите внимание, что наклона в коде установлен на 173 градуса. Вы можете изменить это значение, если хотите, но обратите внимание, что это угол наклона, которым должен поддерживаться роботом. Кроме того, если ваши двигатели слишком быстры, вы можете отрегулировать значения motorSpeedFactorLeft и motorSpeedFactorRight.

На этом пока всё. До встречи.

Но и с покупки готового полноценного робота на базе этой платы. Для детей начальной школы или дошкольного возраста такое готовые проекты Arduino даже предпочтительней, т.к. «неожившая» плата выглядит скучновато. Такой способ подойдет и для тех, кого электрические схемы не особо привлекают.

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

Мы предлагаем небольшой обзор готовых роботов на плате Arduino.

Машинка на Arduino, управляемая через Bluetooth

Машинка, управляемая через Bluetooth , стоимостью чуть менее $100. Поставляется в разобранном виде. Помимо корпуса, мотора, колес, литиевой батарейки и зарядного устройства, получаем плату Arduino UNO328, контроллер мотора, Bluetooth адаптер, пульт дистанционного управления и прочее.

Видео с участием этого и еще одного робота:

Более подробное описание игрушки и возможность купить на сайте интернет-магазина DealExtreme .

Робот-черепаха Arduino

Комплект для сборки робота-черепахи стоимостью около $90. Не хватает только панциря, все остальное, необходимое для жизни этого героя, в комплекте: плата Arduino Uno, сервоприводы, датчики, модули слежения, ИК-приемник и пульт, батарея.

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

Гусеничная машина на Arduino, управляемая с сотового телефона

Гусеничная машина, управляемая по Bluetooth с сотового телефона , стоимостью $94. Помимо гусеничной базы получаем плату Arduino Uno и плату расширения, Bluetooth плату, аккумулятор и зарядное устройство.

Гусеничную машину также можно купить на сайте DealExtreme , там же подробное описание. Может быть, более интересный железный Arduino-танк на Aliexpress .

Arduino-автомобиль, проезжающий лабиринты

Автомобиль, проезжающий лабиринты , стоимостью $83. Помимо моторов, платы Arduino Uno и прочего необходимого cодержит модули слежения и модули обхода препятствий.

Готовый робот или каркас для робота

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

Где еще купить готовых роботов

В обзоре мы выбрали наиболее дешевых и интересных на наш взгляд готовых Arduino-роботов из китайских интернет-магазинов. Если нет времени ждать посылку из Китая — большой выбор готовых роботов в интернет-магазинах Амперка и DESSY . Низкие цены и быструю доставку предлагает интернет-магазин ROBstore . Список рекомендованных магазинов .

Возможно вас также заинтересуют наши обзоры проектов на Arduino:


Обучение Arduino

Не знаете, с чего начать изучение Arduino? Подумайте, что вам ближе — сборка собственных простых моделей и постепенное их усложнение или знакомство с более сложными, но готовыми решениями?

Вы понимаете, - втолковывал редактор, - это должно быть занимательно, свежо, полно интересных приключений… Так, чтобы читатель не мог оторваться.
И.Ильф, Е.Петров "Как создавался Робинзон" .


Начинать работу с Arduino, как и с любой другой платформой программной или аппаратной, всегда интереснее с какого-нибудь реального проекта. Программисты при этом пишут код выводящий «Hello, world», ардуинисты моргают светодиодом. И все радуются как дети.


Я же решил начать с продвинутого проекта, в том числе с тайной надеждой оторвать молодое поколение от Counter-Strike (не получилось).


Как можно догадаться из названия RoboCar4W, первым проектом стал робот-машина о четырех колесах. Начиная работу я уже имел опыт программирования, умел когда-то давно паять, но совершенно не знал даже распиновки Arduino и документацию совершенно не читал. Все премудрости изучал по ходу пьесы и Гугл в помощь.


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


Всё "железо" приобреталось на ebay, и по своему опыту хочу сказать, что проще приобрести сразу стартер кит (ищите по словам Arduino Starter Kit), а не собирать подетально. Да и приедет все сразу вместе. Решено было не мелочиться, купить нормальное шасси, нормальные колеса, нормальные моторы, чтоб было "дорохобохато".


Главный секрет успешных покупок на eBay - покупать у продавцов с высоким рейтингом и при этом внимательно читать описание товара. Об этом есть много статей в интернете.


Какую плату семейства Arduino выбрать?


Я взял Arduino UNO, под нее много проектов с описаниями. Но сейчас бы взял Arduino Mega 2560, у нее больше цифровых и аналогов выводов и полная совместимость по проектам с UNO.

Общее описание проекта

В мире разработки программного обеспечения это называют еще «требования к системе».


Задумка проекта была следующей. Первый вариант машины-робота под названием RoboCar4W должен выполнять незамысловатые действия:

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

Второй вариант машины должен управляться вручную по bluetooth с Android телефона.


Чтобы вам лучше работалось вот весь финальный проект RoboCar4W в сборе (тут без блютуза).



Вот видео ходовых испытаний.


На первом видео RoboCar4W ездит в автоматическом режиме с объездом препятствий на двух разных версиях «прошивки», т.е. скетча, поэтому, если кто самый зоркий и заметил, что поведение робота в разных эпизодах немного отличается.



На втором видео RoboCar4W передвигается при помощи команд, передаваемых «водителем» по Bluetooth с мобильного телефона под Android. На телефоне установлена программа «Bluetooth RC Car». Причем, если близко впереди оказывается препятствие, то робот останавливается, т.е. протаранить что-нибудь не получится (однако есть «секретная» кнопка, которая отключает безопасный режим).



На третьем видео RoboCar4W показывает заранее запрограммированную демо-программу движения с поворотами. Демо-программа активируется по команде с того же мобильного телефона под Android. Робот просто едет некоторое время и делает повороты.

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

Ошибочно называть наш способ «алгоритм объезда препятствий» или «поиском пути». Это отдельные математические дисциплины, чистая математика. Если вам очень-очень сильно нравится математика, то погуглите указанные словосочетания, чтивом на полгода будете обеспечены.


Пока же нас интересуют вещи гораздо проще. Поэтому мы назовем это просто - алгоритм управления движением 4-х колёсного робота. Разумеется речь идет об автоматическом управлении без участия человека.


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

  1. Измеряем расстояние до препятствия впереди.
  2. Если это измеренное расстояние меньше значения DST_TRH_BACK (сокращение от distance threshold), то останавливаемся и едем задним ходом одновременно поворачивая. Направление поворота выбираем так: если ранее уже поворачивали влево, то поворачиваем вправо и наоборот.
  3. Если измеренное расстояние больше чем DST_TRH_BACK , но меньше чем DST_TRH_TURN , то просто поворачиваем. Направление поворота выбираем случайно.
  4. Если до препятствия далеко, то просто едем вперед.
  5. Повторяем все сначала.

Чем хорошо, что у нас 4 колеса и все ведущие? Мы можем выполнить (запрограммировать) несколько типов поворотов:

  • Плавный поворот. Все колеса вращаются, но колеса с одной стороны вращаются быстрее.
  • Резкий поворот. Колеса вращаются только с одной стороны.
  • Разворот на месте. Как трактор, колеса одной стороны вращаются назад, а другой - вперед.

Во втором варианте программы, при управлении с Android-телефона безопасный режим, когда робот старается не допускать лобовых столкновений, может быть отключен, если в программе два раза нажать кнопку


и включен обратно однократным её нажатием.


Важное примечание . Вся логика находится под управлением Arduino. Android здесь выступает просто как игровой пульт (без мозгов) от консоли, его задача - тупо передавать нажатия кнопок (т.е. команды) посредством Bluetooth в Arduino RoboCar4W.

Компоненты

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


Нет худа без добра, зато скетч стал немного проще.


На будущее, сервопривод покупайте самый простой и дешевый, особая мощность, скорость и точность поворота на заданный угол не нужны, а вывести серво из строя довольно легко, как оказалось. Вполне подойдет SG90 стоимостью $2.


Итак составные части проекта RoboCar4W, описание на английском дается для облегчения поиска на ebay и ему подобных:

  • Arduino UNO R3
  • Готовое шасси 4 Wheel Drive Mobile Robot Platform Smart Car Chassis Arduino Compatible
  • Моторы постоянного тока (DC) с вращением в обе стороны - 4 шт.
  • Колеса - 4 шт.
  • Плата для управления 4-мя DC моторами Motor Drive Shield L293D
  • Ультразвуковой измеритель расстояния HC-SR04 Ultrasonic Module Distance Measuring Sensor
  • Аккумуляторы Ni-MH 1.2 В - 8 шт.
  • Пластиковый бокс держатель для батареек, Battery Box holder 4 AA Batteries - 2 шт.
  • Аккумулятор типа «Крона» 8.4 В - 1 шт.
  • Опционально тумблер - выключатель питания

Шасси, DC моторы и колеса приобретались сразу в комплекте и даже с инструкцией по сборке.


Аналоговые входы могут использоваться как цифровые выводы портов ввода/вывода. Выводы Arduino, соответствующие аналоговым входам, имеют номера от 14 до 19. Это относится только к выводам Arduino, а не к физическим номерам выводов микроконтроллера Atmega.


Рисовать не обязательно, можно просто свести все в таблицу. У меня получилось так.



Пины D4, D7, D8, D12 будут заняты, если используются любые DC моторы или шаговые.


Пины D9 (Servo #1 control), D10 (Servo #2 control) будут заняты, только если используются сервомоторы.


Сама по себе плата для управления моторами Motor Drive Shield L293D пины Arduino не занимает.


Пины питания 3.3 В, 5 В и «земля» дублируются на Motor Drive Shield в достаточном количестве. Поэтому об их нехватке не стоит беспокоиться.


Если все-таки хотите красиво нарисовать, то бесплатная программа Fritzing вам в помощь.


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


В любом случае, если в поделке используете моторы, то Motor Drive Shield необходим (или подобная ему схема).


Итак, имеем 4 мотора постоянного тока (DC), сервопривод, саму плату Arduino и несколько датчиков. Моторы самые прожорливые, а вот датчики могут успешно запитываться с разъемов самой платы Arduino, поэтому с ними все просто. Для удобства я свел всё хозяйство в одну таблицу.


Напряжение рекомендованное или типовое. Потребляемый ток Максимальное напряжение Чем планируется питать Примечания
Плата Arduino UNO R3 7 - 12V, 200mA (среднее) 6 - 20 «Крона 9V» Li-ion 650mAh, 8.4V Разъем с плюсом в центре
Сервомотор MG-995 5-6 V, 0.1 - 0.3A (пиковое) 4.8 - 7.2 Аккумуляторы (5) шт. Ni-Mh 1.2V = 6V Питание только от отдельного источника. Если запитать вместе с Arduino, то будет глючить всё. Напряжения Ni-Mh аккумуляторов 4шт. * 1.2В = 4.8V не хватает. Некоторые утверждают, что данную серву не стоит использовать на 6 вольтах только 4,8
DC двигатели (4 шт.) 6 - 8V, ток от 70mA до 250mA 3 - 12 аккумуляторы (5+3) шт. Ni-Mh 1.2V = 9.6V Вы не сможете нормально запустить двигатели от 9В батареи, так что даже не тратьте время (и батареи)!
Motor Drive Shield L293D не требуется 4.5 - 36 не требуется
Модуль Bluetooth HC-0506 3.3 V, 50 mA 1.8-3.6 С пина 3.3V платы Arduino
Ультразвуковой измеритель расстояния HC-SR04 5 V, 2 mA 5 С пина 5V платы Arduino

DC/DC преобразователя напряжения у меня не было в наличии. Крона 9V оказался не очень хорошим источником питания, просто у меня он уже был.


А вот от использования Li-ion аккумуляторов большой емкости я отказался. Во-первых, из-за высокой стоимости, во-вторых в китайских интернет-шопах легко нарваться на подделку. Точнее не «легко», а «всегда». Кроме этого Li-ion требует особого обращения, и он не безопасен.


Итак, как видим из таблицы, нам требуется 3 независимых источника питания:

  • Для платы Arduino и датчиков.
  • Для сервомотора.
  • Для 4-х DC моторов.

Где ж столько набрать? Саму плату Arduino в любом случае надо питать от отдельного источника, т.к. при «проседании» напряжения, например от включения моторов, плата может перезагружаться или просто глючить. Здесь применяем аккумулятор форм-фактора «Крона 9В», причем разъем который будет подключаться к Arduino должен быть с «плюсом в центре».


Для сервомотора и 4-х DC моторов можно обойтись одним источником питания. Проблема только в том, что сервомотор рассчитан на напряжение 5-6В (максимум 7.2В) и ток 100 - 300мA (пиковое), а DC моторам требуется 6 - 8В (максимум 12В) и ток 250мА.


Для решения проблемы существуют DC-DC преобразователи, но у меня таких не оказалось. В итоге я применил свою "фирменную" схему соединения (безо всяких понижающих электронных схем, только экологически чистые напряжение и ток!): подключил 8 шт. аккумуляторов на 1.2V последовательно и сделал отводы в нужных местах, как показано на схеме.



6В пошло на сервомотор, а 9.6 на DC моторы. Понятно, что аккумуляторы 1--5 будут испытывать повышенную нагрузку.


Для управления серво и DC моторами использовал 4-х канальный Motor Drive Shield на базе микросхемы L293D.


Собрать готовое шасси небольшая проблема. Но не думайте, что без допиливания у вас всё сразу соберется. Поэтому приготовьте надфили.




Подключить нормально несколько моторов, сервомотор или шаговый напрямую к Arduino не удастся. Так как пины (выводы) Arduino являются слаботочными. Для решения проблемы существует дополнительный модуль управления приводами - Motor Drive Shield на базе микросхемы L293D, которая является одной из самых распространенных микросхем, предназначенных для этой цели. Чип L293D известен также как H-мост (H-Bridge).


Я использовал плату, которая обеспечивает 4 канала для подключения на двух микросхемах L293D и сдвиговом регистре. Приобретается на eBay за $5.


Данная плата модуля управления приводами имеет следующие характеристики.

  • L293D Motor Drive Shield совместим с Arduino Mega 1280 и 2560, UNO, Duemilanove, Diecimila
  • 4-х канальное управление
  • питание моторов от 4.5В до 36В
  • допустимый ток нагрузки 600мА на канал, пиковый ток - 1.2A
  • защита от перегрева
  • 2 интерфейса с точным таймером Arduino (не будет «дрожания») для подключения сервомоторов на напряжение 5В, если напряжение питания нужно повыше, то подключение по питанию нужно переделать как описано ниже
  • можно одновременно управлять 4 двунаправленными DC коллекторными моторами или 2 шаговыми, и 2 сервомоторами
  • 4 двунаправленные DC моторы подключены каждый к 8-битной шине для выбора индивидуальной скорости
  • подключение до 2 шаговых приводов (однополярных или биполярных), с одной катушкой, двойной катушкой или с чередованием шага
  • разъем для подключения внешнего источника для раздельного питания управляющей логики и моторов
  • Кнопка RESET Arduino
  • для управления используется библиотека Adafruit AFMotor.

Motor Drive Shield требует небольшой доработки, чтобы можно было после него хоть что-нибудь подключить. Я подпаял сверху необходимые разъемы, получилось вот что.



Моторы могут быть подключены к дополнительному по отношению к плате Arduino источнику питания. Я рекомендую именно такой способ подключения. Для этого нужно снять, разомкнуть перемычку, как показано на картинке.



В этом случае питание Arduino и питание моторов производится независимо друг от друга.


Светодиод на мотор-шилде светится при наличии питания для моторов, если он не горит, то моторы работать не будут.


Новая проблема.


Сервомоторов положение джампера питания не касается, они по прежнему будут запитаны от 5V Arduino. Так как сервомоторы обычно потребляют большой ток и если питания недостаточно, то всё устройство начинает глючить, в «лучшем» случае будет глючить только сервопривод - не будет поворачиваться на заданный угол, либо все время перед каждым поворотом поворачивать сначала в 0 градусов, а уже потом на заданный угол (и если будет успевать). Поэтому я рекомендую питать сервопривод также от дополнительного источника питания. Для этого придется немного переделать схему подключения: откусить плюсовой провод (обычно красный) от стандартного разъема и соединить его с плюсом источника питания напрямую.



При подключении Motor Drive Shield аналоговые пины не используются. Цифровые пины 2, 13 не используются.


Указанные ниже пины используются, только если подключены и используются соответствующие DC двигатели или шаговые двигатели (Stepper):

  • D11: DC Motor #1 / Stepper #1 (активация и контроль скорости)
  • D3: DC Motor #2 / Stepper #1 (активация и контроль скорости)
  • D5: DC Motor #3 / Stepper #2 (активация и контроль скорости)
  • D6: DC Motor #4 / Stepper #2 (активация и контроль скорости)

Эти пины будут заняты, если используются любые DC/steppers: D4, D7, D8, D12.


Указанные ниже пины будут заняты, только если используются соответствующие сервомоторы:

  • D9: Servo #1 управление
  • D10: Servo #2 управление


Для начала работы с Motor Drive Shield необходимо скачать и установить библиотеку Adafruit AFMotor .


Пример кода для управления моторами:


#include // подключить библиотеку Adafruit #include // подключить библиотеку для сервомотора AF_DCMotor motor(1); // создать объект мотор, указав номер разъема DC мотора на плате Motor Shiled и, опционально, частоту frequency Servo servo; // создать объект сервомотор servo.attach(10); // присоединить серво на пин 9 или 10 (крайний разъем на плате Motor Shiled) motor.setSpeed(speed); // установить скорость DC мотора от 0 (останов) до 255 (полный газ) motor.run(RELEASE); // DC мотор стоп motor.run(FORWARD); // DC мотор вперед motor.run(BACKWARD); // DC мотор назад servo.write(90); // повернуть серво на 90 град.

DC мотор у меня начал крутиться только при указании скорости больше 100, если меньше - просто жужжит. Минимальную скорость вашего мотора вам придется определить экспериментально.


Для моторов, подключенных к M1 и M2 можно задать частоту: MOTOR12_64KHZ, MOTOR12_8KHZ, MOTOR12_2KHZ, MOTOR12_1KHZ. Наибольшая скорость вращения достигается при 64KHz эта частота будет слышна, меньшая частота и скорость на 1KHz но и использует меньше энергии. Моторы 3 и 4 всегда работают на 1KHz другие значения игнорируются. По умолчанию везде 1KHz.


После этого необходимо прогнать тест моторов. . В начале скетча измените номер мотора в строке (или в строках) типа:


AF_DCMotor motor(…);

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


Подключаем ультразвуковой измеритель расстояния HC-SR04 Ultrasonic Module. Распиновка выводов:

  • Trig (T)
  • Echo (R)

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

  • максимум 240 мсек, если расстояние слишком велико (out of range)
  • минимум 1 мсек, если расстояние слишком мало
  • расстояние в 1.5 м определяется примерно за 10 мсек


Ультразвуковой датчик дальномер, в силу своей физической природы, а не потому что Китай, в некоторых случаях плохо определяет расстояние до препятствия:

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

Другими словами, для ультразвукового дальномера в идеале было бы отлично, если бы все препятствия имели вид твёрдой плоскости, перпендикулярной направлению излучения ультразвука.


Некоторые проблемы можно решить с помощью инфракрасного датчика расстояния. Но он тоже не идеален:

  • небольшая максимальная дальность по сравнению с ультразвуковым: 0,3-0,8 м против 4 м
  • большое минимальное расстояние по сравнению с ультразвуковым: 10 см против 2 см
  • зависимость чувствительности датчика от общей освещенности.

Хотя если установить эти дальномеры в паре, то эффективность их работы заметно повысилась бы.

Подключаем Bluetooth HC-05

Как видим из даташита основные пины «голого» HC-05:

  • TX (pin 1) передача
  • RX (pin 2) прием
  • 3,3V (pin 12) питание 3.3В
  • GND (pin 13) земля
  • PIO8 (pin 31) индикатор режима
  • PIO9 (pin 32) статус соединения, если соединение установлено, то на выходе будет высокий уровень
  • PIO11 (pin 34) для включения режима AT-команд

Наш модуль припаян к плате Breakout/Base Board, где уже есть делитель напряжения, поэтому диапазон рабочих напряжений у него от 3.3В до 6В.


Подключаем наш Bluetooth модуль в сборе:

  • Arduino (TX) - (RX) HC-05
  • Arduino (RX) - (TX) HC-05
  • Arduino (+5В) - (VCC) Bluetooth
  • Arduino (GND) - (GND) Bluetooth
  • пины LED, KEY не используются

После подачи питания на модуль Bluetooth HС-05 на нем должен заморгать светодиод, что означает работоспособность блютуза.


Включаем bluetooth на мобиле, находим устройство с именем HC-05 и подключаемся, пароль 1234.


Для тестирования заливаем в Arduino простой скетч:


int count = 0; void setup() { Serial.begin(9600); Serial.println("Test Arduino + Bluetooth. http://localhost"); } void loop() { count++; Serial.print("Count = "); Serial.println(count); delay(1000); }

На Android телефон устанавливаем Bluetooth Terminal. Подключаемся к устройству HC-05 и наблюдаем на экране телефона бегущие строки с увеличивающимся счетчиком.


Чтобы модуль мог принимать AT-команды, нужно его перевести в соответствующий режим - для этого нужно установить вывод KEY (PIO11) в логическую 1. На некоторых Breakout/Base Board вместо вывода KEY есть вывод EN (ENABLE), который может или не может быть припаян к выводу на самом чипе. Это касается только чипов HC05. Вот как раз у меня вывод EN платы никуда не припаян. Поэтому его можно припаять отдельным проводом к выводу KEY(PIO11) чипа. Либо во время работы, чтобы перевести HC05 в режим AT-команд на пару секунд закоротить вывод чипа KEY(PIO11) на вывод питания Vcc. Для HC06 вывод KEY не нужен.

Программное обеспечение

Примечание. Каждый раз перед загрузкой программы в Arduino, убедитесь, что модуль Bluetooth не подключен к Arduino. Это вызовет проблемы заливки скетча. Просто отсоедините питание от Bluetooth модуля или провода, соединяющие Arduino и RX, TX контакты модуля.


В начале скетча измените номера моторов в строках типа:


AF_DCMotor motor(…);

Если заменить строку


byte debug = 0;

byte debug = 10;

то включится режим отладки.


В режиме отладки робот RoboCar4W реально ездить или крутить колесами не будет. Вместо этого активируйте монитор последовательного порта и там увидите как он «ездит» виртуально. Вместо реальной езды вперед в монитор последовательного порта будет писаться строка «Forward», вместо заднего хода с поворотом влево - «Turn Back L(eft)» и т.д. Датчик ультразвукового измерения расстояния тоже ничего не делает, вместо этого расстояния до препятствий генерируются программно и случайно.

Добавить метки