Каких роботов можно собрать из arduino. Робот Arduino собственными руками. Для того, чтобы изготовить шилд понадобится

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

Список деталей:
1. Набор деталей корпуса и лап из оргстекла 1.5 мм.
2. Arduino Mega или Uno (используется Mega) - 1 шт.
3. Микро сервопривод (используются TowerPro SG90) - 8 шт.
4. Ультразвуковой дальномер HC-SR04 - 1 шт.
5. Аккумулятор размером 18560, 3.7V (используются TrustFire 2400 mAh) - 2 шт.
6. Держатель батарей размера 18560 (используется переделанный контейнер - упаковка) - 1 шт.
7. Стойка для печатной платы 25 мм. (используется вот такие стойки) - 4 шт.
8. Часть макетной платы.
9. Провода-перемычки.
10. Винт DIN 7985 M2, 8 мм. - 18 шт.
11. Гайка DIN 934 M2 - 18 шт

Сборка робота Z-RoboDog:

1. Корпус робота изготовлен из прозрачного оргстекла толщиной 1.5 мм. Все детали вырезаны лазером по чертежу сделанном в программе CorelDraw:

2. Склейте корпус секундным клеем. Прочности склеенного корпуса будет вполне достаточно. При сборке учитывайте положение отверстий на нижней крышке (смотрите на фото), а лучше приложите плату и убедитесь что всё совпадает. Боковые стенки крепите так, чтобы отверстия для проводов находились ближе к задней стенке. Более широкое отверстие на задней стенке предназначено для USB провода, учтите это при сборке.


3. Отметьте и просверлите отверстия (сверло 2 мм.). Закрепите сервоприводы в корпусе используя болты и гайки (пункты 10, 11 из списка). Валы передних сервоприводов должны быть ближе к передней стенке. Валы задних сервоприводов ближе к задней стенке.




4.1. Соберите лапы. Возьмите верхние части лап (с двумя отверстиями). Разметьте середину детали. Подставив качалку сервоприводов отметьте места крепления шурупами и просверлите отверстия (сверло 1.5 мм). Закрепите качалки так, чтобы шляпки шурупов были со стороны посадочных мест. Качалки закрепите с разных сторон и посадочные места для валов до были в противоположном направлении.


4.2. Отметьте и просверлите отверстия для крепления сервоприводов (сверло 2 мм). Валы закрепленных сервоприводов должны находиться ближе к узкому краю лапы.


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

5. Отметьте и просверлите отверстия для крепления ультразвукового дальномера (сверло 2 мм). Установите дальномер, ножки контактов должны быть направлены вверх.

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

Настройка и запуск робота Z-RoboDog:

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

Вот как у моей собачки выглядят лапы в крайних точках углов сервопривода (переменные zs1, zs2, zs3 и т.д). Постарайтесь лапы выставить как на фото. Визуально лапы должны быть в одинаковых положениях.

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


Программная часть Z-RoboDog:

Код очень простой, везде добавлены комментарии. Все движения находятся в массиве, чтобы не запутаться в цифрах я использовал переменные для каждого сервопривода. Например, s1 - сервопривод 1, s2 - сервопривод 2 и так далее. Для упрощения понимания предлагая вам вот такую схему.

На схеме пронумерованы лапы, каждая часть лапы ассоциируется с сервоприводом который её двигает. Также для каждой лапы указаны направления движения, знаки плюс и минус указывают куда будет двигаться лапа при увеличении или уменьшении угла. Исходными углами выбраны углы основной стойки (s1, s2, s3 и т.д.). Например если вам нужно вытянуть 2-ю лапу вы должны увеличить угол s3 и s4, в массиве это будет выглядеть так {s1,s2, s3+100,s4+50, s5,s6, s7,s8}. Вот полный скетч. Код писался в силу моих познаний, сообщите если я выбрал не правильный путь реализации.

Видео:


Скетч в архиве : У вас нет доступа к скачиванию файлов с нашего сервера

