Это краткая история о сборке робота-газонокосилки из подручных средств обычным менеджером, а так же о становлении ГИКа, отрицании сингулярности, согласии с его величеством Илоном Маском и борьбы человека с машинами. Пристегните ремни, мы направляемся в атмосферу легкой иронии и непринужденного описания разработки робота-газонокосилки от черного металла до прототипа. Пытливый читатель, добро пожаловать под кат!
Вместо предисловия:
Здравствуйте! Меня зовут Вячеслав Голицын, и я ГИК! Это началось все еще в школе, меня на это подсадили друзья из физмат класса. На переменах, украдкой в туалете и за углом школы мы обсуждали новые гаджеты и схемы для жучков-радиопередатчиков. Я думал просто побалуюсь, но затем я уже не мог соскочить. Электронику, которую я собирался починить, в доме уже никогда никто работающей не видел, во время очередного феерического разгулья мною жестоко был убит магнитофон «Электроника 302». Меня наказали, но я не смог полностью отказаться от своей пагубной привычки, так я стал тайным гиком, но даже в радио-клубе меня за своего не приняли, да, в клубах мало что заметно, из-за пафоса все вверх дном. Когда я обменял свой новый снегокат на учебник А.Марченко и конструктор автомобильного приемника, я понял, что я качусь на ДНО! Меня стали узнавать в лицо на радио-рынках и в магазинах электроники, я читал «Технику молодежи» и посредственные форумы по ночам на dialup'e. Я начал носить очки с простыми стеклами, т.к. меня и так все называли «очкарик». Даже родной отец как-то поставил мне 3 в одноклассниках. Окончательно сорвался когда меня бросила девушка, тут меня понесло… я купил новую паяльную станцию, а мой аккаунт на Алиэкспресс начал требовать крови все большую часть моей скромной зарплаты.
Потом жизнь как-то наладилась… семья, дети, и вот уже несколько лет я в завязке, но каждый день читаю Хабр(теперь Гиктаймс). Я менеджер очень среднего звена, я как все — работаю в офисе. Технического образования у меня, увы, нет, но когда я читаю обзор нового гаджета, мини-компьютера или платы автоматизации в сознании уже формируется огромное количество идей где бы это можно было применить(автоматизацию офисного туалета не предлагать). После недолгого полета фантазии обычно следует заказ и томительное ожидание забугорного чуда чудесного. За время пока долгожданный груз проходит все круги ада сортировочных центров Почты РФ, романтика понемногу из нового образчика современного гения технической мысли улетучивается. Так было и с raspberry pi, arduino, небольшой коробочки с датчиками и проводами. Но тут появилась боль. Имя ей — дача, точнее газон на даче.
Газон косить — не дрова рубить. И не чай пить, и не квесты проходить, и не за пивом ходить. Ну Вы поняли...
Вы спросите: почему газонокосилка, лето ведь заканчивается, а зимы у нас долгие? Не зря ведь в народе говорят: «The winter is coming...». Возможно, ответ — банальная лень или любознательность, возможно — все вместе, но поддерживать газон в красивом виде — задача не из простых даже при скромных размерах угодий, кои и представлены у вашего покорного слуги. Я решил совместить активное желание познания нового + raspberry pi model B + arduino + чермет + свободную волю, героизм, профессионализм, капитализм, пофигизм и катаклизм.
Решение обдумывал долго, рассматривал вариант покупки готовой косилки, но пришел к выводу, что удобнее всего будет сварить тележку самому и прикрепить ДВС от ручной газонокосилки.
Тележка приводится в движение двумя двигателями с редукторами от стеклоочистителя ВАЗ-2108 (импортозамещение в действии). У двигателей не две щетки на коллекторе, как мне было привычно, а три. Я так и не разобрался для чего третья щетка, но тот факт, что один из проводов подключен к корпусу, а двигатели должны были двигаться в разных направлениях для движения вперед, заставил меня изолировать один из двигателей от рамы.
С двигателями сложная история: в попытке понять устройство двигателя, я разобрал один из них — это уже было предвестником того, что двигатель со всеми своими лошадиными силами отправится в кхалосар великого табунщика навечно. В общем, «кто сому глотает — проблем не знает», купил новый двигатель и продолжил велосипедить и быдлокодить.
Источником питания служит аккумулятор на 12В. Ардуино получает питание по USB от малины. Raspberry подключено к USB-свитчу с отдельным питанием, питание на него подается с того же аккумулятора 12в через две параллельные L7805 (пока длится долгое путешествие импульсного DC-DC преобразователя).
Колеса от тележки куплены на строительном рынке. Двигатели были подключены через Monster Motor Shield, но по доброй традиции эта плата приказала долго жить после подсоединения питания к контактам вывода. Вангую холивар в комментариях по поводу того, что с кривыми руками и не стоит начинать ничего делать, но что если сердце просит? В общем сомы грамм и нету драм: оформляем заказ на такую же плату, а пока обойдемся двумя реле, т.к. двигатели на первых парах могут крутиться только в одну сторону. А вообще, учитывая отсутствие необходимости в ШИМ, можно сделать H-мост на основании блока из 8 реле для Arduino. А как к этому относишься ты, дорогой читатель?
Управление двигателями и опрос датчиков (ультразвуковые датчики расстояния и энкодеры на колесах; в версии 1.1: инфракрасные датчики препятствий, кнопка в переднем бампере) осуществляется Arduino mega 2560.
Андурина (моя жена устойчиво продолжает ее так называть) подключена к raspberry pi через USB (Все скромное общение по Serial port). Также к малинке подключена веб-камера (В версии 1.0 для вывода картинки через Motion) и wi-fi свисток.
Логика работы системы. На дворе трава, на траве...
Учитывая, как сильно Илон Маск (да и не только он) предупреждал меня (я таки надеюсь, что ко мне он тоже обращался) об опасности Искусственного Интеллекта, я решил пока его (т.е. ИИ), т.е. ИИего не внедрять в сие изделие, дабы внезапно обрушившаяся сингулярность не перекосила все хвойники на моем участке. На Raspberry pi установлена raspbian OS, OpenCV(которая так правильно не завелась) и подняты вебсервер и FTP. Управление и настройка производятся через ssh. Тот код с OpenCV, который работает на ноуте, никак не хочет запускаться на малинке. После продолжительных танцев с бубном было принято решение оставить внедрение функционала, завязанного на OpenCV для версии 2.0.
На малинке работает Python 2.7 скрипт, который сохраняет в таблице MySQL данные о текущем положении косилки в системе координат (подробнее чуть позже). При обращении по IP косилки выводится матрица (система координат), разбитая на ячейки (для удобства 0.5X0.5 метра, так как это ширина скоса). В таблице разным цветом указаны текущие состояния ячеек.
1. Серый — неизвестно;
2. Зеленый — не скошенная трава;
3. Желтый — скошенные участки;
4. Красный — участки с препятствием;
5. Синий — участок, где находится косилка.
При нажатии на свободный или неизвестный участок возможно перевести его состояние в заблокированный, для того чтобы самостоятельно задать препятствия.
Кроме этого в версии 1.1 на странице должна быть кнопка аварийного отключения, ручка управления топливной заслонкой ДВС и кнопки ручного управления.
В каждом цикле работы raspbery:
- ожидает от arduino информации о завершении предыдущего задания (если оно было);
- получает через arduino информацию с дальномеров;
- обрабатывает информацию с веб-камеры;
- если есть возможность двигаться вперед, отправляет на arduino задание совершить движение на одну клетку (0,5м.) вперед. Если клетка впереди заблокирована (есть препятствие), отправляет задание совершить поворот на 90 градусов вправо.
Arduino в каждом цикле:
- опрашивает ультразвуковые датчики расстояния;
- Для версии 1.1:
— опрашивает кнопку бампера(при столкновении с препятствием выключает реле питания ДВС);
— опрашивает инфракрасные датчики препятствий. - проверяет состояние переменных с энкодеров о повороте колес;
- (энкодеры работают на прерываниях, инкрементируют соответствующие переменные до получения нужных значений, из которых следует, что предыдущее задание выполнено.);
- отправляет на raspbery информацию о завершении задания и данные о расстоянии до препятствий;
- получает новое задание.
Краткое кривое видео
Планы на будущее, кроме озвученных ранее в тексте:
- Использовать OpenCV для определения калибровочных меток. Т.е. некие метки( шары оранжевого цвета) размещаем на палочках рядом с низкими растениями. Метки красного цвета размещаем рядом со стартом или по границе периметра. В OpenCV маской делаем выборку по нужному цвету, затем ищем форму — круг. По размеру круга определяем расстояние до него и размещаем в базе информацию для соответствующего квадрата.
- С помощью OpenCV проверять нижнюю часть кадра на средний цвет, который должен быть зеленый, чтобы исключить езду по тротуарам.
- Подключить вторую веб-камеру и с помощью openCV создавать трехмерную карту препятствий.
- Подключить к ДВС двигатель на 12V в качестве генератора, на косилке создать систему поддержки заряда батарей, чтобы исключить необходимость заряжать ее отдельно.
- Возможно использовать «генератор» в качестве стартера.
Быдлокод в открытом доступе. Форкайте на здоровье. Буду только рад единомышленникам: https://yadi.sk/d/qObAm0deiogvP
Спасибо за внимание!
Автор: webzuweb