Автономная навигация на Arduino. Энкодеры

Сегодня большая часть поста будет посвящена энкодерам на основе фотоинтеррапторов:

Поехали!
Вместо вступления
Не прошло еще месяца с тех пор, как меня затянула эта зараза. Постоянно читаю разные блоги и форумы в поисках информации и вдохновения. Меня сначала сильно удивляло то, что многие люди берут уже готовые алгоритмы, готовые конструкции и просто соединяя это вместе получают работающую штуку. Но ведь они при этом сами ничего не придумали, серым веществом не поскрипели! Просто собрали конструктор по инструкции. Типа как собрать шкаф из Икеи, мозг особо не нужен. Но потом посмотрел на то, что получается у меня — готовая ардуина, готовый моторшилд, готовая платформа с гусеницами. Даже датчики куплены уже с готовой обвязкой. Зато код пишу с нуля и разбираюсь с каждой библиотекой :) Так что каждому свое — кому-то с паяльником печатные платы фигачить, а кому-то логику и алгоритмы продумывать…

Энкодеры
… Ну не привык я, работая постоянно с компьютерами, что данные бывают неточными. У нас, программистов, если сказано, что Х=5, то Х равно именно 5, а не 4,95 или 5,1567. Если данные с компаса мне еще удалось приручить — благо точность там большая не нужна, то с акселерометром я так и не смог совладать. Погрешность настолько велика, что даже на идеально ровной поверхности и равномерном движении посчитать расстояние — это задача не из самых легких. Что уж говорить о трясущемся танке, который к тому же еще может наклоняться в разные стороны из-за неровностей «дороги»? Ведь там на «помощь» расчетам приходит вектор притяжения земли, который начинает вмешиваться в показания. В общем — лес дремучий.
Но расстояние считать все равно надо, и как бы я не хотел уйти от энкодеров — прийдется их применять. Так не будем тянуть и приступим-с.
Внимательно осмотрев имеющийся редуктор, изучив все технологические отверстия в его корпусе, я решил делать энкодеры на основе фотоинтеррапторов. Штуки эти весьма не дороги даже с «обвязкой», поэтому, не долго думая, заказываем сразу парочку в ближайшем магазине.


Шестеренки в редукторе — белые, значит будем наклеивать на них черные полоски. Разрешения в один импульс на оборот для наших целей вполне достаточно — не мудрствуем с шаблонами, а просто заклеиваем половинку черной бумагой:



И вторую тоже:


Мне очень повезло — отверстие для шурупа на плате фотоинтерраптора идеально село на ось. Плюс две прорези в пластике корпуса редуктора, и энкодер готов.




Собираем все в кучу, сочиняем тестовый скеч и радуемся:

(превый столбец — количество оборотов шестеренки, второй — усредненное значение с датчика)

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

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

[фотография вырезана цензурой]

Так что беремся за паяльник… Вот так уже значительно лучше! =)


Ну-с, на сегодня хватит. В следующий раз нас ждет увлекательное тестирование и сравнение ультразвукового сонара и инфракрасного дальномера. Что же больше подойдет для «зрения» моего робота?

PS с вопросом.
Уже совсем чуть-чуть остается до того момента, как робот поедет и я начну тестировать и отлаживать алгоритмы навигации. Уже виден свет в конце туннеля :) По итогам я сделаю один большой пост про все этапы разработки и обязательно сниму видео. Нужно ли подробно описывать принципы работы используемых сенсоров, выкладывать тестовые скечи, графики и прочую мелочевку? В принципе, это все достаточно легко гуглится, кое что даже на русском, но формат сайта вроде как располагает к подробным описаниям. Хотя если все описывать подробно — итоговый пост будет огромен :)
  • +7
  • 23 марта 2012, 18:51
  • lokki

Комментарии (9)

RSS свернуть / развернуть
+
+1
Отличная работа!
Большая просьба — заливайте, пожалуйста, фотографии на сервер, чтобы по прошествии времени они не потерялись :)
Если потребуется выложить фотографию большого размера можете сбросить её на мыло: admin[AT]robocraft.ru :)
Перезалил фотки.
Так же, выложите, пожалуйста, используемый тестовый скетч.
По вопросу: разумеется, хочется всех подробностей :) думаю, лучше если вы сможете оформить это дело в виде нескольких отдельных небольших заметок (по отдельным сенсорам/темам), на которые просто сможете ссылаться в итоговой статье. Тогда итоговый пост будет не слишком большим и ничего не потеряется.
Спасибо!
avatar

admin

  • 24 марта 2012, 09:43
+
0
для каких практических целей нужен этот танк?
avatar

arduinofan

  • 24 марта 2012, 22:28
+
+2
В первом посте примерно описано. Если в двух словах, то:
1. Первое знакомство с ардуино, изучение ее основ и возможностей
2. Изучение общих основ робототехники, принципов работы различных датчиков, алгоритмов обработки их данных.
3. Изучение принципов автономной навигации и SLAM

Как только я закончу этот проект — возьмусь за второй. Вот он-то будет уже иметь практические цели и даже работать на благо планеты в одном из заповедников нашей страны :)
avatar

lokki

  • 25 марта 2012, 05:23
+
0
Спасибо за идею исполнения энкодера :)
avatar

able

  • 25 марта 2012, 17:13
+
0
Красиво все уместилось и просто получилось:)
avatar

Ozze

  • 26 марта 2012, 17:41
+
0
с нетерпением ждем подробностей =)
а кто нибудь сравнивал реализацию инерциальной системы позиционирования собраной на:
1 отдельных деталях и
2 Android-смортфоне?
3 джойстики Nintendo nuncjuk + wii-mote plus?

очень интересно посмотреть видео движения такой платформы (скорость, поворот по дуге, разворот 360, преодоление препятсвий в виде ковров тапков, тяговое усилие ( например толкание баскетбольного мячика) )

avatar

RoboZeka

  • 29 марта 2012, 17:27
+
0
просто и дешево!!! КЛАС!
avatar

nanit

  • 31 марта 2012, 09:26
+
0
А где можно узнать о работе с библиотекой для энкодеров на ардуино, вообще, получше узнать, как определяются параметры с помощью этого датчика(например, скорость)?
avatar

Grafonty

  • 26 июня 2012, 21:00
+
+2
можно без библиотеки — с энкодера идет сигнал — 0 или 1. надо ловить переходы, например


Loop ()
{

state=digitalRead(Pin2);
if (previousState != state)
{
distance++
}
prevState=state;


}

этот кусочек меряет пройденный путь, в попугаях.
чтобы перевести в метры — нужно знать диаметр колеса, возьмем например 50мм, тогда длина окружности колеса — 2*Pi*R или 50*3,14 = 157мм.
Еще нам нужно знать разрешение энкодера ( количество переходов сигнала за оборот) например 10.
Каждый оборот колеса = 157 мм.
Считаем с помощью millis() время за которое мы проехали последние 157 мм, делим расстояние на время = скорость.

если нужно подробнее — могу объяснить в скайпе
avatar

RoboZeka

  • 5 июля 2012, 21:34

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