Но и с покупки готового полноценного робота на базе этой платы. Для детей начальной школы или дошкольного возраста такое готовые проекты 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. Предполагается, что читатель является новичком и обладает лишь начальными знаниями данного вопроса. Постараемся изложить все как-можно более подробно и понятно.

Итак, введение в задачу:

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

Теперь разберемся, что нам понадобится:

  1. Платформа (корпус). Здесь есть варианты: сделать самому всё, купить детальки и собрать из них, либо же купить готовое. Выбирайте, что душе угодно

В комплектеобычно идет платформа и по одному мотору на два ведущих колеса (гусенице) и отсек для батареек. Есть варианты полного привода - по мотору на 4 колеса. Для начинающих рекомендуем брать платформы танкового типа

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

  1. Далее, нам понадобиться дальномер. Сонар (он же дальномер, он же Ultrasonic module) В качестве дальномера изначально выбор был между ультразвуковым и инфракрасным. Поскольку характеристики ультразвукового существенно лучше (максимальная дальность около 4-5 метров, против 30-60 см), а цена примерно одинаковая, то выбор пал на Ultrasonic. Наиболее распространена модель HC-SR04.

  1. Драйвер двигателей.

Как быть? Первое что приходит в голову это - поставить на выход микроконтроллера транзистор и с него уже питать моторы. Это конечно хорошо, но не прокатит, если мы захотим мотор в другую сторону пустить… Зато с этой задачей хорошо справится H - мост, который представляем собой немного более сложную схему, чем пара транзисторов. Но в данном случае их полно в виде готовых интегральных схем, так что думаю велосипед изобретать незачем - купим готовый. К тому же цена располагает - 2-3 доллара…Двинемся дальше. Для этих целей купим микросхему L293D, или что еще лучше, Motor Shield на ее основе.

Motor shield на микросхеме L298N

  1. Генерация звука – пьезоизлучатель

Самым простым вариантом генерации звука является использование пьезоизлучателя.

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

Прямой пьезоэффект: в пьезозажигалках, для получения высокого напряжения на разряднике;

Обратный пьезоэлектрический эффект: в пьезоизлучателях (эффективны на высоких частотах и имеют небольшие габариты);)

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

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

Урок 2. Работа с ультразвуковым датчиком измерения расстояния (дальномером)

Урок 3. Arduino и Motor Shield на основе L298N

Урок 4. Воспроизведение звука – пьезоизлучатель

Урок 5. Сборка робота и отладка программы

В этой статье мы займемся постройкой своего робота с нуля. То, что у нас получится, смотрите на фото ниже. Робот будет ездить как самостоятельно, так и под управлением смартфона. А еще мы рассмотрим постройку своего мобильного робота с нуля.

3 D принтер

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

Вы можете сказать, что платформу самому делать неудобно и потребуется множество инструментов, начиная от кернера и заканчивая шлифовальным станком. А я говорю, что нам понадобится воображение и 3D принтер.

3D принтер? Всем, наверное, знаком обычный офисный принтер, который может распечатать на А4 нужный нам текст. Так вот, 3D принтер – это принтер, который может распечатать нужную деталь. Есть разные 3d принтеры. У меня принтер с технологией FDM (послойное наплавление). Какие еще есть технологии 3d печати, можно узнать в интернете.

Многие 3D принтеры работают на Arduino. При желании, можно собрать свой 3D принтер. Главная идея 3D принтера в том, что можно печатать абсолютно любую вещь, мы же напечатаем корпус для робота.

Для начала определимся с описанием платформы. Я хочу, чтобы платформа была двухколесной и в нее должны помещаться Arduino, питание, моторы и несколько датчиков.

Теперь нужно нарисовать макет платформы на бумаге и разместить на ней нужные компоненты. Например, вот так.

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

Вот такая платформа получилась у меня.

