Простой робот обходящий препятствия
Воскресным утром меня посетила идея сделать проект, который будет интересен начинающим и прост для повторения. Все это вылилось в не совсем простой, но очень колхозный робот, который может обходить препятствия. Так же он может не падать со стола или не выезжать за пределы белого листа. В любом случае, управляющая программа минималистична, но предельно проста. В ней можно много чего улучшить и обучить робота новым фишкам. Железная часть робота выполнена из говна и палок. Я не стремился к эстетике, главным параметром для меня была повторяемость.
ЖЕЛЕЗО
В качестве двигателей выступают китайские шаговые моторчики 28byj-48-5v вместе с идущими к ним в комплекте "драйверами". Эти платки по сути являются просто транзисторными сборками на базе специализированной микросхемы ULN2003A, а роль драйвера берет на себя МК.
В качестве мозга робота выступает Arduino NANO на базе микроконтроллера Atmega328p. Возможностей этого МК хватает с запасом для нашей задачи.
Чтобы робот мог объезжать препятствия, ему нужны датчики. ИК-датчики являются достаточно дешевыми и простыми устройствами, подходящими для решения несложных задач, в которых не требуется ни особой точности, ни большой дальности обнаружения. Для этого вам придется спаять простую платку с тремя инфракрасными светодиодами и одним tsop ИК приемником. Такие светодиоды применяются во всех пультах дистанционного управления, а ИК приемники в том чем этот пульт управляет. Все эти компоненты очень дешевы и легко доступны. На ИК диоды нужно одеть черную термоусадку, чтобы они светили только в направлении предполагаемого препятствия. Так же вам понадобится несколько резисторов и конденсатор. Подстроечные резисторы R11 и R14 нужны для настройки чувствительности боковых датчиков и датчика поверхности соответственно. R8-R10 нужны чтобы не сжечь ИК светодиоды. Излучающим элементом может быть любой ИК-диод, длина волны которого находится в районе 950 нм (BIR-BM13J4G в моем случае). Фотоприемник я взял TSOP34836. Вы можете взять любой какой найдете, только посмотрите в даташите распиновку (т.к. она может отличаться от моей). На выход фото датчика желательно повесить подтяжку R2 10кОм. Конденсаторы в схеме не обязательны - это правило хорошего тона в схемотехнике и лучше привыкать сразу ставить конденсаторы как можно ближе к выводам питания любой микросхемы.
Система питания так-же без особых изысков. Я использовал литиевый аккумулятор. Для его подзарядки поставил модуль TP4056. Весь робот питается от батареи через повышающий преобразователь XL6009, который поднимает напряжение до нормальных 5V. (Можно обойтись и без него). В разрыв плюсового провода между преобразователем и батареей установлен выключатель питания. Дальше питание звездой расходится по потребителям. Как вариант, вы можете использовать три пальчиковые батарейки включенные последовательно.
Корпус робота выполнен из пластиковой распаечной коробки. Проковырял отверстия для моторов и прикрутил их на винтики м3. Бампер так-же держится на винтиках.
Колеса.... Я долго думал как сделать максимально просто.... И получилось, на мой взгляд шедеврально. Сначала насадил на оси моторов крышки из под молока и залил китайской соплей, но робот получился очень медленный. Чтобы повысить скорость, приклеил на термоклей сверху крышки побольше. Чтобы увеличить сцепление с поверхностью сделал покрышки из термоклея путем аккуратного мазюканья. Красотища
Третье опорное колесо (шарик) купил в мебельном магазине за 30 рублей и прикрутил шурупами.
Как видите, конструктивно все очень просто. Переходим к программной части.
ЛОГИКА РАБОТЫ
ИК-бампер состоит из трех ИК-излучателей (левый, правый и нижний) приемника на элементе TSOP. Задача микроконтроллера состоит в том, чтобы формировать пачки импульсов и подавать их на ИК-излучатели поочередно. После формирования очередной пачки контроллер принимает сигнал от TSOP. Если приемник регистрирует сигнал, то препятствие обнаружено. Бампер использует три излучателя для того, чтобы регистрировать сигналы по двум направлениям (двух зонный датчик) и контролировать наличие поверхности перед собой.
ИК-бампер не определяет расстояния до препятствия. Зона действия бампера определяется лишь интенсивностью ИК-излучения, для чего и нужны подстроечные резисторы R11 и R12.
Алгоритм работы датчика препятствитакой - контроллер, по очереди, посылает сигналы на каждый ИК излучатель и сразу опрашивает TSOP. Если логический уровень равен нулю (датчик принял отраженный сигнал) значит, в зоне видимости есть препятствие. В результате этого опроса мы получаем картину перед роботом: есть ли земля под ногами, препятствие слева, справа, или путь свободен. На основании этих данных робот принимает решение куда двигаться.
Я применил тут шаговые двигатели в силу их дешевизны и интереса для начинающих в плане обучения. Так-же, неоспоримым преимуществом является их точность. Можно например прикрепить к этому роботу шариковую ручку и заставить робота рисовать. Нужно лишь написать алгоритм движения робота и сделать жесткие колеса. В программе, которую я написал, есть функции, которые могут двигать робота как угодно. Заметьте, что МК не может крутить обоими моторами одновременно, поэтому, они работают по очереди - по шажочку. Но, т.к. это происходит с большой частотой и имеется 4078 шагов на оборот колеса, этого не заметно.
НО! Т.к. ардуина не может одновременно управлять шаговыми двигателями и опрашивать датчики робот двигается рывками. Эту проблему можно нивелировать путем разпаралеливания задач, но это достаточно сложно и проще применить специальные драйверы для моторов, которые будут управлять двигателями независимо от МК. И еще есть несколько способов.
Можно заставить робота запоминать пройденное расстояние и местонахождение препятствий - памяти должно хватить на небольшую комнату (если использовать маленькое разрешение) в итоге мы получим робота исследователя.
Как видите, поле для экспериментов в программировании - огромное. Дерзайте.
Будут вопросы, спрашивайте тут в комментариях. Отвечу или дополню статью.
Ссылка на скетч - IR_robot