Официальный сайт компании Arduino по адресу arduino.cc
Ардуино робот для начинающих
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Втр, 08/05/2012 - 12:16
Собрал робота на Ардуино Уно с ИК дальномером. Так как являюсь новичком в програмировании и робототехнике, то и проект соответственно для начинающих.
Статья с кодом на него и описанием деталей для сборки blogs.servodroid.ru/blog/arduino/41.html
Не понял как вставить видео и отредактировать сообщение выкладываю ссылку на ютуб youtu.be/k5TQm1x-VE8
Написал алгоритм для поиска предметов.
Модернизировал немного робота на ардуино. Приделал две лапки. Так же в качестве эксперимента подцепил к нему МП3 с активной колонкой, чтобы он мог комментировать свои действия.
Алгоритм и описание выложил так же в блоге blogs.servodroid.ru/blog/arduino/41.html
Вот видео. www.youtube.com/watch
Класс!!!
Изменения: переписал программу для поиска предметов. Впереди установил две оптопары, в качестве датчиков поверхности. Теперь робот сам может убирать со стола. Голос роботу вырезал из мультфильма робот Wall-e (робот уборщик). Код откомментирован, но возможно не идеальный. . Так как опыт программирования не большой.
Вот видео http://www.youtube.com/watch?v=IYgUkcRdluA
Ну и сам код
Клево!
А ты в конкурсе не желаешь поучаствовать?
в конкурсе не желаешь поучаствовать?
Как буду готов маякну.
tu plastik . Нуу пока это обычная тележка с колесами. Четыре мотор редуктора лишнее, аккумов надолго не хватит, ведь еще датчики навешивать, а они тоже потребители. Цены в магазине по вашей ссылке вполне приемлимы. Мне лично драйвер моторов калининградский больше нравиться, на нем сразу выведены разъемы под 4 сервы, есть функция электротормоза, и под него написана библиотека., хотя он и на 1 А.
Подпрограмму движения, в приведенном вами коде, проще занести в void setup(), а в void loop() уже ее вызывать, код будет намного меньше в дальнейшем при "навешивании датчиков".
Подпрограмму движения, в приведенном вами коде, проще занести в void setup(), а в void loop() уже ее вызывать, код будет намного меньше в дальнейшем при "навешивании датчиков".
Спасибо за ответ. В написании кода не селен. Поэтому мне даже не понятен ваш совет с void loop() если не трудно поисните.
Ок !!! Все понял разобрался сам. Евгений подскажите а почему при компилировании вашего кодаа у меня появляется ошибка ?
LMotorShield lms;
LMotorShield does not name a type
подскажите а почему при компилировании вашего кодаа у меня появляется ошибка ?
LMotorShield lms;
LMotorShield does not name a type
Потому что у вас не загружена библиотека для мотор шилда. Я использовал http://robocraft.ru/blog/arduino/657.html такой. Под него написана библиотека LMotorShield.h. В своем коде я ее использовал для управления сервами и использовал функцию электротормоза. Можно обойтись и без нее, нужнно будет только переписать команды на сервы и MotorStop, MotorRun.
Спасибо Евгений. А вы еще случаем не подскажете гдеможно взять библиотеку для серводвигателей. Задача такова.
- серва в положении ноль .
- две кнопки право лево
- жму вправо серва в право
- - жму лево соответственно влево.
не чего нежму останавливается в свободном положении .
заранее спасибо
гдеможно взять библиотеку для серводвигателей.
Дак прямо в arduino 1.0 есть библиотека серво, и примеры должны быть. sketch/import Library/servo
А какую роль играют функции
motorStop и motorRun?
Я так понимаю можно и так записать, суть та же?
Что эти функции обеспечивают? Можно ли без них обойтись?
motorStop это функция, реализованная на примененном моторшылде. Позволяет осуществить динамическое торможение, то есть торможение без инерции. Можно конечно и без нее, но как будет набегать погрешность неизвестно. Вот статья по нему
http://robocraft.ru/blog/arduino/657.html
Круто!
Спаибо зо хорошее описание.
А ссылку можете обновить?
Старая не открывается- "Статья с кодом на него и описанием деталей для сборки blogs.servodroid.ru/blog/arduino/41.html"
Хотелось бы посмотреть и схему.
Извеняюсь за поздний ответ. http://www.servodroid.ru/forum/48-608-1 Здесь описаны комплектующие на него, будут вопросы спрашивайте.
круто, как для новичка офигенно круто
если заменить с ИК на ультрозвук что там нужно поменять в коде подскажи ?
Извеняюсь за поздний ответ. http://www.servodroid.ru/forum/48-608-1 Здесь описаны комплектующие на него, будут вопросы спрашивайте.
если заменить с ИК на ультрозвук что там нужно поменять в коде подскажи ?
если заменить с ИК на ультрозвук что там нужно поменять в коде подскажи ?
Если пойти дальше, то окажется, что ультразвуковой датчик имеет гораздо более широкую диаграмму направленности, а потому снимать расстояние для 18 разных углов бессмысленно - достаточно 3-5.
Ну и желательно бы поправить ошибки в коде, например, если мы поворачиваем серву на некоторый угол, то следует СНАЧАЛА подождать, пока она повернется, и только ПОТОМ измерять расстояние, а не наоборот.
если заменить с ИК на ультрозвук что там нужно поменять в коде подскажи ?
Если пойти дальше, то окажется, что ультразвуковой датчик имеет гораздо более широкую диаграмму направленности, а потому снимать расстояние для 18 разных углов бессмысленно - достаточно 3-5.
Ну и желательно бы поправить ошибки в коде, например, если мы поворачиваем серву на некоторый угол, то следует СНАЧАЛА подождать, пока она повернется, и только ПОТОМ измерять расстояние, а не наоборот.
Слабо все это сделать для навичка
Главное - начать.
Приветствую всех. Попытался повторить робота-уборщика представленного здесь. Сразу скажу не хочет РОБОТяга работать как у автора. Естественно это моя первая попытка разобраться в программировании Ардуино и пару месяцев изучения темы не смогли внести ясность в понимании того что я делаю не так. Питание силовой части организовал отдельно от Ардуинки.
Немного изменил компоненты робота:
1. Вместо LMotorShield подключил движки к драйверу на L298N
2. Вместо ИК дальномера SHARP GP2D120 использовал SHARP GP2Y0A41SK аналогичный по техническим характеристикам (дальность от 4 до 30 сантиметров).
3. Подключал всё к Ардуино UNO для удобства через Arduino Sensor Shield v 5.0
Вот данные подключения:
Analog 0 - ИК радар Sharp
Analog 1 - 1-й ИК датчик поверхности
Analog 2 - 2-й ИК датчик поверхности
Digital 2 и 7 - мотор А вращение
Digital 3 - ШИМ мотора А
Digital 2 и 7 - мотор В вращение
Digital 3 - ШИМ мотора В
Digital 6 - серва головы
Digital 10 - серва левой лапки
Digital 9 - серва правой лапки
Вот скетч от автора, немного неумело переделанный мной под мою распиновку:
Теперь о грустном, о проблемах с которыми я столкнулся: Если отключить двигатели и двигать робота руками, то всё работает отлично. Он вертит головой, как увидит препятствие перестаёт "оглядываться", далее поворачиваешь его к нему и продвигаешь вперёд. Далее он отворачивает голову, захватывает лапами предмет и после дальнейшего его продвижения вперёд отпускает предмет у края стола.
Но если подключаешь двигатели, то робот начинает жить своей жизнью. После того как он увидит препятствие, он замирает (останавливается) вместо того, чтобы повернуться к предмету и подъехать к нему. Двигатели конечно продолжают работать, но как-то в полсилы и ему не хватает мощи для поворота.
Чаще всего просто не замечает никаких предметов, а проносится мимо до края стола (грешу на дальность ИК дальномера Sharp (от 4 до 30 сантиметров)), срабатывают датчики поверхности, он резко рвёт немного назад разворачивается. При повторном подъезде к краю он уже не останавливается а падает в пропасть....
Не стал смотреть код, поскольку ваше описание проблем полностью подпадает под понятие "разводка питания и помехи". :)
1. L298N "жрет" примерно 1-1.5в от батареек. Соответственно, для полноценного управления моторами ему надо поднять питание. Скажем так: 6-вольтовые моторые при питании через L298N от 6в .. "еде шевелятся" под нагрузкой. Соответсвенно, смотрите какие у вас моторы и повышайте питание с учетом потерь на драйвере.
2. "живет сам по себе" указывает на прохождение помех от двигателей в каналы управления Дуньки. В частности, возможны варианты:
а) помех от искрения коллекторов - лечится напаиванием кондесаторов примерно 10н х 25в непосредственно на коллектор двигателя. Лучше 3шт: между щетками и с каждой щетки на корпус двигателя.
б) Также возможно высокое сопротивление источника напряжения - аккумуляторов (если питание от них и общее с дунькой) .. в этом случае, включенный мотор просаживает питание ниже 5в на плате Дуньки. Лечится заменой источника питания или питанием дуньки от отдельного источника или сильной развязкой общего источника через добавление конденсаторов - парой электролит большой емкости.
У меня на входе стабилизатора стоит 1000.0х25в, а на шине +5в дополнительно напаяна пара 470.0х10в + 100н х 15в. Входной электролит поставлен за входным диодом от разъема внешнего питания и питание от аккумуляторов подается на этот разъем. При просадке аккумов от включения моторов диод блокирует разрядку входного конденсатора на моторы и держит напряжение на входе стабилизатора, а внутренняя пара конденсаторов блокирует просадки питания от управления серводвигателями (их у нас бывает до 12шт одноовременно) и снижает наводки по питанию внешних датчиков (дальности, препятствия, узв, аналоговые, цвета и т.д. .. до 6-8шт используется одновременно тоже). Это все на Мега2560 крутится ежели вчё.
я решал проще немного: 2 LI-ION аккумулятора последовательно с них питание на моторы, а с одного через повышалку на ардуину. просадка общего питания не влияет на ардуину
У меня 8 Ni-MH/батарейки по 1.5в, последовательно с "отводами". Ибо нам требуются напруги: 9.6(12)в - питание 9в моторов Лего и наших 12в моторов с энкодерами; 7.2(9.0)в - питание платы Мега2560; 6.0(7.5) - питание низковольтных и жрущих моторов (3-6в, токи под 2А) .. это же питание идет на серводвигатели. Если что-то не подключается, то и не используется и сказать заранее что просадит по питанию - сложно. Поэтому и сделана стабилизация и защита "со всехх сторон". :)
а смысл батарейки ставить? тем более с такими токами
Ну .. так-то он у нас катается на аккумуляторах. а вот на соревнования .. ставим батарейки. Не всегда и не везде есть возможность зарядить робота между заездами: то розеток нет, то зарядник один на всех, а вот заменить аккумуляторы/батарейки в перерыве - частенько разрешается. :)
Питание у меня идет от 4-х Li-Ion формата18650. Два на ардуинку и два на силовую часть. Кондёры на движки поставил сразу. А вот электролиты по питанию около 1000 мкф нужно добавить. Робот бегает бодренько, но после того, как он увидит цель, он впадает в ступор (я думаб, что дело именно в коде). Постараюсь снять видосик его поведения...
конечно в коде. ищи
вот видосик поведения робота при обнаружении предмета: http://youtu.be/N8ZDusqah-0
Ну ошибок в коде предостаточно. Попробуйте переписать код с отсутпами, и да, помните что значение в переменной не изменяется оттого, что Вы опращиваете её значение в цикле. И если чтение с датчика происходит ДО начала цикла и оно разрешает повторять цикл, то он точно "зациклится" .. вот такая тавтология.. :)
Ну ошибок в коде предостаточно. Попробуйте переписать код с отсутпами, и да, помните что значение в переменной не изменяется оттого, что Вы опращиваете её значение в цикле. И если чтение с датчика происходит ДО начала цикла и оно разрешает повторять цикл, то он точно "зациклится" .. вот такая тавтология.. :)
Дело в том, что код я целиком брал от автора статьи, изменив только пины подключения. И в написании я не силён. Я очень много не понимаю того, что там вообще написано... :-(
И что такое переписать код с отступами? Вроде аккуратно все, не?
Если не сложно ткните носом в ошибки в коде... Дочка ждёт когда робот наконец будет справляться со своими обязанностями.
Надеюсь так - читабельнее? :)
В целом можно конечно и так, что называется "в лоб" .. код условно-рабочий .. советую отрегулировать задержки под конкретно вашу ходовую часть: 10,50,70 миллисекунд, что указаны в операторах delay после включения и выключения моторов, скорее всего вам не подошли .. это чисто экспериментальные чиселки и их надо бы вытащить в константные определения #define тоже, дабы не искать по коду каждый раз при настройках.
А так .. код можно сказать "целиком ошибочен", ибо тут правильно применять автоматное программирование, а не "в лоб"..
Большое спасибо за потраченное время, отдельное спасибо за коментарии. С их помощью будет легче разобраться в коде. Как испробую исправленный Вами код, отпишусь как работает.
Э-э-э, а я разве что-то правил? :)
Э-э-э, а я разве что-то правил? :)
Переписал немного. А уже я на основе Ваших коментариев немного правил ...
Вот код, поправленный с помощью подсказок ув. Arhat109-2, за что ему отдельное спасибо. Теперь робот справляется со своими обязанностями на 99%. Немного не доворачивается в сторону обнаруженного предмета. Это наверное широкая диаграмма направленности датчика в горизонтальной плоскости виновата...
И так код:
Я убрал оттуда поворот головы в сторону перед захватом предмета (как у автора статьи) потому как серва с датчиком у меня не выходит вперёд за габариты робота и не мешает захвату.
Выражаю так же отдельную благодарность автору статьи Евгений74 за идею и исполнение.
Полезные роботы уборщики! )) Надеюсь, мой "лентяй" скоро "научится" делать что то полезное, так же, как ваши. Вот мой: https://youtu.be/AIZ3olAV26g