После этого нужно преобразовать 3D модель в G-код, понятный 3d принтеру. Для этого существуют специальные программы - слайсеры. Я использую программу Repetier-Host со слайсером Sli3er. Вот как выглядит деталь, готовая к распечатке.

А вот распечатанная модель.

Только недавно у нас была идея, а готовая деталь уже перед нами. С помощью 3D принтера можно создавать уникальные вещи в единичных экземплярах. 3D принтер – классная штука. Советую всем!

Моторы

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

Если кто помнит, мы уже пробовали подключать мотор к Arduino. Кто не помнит, не знает или не читал – смотрим . В подключении мотора с помощью MOSFET есть существенные недостатки – невозможно оперативно менять скорость и направление вращения. Пришло время научить Arduino управлять моторчиками по-настоящему!

Для этого можно использовать микросхему L293D. L293D позволяет управлять сразу двумя моторами, с током 600 мА на канал и пиковым до 1000 мА, а если объединить каналы – то до 1200 мА и 2000 мА пикового тока. Про объединение расскажу ниже.

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

Приступим. Соберем простенькую схему с одним мотором и порулим им. Внимание на схему сборки.

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

  • Пин 1 – Отвечает за скорость вращения мотора. Аналогичный - на пине 9. Принимает значения от 0 до 255, что без проблем можно организовать с помощью PWM.Я подсоединил EN к пятому пину Arduino, который поддерживает PWM.
  • Пины 2 и 7 – Отвечают за направление движения мотора. Аналогичные - на пинах 10 и 15. Подача логической единицы на один из этих пинов заставит мотор крутиться в одну сторону (зависит от подключения мотора), подача логической единицы на другой – заставит мотор крутиться в обратную сторону.
  • Пины 3 и 6 – К ним нужно подключать мотор. Полярность не важна, от подключения будет зависеть только направление вращения. Аналогичные - на пинах 11 и 14.
  • Пины 4 и 5 – Это земля. Думаю, не нуждается в пояснении. Аналогичные – 12 и 13.
  • Пин 8 – Питание для моторов. На него нужно подать питание в диапазоне от 4.5 до 36 Вольт
  • Пин 16 – на него подается логическая единица с Arduino. 5 Вольт, если что.

Отлично! Мотор подключили. Теперь можно и покодить.

#define FRW_BUT 7 //Кнопка "вперед" #define BCW_BUT 6 //Кнопка "назад" #define SPD 5 //Управление скоростью вращения... #define FRW 4 //...направлением вращения(вперед)... #define BCW 3 //...направлением вращения(назад) #define SPD_POT A5 int xspeed = 0; //Переменная для определения скорости вращения мотора int frw_move = 0; //Переменная для команды "вперед" int bcw_move = 0; //Переменная для команды "назад" void setup() { //Обозначаем пины pinMode(SPD, OUTPUT); pinMode(FRW, OUTPUT); pinMode(BCW, OUTPUT); pinMode(SPD_POT, INPUT); pinMode(FRW_BUT, INPUT_PULLUP); pinMode(BCW_BUT, INPUT_PULLUP); } void loop() { //Считываем показания с потенциометра //и приводим их в нужный диапазон - от 0 до 255 //После - передаем на пин регулировки скорости xspeed = analogRead(SPD_POT); constrain(xspeed, 0, 1023); xspeed = map(xspeed, 0, 1023, 0, 255); //Определяем нажатие кнопки "вперед" if(!digitalRead(FRW_BUT)) { frw_move = 1; } else { frw_move = 0; } //Определяем нажатие кнопки "назад" if(!digitalRead(BCW_BUT)) { bcw_move = 1; } else { bcw_move = 0; } //Вызываем функцию по отправке данных на L293D motor(); } void motor() { //Отправляем данные на L293D analogWrite(SPD, xspeed); digitalWrite(FRW, frw_move); digitalWrite(BCW,bcw_move); }

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

