Вместо предисловия:
Здравствуйте! Меня зовут Вячеслав Голицын, и я ГИК! Это началось все еще в школе, меня на это подсадили друзья из физмат класса. На переменах, украдкой в туалете и за углом школы мы обсуждали новые гаджеты и схемы для жучков-радиопередатчиков. Я думал просто побалуюсь, но затем я уже не мог соскочить. Электронику, которую я собирался починить, в доме уже никогда никто работающей не видел, во время очередного феерического разгулья мною жестоко был убит магнитофон «Электроника 302». Меня наказали, но я не смог полностью отказаться от своей пагубной привычки, так я стал тайным гиком, но даже в радио-клубе меня за своего не приняли, да, в клубах мало что заметно, из-за пафоса все вверх дном. Когда я обменял свой новый снегокат на учебник А.Марченко и конструктор автомобильного приемника, я понял, что я качусь на ДНО! Меня стали узнавать в лицо на радио-рынках и в магазинах электроники, я читал «Технику молодежи» и посредственные форумы по ночам на dialup'e. Я начал носить очки с простыми стеклами, т.к. меня и так все называли «очкарик». Даже родной отец как-то поставил мне 3 в одноклассниках. Окончательно сорвался когда меня бросила девушка, тут меня понесло… я купил новую паяльную станцию, а мой аккаунт на Алиэкспресс начал требовать
Потом жизнь как-то наладилась… семья, дети, и вот уже несколько лет я в завязке, но каждый день читаю Хабр (теперь Гиктаймс). Я менеджер очень среднего звена, я как все — работаю в офисе. Технического образования у меня, увы, нет, но когда я читаю обзор нового гаджета, мини-компьютера или платы автоматизации в сознании уже формируется огромное количество идей где бы это можно было применить (автоматизацию офисного туалета не предлагать). После недолгого полета фантазии обычно следует заказ и томительное ожидание забугорного чуда чудесного. За время пока долгожданный груз проходит все круги
Газон косить — не дрова рубить. И не чай пить, и не квесты проходить, и не за пивом ходить. Ну Вы поняли...
Вы спросите: почему газонокосилка, лето ведь заканчивается, а зимы у нас долгие? Не зря ведь в народе говорят: «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
Спасибо за внимание!
Комментарии (53)
frolic
02.09.2015 11:20Такую же фигню хотел, только на гусеничном ходу и нож с электроприводом, а вот питание от генератора, который будет ездить на той же раме сверху. Следующим летом будет квест))
ToSHiC
02.09.2015 11:30+1В моторе стеклоочистителя 3 щётки, потому что у него две скорости. Ещё у него должен быть один провод, который замыкается или размыкается 1 раз за оборот, штатно он используется для остановки дворников в нижнем положении, а вы можете использовать для подсчёта расстояния, например.
webzuweb
02.09.2015 11:59Спасибо! По поводу использования встроенного «энкодера» думал, но один оборот колеса это 80см. Это слишком много. Пришлось двигатель просверлить и нарастить ось, на которую разместил оптический энкодер с 20 прорезями, т.е. один шаг это движение тележки на 4 см. вперед.
За разъяснение со скоростью спасибо.
AVI
02.09.2015 11:56+6Раз на улице обитает, то просится GPS. Чтобы лучше ориентировался на участке покоса. Так же можно держать несколько карт участков и автоматически определять нахождение в них.
Еще установить купюроприемник и отправлять его на заработки к соседям.
По объему денежных поступлений с участка регулировать частоту его посещения. «На участке №32 дали 500р — надо заезжать каждую неделю».
Так же добавить датчик удара и микрофон. «На участке №57 два раза пнули ногой и громко ругались — больше туда не ездить».
:)webzuweb
02.09.2015 12:04Идея хорошая. Вы еще, наверное, хотели сказать про селфи-палку и размещение проекта на кикстартер..:) Если честно думал про установку магнитометра для определения севера, но думаю что помехи от работы двс и двух электродвигателей будут сильные. Про GPS идея отличная. Куда бы Вы его установили к малине или к ардуино?
wrewolf
02.09.2015 12:21просится к малине, вы же туда сливаете информацию с других датчиков.
А магнитометр можно попробовать вынести максимально далеко, и учитывая коробку датчиков на попробовать он у вас уже есть.Rumlin
02.09.2015 12:40+2По-моему нужно добавить еще одно колесо — колесного одометра, чтобы считать реальный пройденный путь, если ведущие колеса могут пробуксовывать, например, на скошенной траве, росе.
darkfrei
09.09.2015 15:19Тогда и переделать его из четырехколесного в трехколесный — пять колес многовато.
Rumlin
09.09.2015 19:32Для правильных результатов одометр должен волочиться за тележкой, тогда он не будет проскальзывать. Если измерять обороты колеса на которое приходится часть веса, то при некоторых условиях оно будет проскальзывать, например при повороте.
darkfrei
10.09.2015 01:07При перемещении колеса, на которых часть веса не приходит, будет проскальзывать в любом случае.
А «ловить» просказывание ведущих колес при повороте тоже нужно.
vmarunin
03.09.2015 03:35GPS даст уж очень примерную точность.
Понять на чьём участке аппарат можно, а где именно на нём — нет.
Некоторые промышленные системы просят закрепить провод (кольцом) и по магнитному полю понимают с какой они стороны провода. Получается точно (сантиметры), но это надо «наземную» станцию и провод закладывать.
Наверное, если знать участок, можно попробовать камерой определять свои координаты (если известны координаты маркеров, то можно посмотреть на них камерой и посчитать углы, а там уже понять свои координаты)frolic
03.09.2015 09:37Проще поставить ультразвуковые излучатели в углах периметра, по ним вполне точно получится.
Visphord
04.09.2015 18:08А разве нельзя использовать BLE маячки и по силе сигнала с 3-х маячков получать координаты на местности? Вроде так определяют координаты на всяких там кнференциях\выставках\etc. Маячки с китая стоят совсем недорого.
beaverBox
03.09.2015 06:48Это ж ИИон как есть, а ТС на пару с Маском отрицают любую возможность
троллить соседейсингулировать этот мир.: о)
А задумка и реализация круты, автор, не теряйте задор!
Konachan700
02.09.2015 12:50+2Отличная идея. Тоже думал делать подобную косилку к следующему году. Только с измельчителем травы, чтобы потом не собирать сено руками, потому что площадь объекта несколько гектар. Обязательно, как уже сказали выше, генератор плюс электропривод. И такую машину надо снабжать мягкими бамперами, чтобы она в случае чего не покоцала стоящую по территории технику.
Препятствия и нескошенное, кстати говоря, еще можно определять через OpenCV и пару-тройку красных лазерных линий параллельно земле, по появлению этих самых линий на картинке. Красного цвета линий на газоне нет, потому работать должно относительно надежно.webzuweb
02.09.2015 14:24Насчет бамперов абсолютно согласен. С OpenCV возможно так же использовать отдельный мини-компьютер с камерой на столбе в углу участка, так можно будет определять перемещение газонокосилки, корректировать местоположение и движение по участку других объектов (детей, домашних животных)
eta4ever
02.09.2015 13:44+1Ох. Что только не делают из этих движков. Вот у меня уже не первый год работает управляемая заслонка вентиляции в производственном помещении. Только из стеклоподъемника.
webzuweb
02.09.2015 14:28Меня на использование этих движков сподвиг пост geektimes.ru/post/258518, из общения с автором родилась идея использовать Monster Motor Shield. Отличная вещь, до 30А при 12В.
eta4ever
02.09.2015 14:32+1Ну, движки реально хороши по соотношению полезность-цена.
Шилдами я уже наигрался, сейчас делаю «узкие» устройства под конкретные задачи.
А заслонка — там вообще дубовейшая автоматика. Реле, концевики.
heaver
05.09.2015 00:33На фото разобранного двигателя видно, что из него выходят два провода. Можно предположить, что это земля и две скорости. Значит земля не соединяется с корпусом внутри двигателя. Возможно соединяется на контактной группе в редукторе. Стоило попробовать отсоединить провода от редуктора, возможно контакт минусового провода с корпусом исчез бы. Вам стоило взять такие двигатели, как в той статье. В них нет контакта минуса с корпусом и они втрое мощнее.
Китайские Monster Motor Shield'ы не такие пушистые, как я думал. Купил в Китае 7 подобных полушилдов, рабочими оказались только два, остальные дохлые по приезду. Возможно то же самое и в Вашем случае.
Yogami
02.09.2015 15:13+1Есть ли в продаже роботы-газонокосильщики с баком? Что-то нагуглить не могу. Без бака весь газон в сухой траве окажется.
Shoohurt
02.09.2015 16:55Если косить вовремя, то количество скашиваемой травы достаточно невелико и ее можно смело оставлять прямо на газоне: за день-два уходит в почву.
webzuweb
02.09.2015 18:40Робот сделан скорее для мульчирования травы. Если скашивать траву часто, т.е. срез должен составлять не более миллиметра+доп. измельчение ножом. При этом траву нет необходимости собирать, это является отличным удобрением. При использовании бака появляется не только необходимость проверять заполненность, определять место и способ сброса травы, большая проблема это то, что канал регулярно забивается. О какой-либо автономности придется забыть.
Мне бы в итоге хочется чтобы косилка сама запускалась и работала по расписанию (когда все на работе).
LexB
02.09.2015 17:51+5В финальной версии если робот будет работать без присмотра — сделайте большую красную кнопку с надписью СТОП, чтобы в экстренном случае непосвященный человек мог остановить эту машину. На всякий случай.
spc
02.09.2015 20:37Не в тему, но по моим воспоминаниям кроме фантастики ничего интересного в ТМ не было вообще. Унылый журнал по сравнению с ЮТ и Радио )
4dmonster
03.09.2015 09:02А вы почитайте подшивки за 60е-80е года.
spc
03.09.2015 10:30Полагаю, я примерно в то время на них и смотрел. Не знаю, может возраст был неподходящий, но ЮТ и Радио — более «прикладные» журналы. Пожалуй, мне не удалось выбрать правильную формулировку. Не «унылый», а скучный именно для меня.
kacang
03.09.2015 06:49Отлично! Даёшь полную видео-демонстрацию!
Сколько времени ушло на всё про всё? И я не совсем понял алгоритм кошения :) Он эти квадратики по спирали, из центра проходит, или как-то ещё?webzuweb
03.09.2015 09:58Он эти квадратики по спирали, из центра проходит
Да, алгоритм пока очень простой, думаю над совершенствованием. Т.е. по скошенным участкам проезжать не обязательно, но можно в случае невозможности проложить траекторию по не скошенным. Может быть использовать как основу ИИ построения траектории ботами в играх?
utya
Круто!