З.Ы. Да, знаю, что качество видео не супер, но постараюсь найти нормальную камеру и организовать место для съемки как можно скорее.

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

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

Второй способ – сверху на L293 напаять другую L293. Берем и напаиваем пин 1 к пину 1, пин 2 к пину 2 и так далее. Этот способ так же дает прибавку к силе тока в два раза, но, в отличие от первого – оставляет возможность управлять сразу двумя моторчиками. У вас может возникнуть идея – а не напаять ли мне еще парочку L293? К сожалению, последующая напайка микросхем не приведет к увеличению силы тока еще на 600 мА. Прибавка будет незначительна.

“Э-эх, придется убирать мой 12-Вольтовый мотор… “ Не спешите расстраиваться. Для более мощных моторов подойдет старший брат L293 - L298, но сейчас мы не будем его рассматривать. Это мы сделаем чуть позже.

Motor Shield

Согласитесь, что с таким пучком проводов выглядит это все не очень. Чтобы избавиться от него можно спаять схему с L293 на печатной или макетной плате для пайки, но что делать, если паять не хочется или не умеется? Для этого существуют готовые решения в виде шилдов для Arduino, например. Я расскажу про один из них – Motor Shield V1 от DK Electronics.

Вот, собственно, фото шилд.

На этом шилде установлены две L293D, что позволяет управлять сразу четырьмя моторами. Еще там есть два контакта для сервомоторов. Питание подается либо на клемник, либо, при установленной перемычке, с питания Arduino. Перемычка так же позволяет брать питание для Arduino с шилда. Для работы с этим шилдом существует специальная библиотека. Скачать ее можно .

К минусам платы. Для работы с шилдом используются почти все цифровые пины, кроме 0, 1, 2, 13. Как мы знаем, пины 0 и 1 используются Arduino для прошивки, поэтому их лучше не использовать.

Есть тут и хорошая сторона. Если не подключать сервы, например, освобождаются пины 9 и 10, а если не использовать какой-либо из моторов, то освободятся пины 3, 5, 6, 11, в зависимости от неиспользуемого мотора. И еще. Нам остаются доступны шесть аналоговых выходов, которые при желании можно использовать как цифровые.

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

Нам понадобятся

  • Arduino UNO – Можно использовать любую другую форм фактора Arduino UNO. Leonardo или Iskra, например.
  • Motor Shield – Подойдут и другие версии этого шилда.
  • Моторчики на 6В – Можно взять любые, подходящие по характеристикам к Motor Shield.
  • Колеса диаметром 42мм – Колеса подходящие к моторчикам и платформе
  • Крепления для моторчиков – Моторчики нужно прикрепить к платформе. Возьмите подходящие к вашей.
  • Питание – Я взял блок аккумуляторов и получил на выходе около 5 Вольт, что недостаточно для питания моторов и Arduino, поэтому я подключил DC/DC преобразователь и поднял напряжение до 9В. Если нет преобразователя, то можно воспользоваться обычной кроной, подключив ее к питанию Arduino.

Пришло время собрать нашего робота.

Шаг 1

Соединяем Arduino и Motor Shield.

Шаг 2

Собираем моторы и прикручиваем их на платформу.

Шаг 3

Собираем питание через повышающий преобразователь.

Для тех, у кого Крона. Не забудьте перемычку!

Шаг 4

Прикручиваем моторы к Motor шилду с Arduino.

Шаг 5

Добавляем питание.

Шаг 6 (Опционально)

Прикрепим крышку – для эстетики.

У нас есть готовый робот. Теперь пришло время его запрограммировать. Смотрим на код.

//Подключаем библиотеку для работы с Motor Shield #include //Определяем левый мотор на клеммник номер 2 AF_DCMotor l_motor(2); //Определяем правый мотор на клеммник номер 3 AF_DCMotor r_motor(3); //Переменные для определения скорости //и времени движения int spd = 50; int time(1000); void setup() { //Задаем начальную скорость и выключаем моторы l_motor.setSpeed(spd); l_motor.run(RELEASE); r_motor.setSpeed(100); r_motor. run(RELEASE); } void loop() { // Едем вперед l_motor.run(FORWARD); r_motor.run(FORWARD); l_motor.setSpeed(spd); r_motor.setSpeed(spd); delay(time); // Едем назад l_motor.run(BACKWARD); r_motor.run(BACKWARD); l_motor.setSpeed(spd); r_motor.setSpeed(spd); delay(time); // Крутимся против часовой стрелки l_motor.run(FORWARD); r_motor.run(BACKWARD); l_motor.setSpeed(spd); r_motor.setSpeed(spd); delay(time); // Крутимся по часовой стрелке r_motor.run(FORWARD); l_motor.run(BACKWARD); l_motor.setSpeed(spd); r_motor.setSpeed(spd); delay(time); }

Отлично! Время проверять. Вот видео с моей проверки. А у вас как?

“Ты что-то говорил про робототехнические платы?” – могут сказать те, кто читал вводный урок 2 части курcа. Да, такие платы есть. Рассмотрим робототехническую платформу Strela.

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

На ней- то и установлен старший брат L293 – L298. А еще пины выведены тройками, что как раз подходит для подключения многих датчиков.

Эту плату можно подключить вместо Arduino UNO и Motor Shield. Кроме того, ребята из Амперки написали библиотеку для работы со Стрелой, что делает управление моторами достаточно тривиальной задачей.

Для тех, кто не знал, рассказываю. К каждой нормальной библиотеке существуют примеры по ее использованию и библиотека для Стрелы не исключение. Для того чтобы их найти, заходим во вкладку Файл -> Примеры -> Strela. Там выбираем пример StrelaMotors, где выполняется скетч, похожий на скетч с использованием Motor Shield. Кстати, к Motor Shield тоже есть примеры. Если интересно – смотрите.

Что еще можно сделать со Стрелой – смотрите ниже.А мы переходим к беспроводной связи по Bluetooth.

Bluetooth

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

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

Это модуль HC-06. Я не буду особо вдаваться в подробности, но кому интересно, переходим . Наша цель – порулить роботом со смартфона. Начнем, пожалуй.

Для начала нужно подключить HC-06 к Arduino. Подключение будем осуществлять при помощи Software Serial. Эта библиотека позволяет эмулировать Serial Port на нужных нам пинах. Ради эксперимента попробуем сделать это на пинах A0(RX) и A1(TX). Зачем? Помним, что я рассказывал про Motor Shield.

Подключаем так:

  • Vcc – к 5V
  • GND – к GND
  • RX – к TX
  • TX – к RX

Я подключу HC-06 к роботу, которого мы собирали выше. Для этого воспользуемся тремя полосами на Motor Shield.

Робот готов. Осталось его запрограммировать.

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

Для того чтобы этого избежать, мы будем применять корректировочные коэффициенты. У меня левое колесо крутится намного быстрее, чем правое, поэтому я поставил коэффициент 0.62 для компенсации. Значение коэффициента подбирается экспериментальным путем.

// Подключаем библиотеки для работы с Motor Shield и Software Serial #include #include //Определяем пины для эмуляции SoftwareSerial mySerial(A0, A1); // RX, TX //Определяем левый мотор на клеммник номер 2 AF_DCMotor l_motor(2); //Определяем правый мотор на клеммник номер 3 AF_DCMotor r_motor(3); //Переменные для определения скорости //и корректировки вращения float spd = 70.0; float corr_l = 0.62; float corr_r = 1; float rot = 50.0; void setup() { //Задаем начальную скорость и выключаем моторы l_motor.setSpeed(spd); l_motor.run(RELEASE); r_motor.setSpeed(spd); r_motor. run(RELEASE); //Устанавливаем соединение с HC-06 mySerial.begin(9600); } void loop() { //Если появились данные, //вызываем функцию управления if (mySerial.available()) { drive(); } } void drive() { //Переменная для пришедших данных char control = mySerial.read(); //Для начала установим скорость if (((control - "0") >= 0) && ((control - "0") <= 9)) { spd = (control - "0") * 25.0; //сохраняем новое значение скорости } else if (control == "q") { spd = 255.0; } //Сравниваем команды, пришедшие со смартфона else if (control == "S") //Если пришла команда "S", стоим { l_motor.run(RELEASE); r_motor. run(RELEASE); } else if (control == "F") //Если пришла команда "F", едем вперед { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r); r_motor.run(FORWARD); l_motor.run(FORWARD); } else if (control == "B") //Если пришла команда "B", едем назад { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r); r_motor.run(BACKWARD); l_motor.run(BACKWARD); } else if (control == "I") //Если пришла команда "I", едем вперёд и направо { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r + rot); r_motor.run(FORWARD); l_motor.run(FORWARD); } else if (control == "J")//Если пришла команда "J", едем назад и направо { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r + rot); r_motor.run(BACKWARD); l_motor.run(BACKWARD); } else if (control == "G") //Если пришла команда "G", едем вперёд и налево { l_motor.setSpeed(spd * corr_l + rot); r_motor.setSpeed(spd * corr_r); r_motor.run(FORWARD); l_motor.run(FORWARD); } else if (control == "H") //Если пришла команда "H", едем назад и налево { l_motor.setSpeed(spd * corr_l + rot); r_motor.setSpeed(spd * corr_r); r_motor.run(BACKWARD); l_motor.run(BACKWARD); } else if (control == "R") //Если пришла команда "R", крутимся вправо { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r); r_motor.run(FORWARD); l_motor.run(BACKWARD); } else if (control = "L") //Если пришла команда "L", крутимся влево { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r); l_motor.run(FORWARD); r_motor.run(BACKWARD); } }

Робота прошили. Теперь займемся смартфоном.

RC controller

Для связи Arduino и смартфона через Bluetooth есть множество различных приложений. В поиске ключевыми словами будут: Arduino, Bluetooth, RC.

Я выбрал приложение под названием Bluetooth RC Controller. Оно идеально подойдет для нашей цели. При нажатии на кнопку приложение отправляет значение типа char на HC-06, который, в свою очередь, передает пришедшее значение Arduino. Значение, отправляемое при нажатии кнопки, устанавливается самостоятельно.

Чтобы установить соединение с роботом, нужно нажать на шестерню и выбрать пункт “Settings” В “Settings” нужно убедиться, что кнопки соответствуют этим отсылаемым символам, либо изменяем код Arduino.

После настройки символов можно устанавливать соединение с HC-06. Жмем на шестерню и заходим в “Connect to car” Открывается окно с сопряженными устройствами. В нем выбираем HC-06. Если его нет, то ищем с помощью “Scan for devices”. Если устройство найдено, но не хочет сопрягаться, то заходим в Bluetooth на смартфоне и сопрягаем, как обычно. Пароль стандартный – 1234. После этого заходим в “Scan for devices” и соединяемся.

Когда соединение установится, загорится зеленый огонек сверху, а HC-06 перестанет моргать. Можно начинать рулить. Полоска сверху отвечает за скорость движения.

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

Для этого нужно подключить XBee к Стреле, прошить ее скетчем из примеров под названием “ArduinoBluetoothRCCarOnStrela” и подключиться к XBee через RC controller.

Советы

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

Колеса крутятся не в те стороны, в какие хотелось бы – эта проблема легко устраняется путем перестановки проводов в клемниках или программно.

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

Робот не едет прямо – я описывал эту проблему чуть выше, когда рассказывал про Bluetooth и Motor Shield.

При езде робот неожиданно останавливается и теряется соединение с HC-06 – проблема в источнике питания. Мы знаем, что Arduino нужно не менее 7В для стабильной работы, а еще мы знаем, что моторчики очень хорошо кушают. Если поднести щупы мультиметра к клеммникам подачи напряжения и измерить напряжение при выключенных моторах, а потом их включить, то можно увидеть, что напряжение на мультиметре упадет. Причем упасть напряжение может по-разному.

Если подключен источник питания, который не может обеспечить достаточный ток для моторов, то напряжение может упасть сильно, с 9 до 5 Вольт, например, а 5В уже не будет хватать для Arduino и она перезапустится. Решение – подключить более мощное питание. Как рассчитать, я расскажу ниже.

Если подключить источник питания мощнее, то просадка напряжения может быть только в течение нескольких миллисекунд, но и их может оказаться достаточно для перезапуска контроллера. Решение – параллельно проводам питания установить конденсатор не менее чем на 1000мкФ, емкость можно определить экспериментально. Я ставил конденсатор на 3300 мкФ и на 16В. Не забываем смотреть на максимальное напряжение конденсатора.

Когда источник питания достаточно мощный, просадки напряжения не более 0.2В.

Несколько советов для начинающих робототехников

Начиная планировку робота, первым делом желательно позаботиться о расчёте мощности силовой части и подборе соответствующего источника питания. Будет обидно, если 4 батарейки ААА не потянут твои 4 6-вольтовых мотора, а места для более источника питания не останется.

Для расчета мощности ищем характеристики моторов, плат, датчиков. Из курса физики знаем, что мощность можно рассчитать по формуле P = IU, где I – сила тока, U – напряжение. С помощью этой формулы и характеристик легко рассчитать потребляемую мощность готового устройства, а зная потребляемую мощность и рабочее напряжение питания, можно узнать оптимальную силу тока, необходимую для работы устройства, зная силу тока, можно определиться с необходимой емкостью аккумулятора и время работы устройства от выбранного аккумулятора.

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

Если есть цель сделать “пароль” из трех символов, то не стоит программировать все три сразу. Лучше сделать пароль из одного символа, проверить его, потом из двух, а после проверки – из трех. Мне помогает.

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

Заключение

Робототехника – классная штука! В скором времени, я думаю, роботы займут, а то и уже заняли место в жизни людей. Мы сделали простейшего робота-машинку с управлением со смартфона, позже займемся более серьезными проектами, ну а пока – до скорого!

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



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

Codebender – это браузерный IDE, это самый простой способ программировать вашего робота из браузера. Нужно кликнуть на кнопку «Run on Arduino» и все, проще некуда.

Вставьте батарейку в отсек и нажмите на функциональную кнопку один раз, и робот начнет движение вперед. Для остановки движения нажмите на кнопку еще раз.

/* Arduino Obstacle Avoiding Robot with a servo motor and an ultrasonic sensor HC-SR04 LED and buzzer */ //Библиотеки #include #include "Ultrasonic.h" //Константы const int button = 2; //Пин кнопки на пин 2 const int led = 3; //Пин светодиода (через резистор) на пин 3 const int buzzer = 4; //Пин пищалки на пин 4 const int motorA1= 6; //позитивный (+) пин мотора A на пин 6 (PWM) (от модуля L298!) const int motorA2= 9; //негативный пин (-) мотора A на пин 9 (PWM) const int motorB1=10; // позитивный (+) пин мотора B на пин 10 (PWM) const int motorB2=11; // негативный пин (-) мотора B на пин 11 (PWM) Ultrasonic ultrasonic(A4 ,A5); //Создаем объект ultrasonic(trig pin,echo pin) Servo myservo; //Создаём объект Servo, чтобы контролировать сервоприводы //Переменные int distance; //Переменная для хранения дистанции до объекта int checkRight; int checkLeft; int function=0; //Переменная для хранения функции робота: "1" – движение или "0" - остановлен. По умолчанию остановлен int buttonState=0; //Переменная для хранения состояния кнопки. По умолчанию "0" int pos=90; //переменная для хранения позиции серво. По умолчанию 90 градусов- датчик будет смотреть вперёд int flag=0; //полезный флаг для хранения состояния кнопки, когда кнопка отпущена void setup() { myservo.attach(5); //Серво-пин соединён с пином 5 myservo.write(pos); // говорит сервоприводу идти на позицию в переменной "pos" pinMode(button, INPUT_PULLUP); pinMode(led, OUTPUT); pinMode(buzzer, OUTPUT); pinMode(motorA1,OUTPUT); pinMode(motorA2,OUTPUT); pinMode(motorB1,OUTPUT); pinMode(motorB2,OUTPUT); } void loop() { //Проверка состояния кнопки buttonState = digitalRead(button); unsigned long currentMillis = millis(); //считаем... //Меняет главную функцию (остановлен/двигается) когда кнопка нажата if (buttonState == LOW) {//Если кнопка нажата единожды... delay(500); if (flag == 0){ function = 1; flag=1; //меняем переменную флага } else if (flag == 1){ //Если кнопка нажата дважды function = 0; flag=0; //меняем переменную флага снова } } if (function == 0){ //Если кнопка отжата или нажата дважды, то: myservo.write(90); //установить для серво 90 градусов – датчик будет смотреть вперёд stop(); //робот остаётся неподвижным noTone(buzzer); //пищалка выключена digitalWrite(led, HIGH);// и диод горит } else if (function == 1){//Если кнопка нажата, то: //Считываем дистанцию... distance = ultrasonic.Ranging(CM); //Совет: Используйте "CM" для сантиметров и "INC" для дюймов //Проверяем на наличие объектов... if (distance > 10){ forward(); //Всё чисто, двигаемся вперёд! noTone(buzzer); digitalWrite(led,LOW); } else if (distance <=10){ stop(); //Обнаружен объект! Останавливаемся и проверяем слева и справа лучший способ обхода! tone(buzzer,500); // издаём звук digitalWrite(led,HIGH); // включаем светодиод //Начинаем сканировать... for(pos = 0; pos =0; pos-=1){ //идём от 180 градусов к 0 myservo.write(pos); // говорим серво пройти на позицию в переменной "pos" delay(10); // ждём 10 мс, пока сервопривод достигнет нужной позиции } checkRight= ultrasonic.Ranging(CM); myservo.write(90); // Датчик снова смотрит вперёд //Принимаем решение – двигаться влево или вправо? if (checkLeft checkRight){ right(); delay(400); // задержка, меняем значение при необходимости, чтобы заставить робота повернуться. } else if (checkLeft <=10 && checkRight <=10){ backward(); //Дорога перекрыта... возвращаемся и идём налево;) left(); } } } } void forward(){ digitalWrite(motorA1, HIGH); digitalWrite(motorA2, LOW); digitalWrite(motorB1, HIGH); digitalWrite(motorB2, LOW); } void backward(){ digitalWrite(motorA1, LOW); digitalWrite(motorA2, HIGH); digitalWrite(motorB1, LOW); digitalWrite(motorB2, HIGH); } void left(){ digitalWrite(motorA1, HIGH); digitalWrite(motorA2, LOW); digitalWrite(motorB1, LOW); digitalWrite(motorB2, HIGH); } void right(){ digitalWrite(motorA1, LOW); digitalWrite(motorA2, HIGH); digitalWrite(motorB1, HIGH); digitalWrite(motorB2, LOW); } void stop(){ digitalWrite(motorA1, LOW); digitalWrite(motorA2, LOW); digitalWrite(motorB1, LOW); digitalWrite(motorB2, LOW); }

Нажав кнопку «Edit», вы можете редактировать скетч для своих нужд.

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

Если робот не двигается, может изменить контакты электромоторов (motorA1 и motorA2 или motorB1 и motorB2).

Шаг 7: Завершенный робот

Ваш самодельный робот, обходящий препятствия, на базе микроконтроллера Arduino готов.