Робот-картограф
- Войдите на сайт для отправки комментариев
Часть 0.
Вместо вступления
Почему-то пространные инструкции, как нужно что-либо делать, обычно пишут новички. Пришел, увидел, попытался что-то сделать, получилось - и есть повод поделиться своей радостью со всем миром. Хотя, возможно, и сам еще толком не понял, как оно работает и, главное - почему. Или понял, но неправильно.
Другое дело - специалист, кроме массы собак съевший в придачу целый зоопарк. Нет, первое время специалист активно помогает новичкам, но вскоре обнаруживает, что вопросы новичков остаются одними и теми же. Он уже ответил на какой-то вопрос раз десять, а его не перестают задавать. Хотя подробный ответ уже написан. Десять раз. На этом же форуме.
И тогда специалист постепенно переходит от подробных ответов к коротким намекам и сарказму. Нет, намеки абсолютно правильные и, если новичок как следует задумается, этот намек поможет ему больше, чем пространное изложение. Но думать новичок не хочет, и тогда специалист начинает его троллить. На что, в общем-то, имеет право. А заодно троллить и всех остальных новичков.
А к какой категории отношусь я? С одной стороны, есть немалый опыта программирования и схемотехники. Но о существовании Ардуино узнал чуть больше месяца назад, а с тех пор, как первый экземпляр попал в руки, не прошло еще и четырех недель. По всем критериям - новичок. По крайней мере, желание поделиться с окружающими нажитой непосильным трудом информацией еще не иссякло. Так что не будем ломать традиции.
Предыстория
Почитал об Ардуино. Возникло вполне естественное желание что-то на нем соорудить. Для души. Что именно?
- Конечно же, робота! Разве могут быть какие-то сомнения?
Итак, решено!
Но что должен уметь этот робот? Выполнять команды с ПДУ, объезжать препятствия и следовать начертанной на полу линии - неинтересно. Пусть это будет робот-картограф. Чтобы мог объехать квартиру и нарисовать ее план (то есть сразу ограничиваем размер исследуемого пространства десятком-другим метров, достижимое разрешение оцениваем в 1-5 см). А для этого он должен уметь ориентироваться в пространстве. Нужны: валкодеры, компас, акселерометр и гироскоп. Может, и не все это необходимо одновременно, но зато можно будет сравнить результаты расчетов по данным с разных датчиков, проанализировать погрешности, выбрать оптимальное решение, что само по себе интересно. GPS-датчик ввиду его высокой по меркам данного проекта погрешности не рассматриваем.
Приценился в наших Интернет-магазинах (ИМ) и немножко призадумался...
В общем, заказал в китайском ИМ стандартного робота - набор DIY (тележка о двух моторах, сервой с дальномером и датчиками линии под пузом),
а также необходимый набор периферии. Правда, как оказалось, не все друг другу подошло. В частности не подошли валкодеры, т.к. у данного робота есть зубчатые колеса, но нет и некуда прицепить диск с прорезями. Пришлось докупать недостающее уже в местных ИМ.
Итак, переходим к главному.
Часть 1.
Что такое валкодер, и с чем его едят
Применительно к Ардуино, почему-то, данное устройство принято называть энкодером, но этот термин слишком многозначен, поэтому я буду пользоваться более конкретным - "валкодер".
По классической схеме валкодер состоит из диска с прорезями, закрепленного на одной оси с колесом и "оптотройки", которая в отличие от оптопары имеет не 2, а 3 основные детали: излучатель (инфракрасный диод) расположен с одной стороны диска, а два фотодатчика - с другой.


Свет, проходящий через щели диска при вращении последнего, формирует на выходе оптических датчиков импульсы. Причем импульсы датчика сдвинуты по фазе. В идеале - на 90°. Здесь и далее под 360° мы будем понимать не полный оборот колеса, а период следования импульсов. Если бы в валкодере было единственное отверстие, и он выдавал один импульс за оборот, то 360° - был бы как раз один оборот колеса, но т.к. отверстий несколько, например, на рисунке - 4, то оборот колеса будет равен 360°*4 = 1440° валкодера. Это чтобы было понятно, в каких градусах мы меряем.
Так вот, имея один датчик на колесо, можно оценить скорость движения (при наличии часов) и пройденный путь, а когда датчиков два, можно определить также направление вращения.
Но не всегда есть куда насадить диск с прорезями. Мне, например, достался робот, у которого место для валкодера классической конструкции не предусмотрено (тяжелое наследие доардуинных электромеханических самоделок). Зато робот собран на стандартных колесах, которые применяются в детских развивающих конструкторах, а эти колеса имеют внутри зубцы (так как колеса универсальные - на них вместо шин можно насадить гусеницы). И конструкторы нашли выход, несколько изменив конструкцию валкодера - две оптопары расположены в одной плоскости, светодиоды светят в ту же сторону, куда смотрят датчики, и последние принимают не прямой свет от диодов, а отраженный от зубцов. Поэтому каждый зубец колеса формирует импульс в валкодере.
Схематически на фоне колеса показан рефлективный валкодер в разрезе: коричневым - плата валкодера, черным - оптопары, где красным и зеленым - светодиод и оптодатчик. Свет отражается от зубцов и поглощается в промежутке между ними.

Настройка валкодера
Но если в классическом варианте сдвиг фазы между датчиками в 90° формирует одно и то же отверстие, в случае рефлективных валкодеров расстояние между оптопарами составляет 9 мм, а шаг зубцов колеса - примерно 5.2 мм. В результате сдвиг фазы между датчиками составляет не 90°, а 630°, т.е. в 7 раз больше. Понятно, что для периодического сигнала 630° - это то же самое, что -90°. Теоретически. На практике из-за того, что зубцы движутся по окружности, а не по прямой, плоскость зубца не перпендикулярна направлению света, сам свет отражается от разных зубцов, имеющих к тому же дефекты изготовления, возникает погрешность. И всего 15% погрешности от имеющихся 630° составят более 90° и приведут к полному дисбалансу фаз. Что у меня и произошло.

Мало того, что сдвиг фаз вместо 90° оказался близок к 0, так часть импульсов валкодер вообще пропускал.
С последним бороться сравнительно просто - на плате валкодера имеются подстроечники, а вот что делать со сдвигом фазы - пришлось покумекать. Предпринял поиск в И-нете. Самое интересное, что помогли картинки. Стандартно выпускаемых для DIY рефлективных валкодеров существует 3 поколения. На первом номер версии не указывался, на втором стоит "v1.1", а на попавшем ко мне красуется "v1.2". Я обратил внимание на то, что мой валкодер выполнен на тонкой плате - толщиной всего 0.65 мм, а первые версии, если судить по фото, делались на обычном 1.5 мм текстолите. Значит, место для того, чтобы приблизить оптопары к колесу и тем самым уменьшить погрешность, имеется.
Так я и сделал. Купил торт в пластиковой коробке.

Торт пришлось утилизировать :), а из верхней прозрачной крышки, толщина которой оказалась равной 0.40-0.45 мм, вырезал 4 прокладки 25х13 мм. Притянул их струбцинкой к диску-основанию робота в месте крепления моторов и, пользуясь основанием как шаблоном, просверлил по 2 отверстия. Прокладки разместил между мотором и платой валкодера, "пирог" получился такой: крепление мотора, 2 прокладки, плата валкодера, основание робота. В результате датчики валкодеров оказались расположены так, как если бы были распаяны на плату стандартной 1.5 мм толщины.
Но этого мало, нужно еще все отрегулировать и проверить.
Пришлось написать две программы: Одну для Ардуино, который запускал двигатель и снимал показания с валкодеров каждые 0.5 мс, после чего упаковывал их и отправлял по последовательному порту наружу. А другую - для PC, который должен был обработать данные, построить графики и просчитать статистику. В качестве инструмента для последнего был выбран Processing, - до сего момента я его в глаза не видел, но раз уж браться за новое и неосвоенное, то ни в чем себе не отказывать!
Тексты программы Processing не привожу. Имея опыт использования этого инструмента ровно 0 дней, трудно написать программу, которая не показалась бы смешной опытному программисту. Кроме того, программа написана для конкретного случая, адаптация ее для чего-либо другого потребует внесения правок, а 500 строк без русскоязычных комментариев (IDE Processing'а почему-то не поддерживает кириллицу), мне кажется, новичку не осилить.
Программа для Ардуино здесь:
Можно заменить вывод с бинарного на текстовый, перенести его из консоли Arduino IDE в Excell и построить графики.
На собранном роботе добраться до подстроечников невозможно. Работать с разобранным оказалось тоже практически нереально: моторы надо держать в руках, чтобы не убежали, да и масса проводов норовит где-нибудь оборваться или отсоединиться. Поэтому вместо робота был собран стенд:

на котором две пластины основания соединялись не 4, а лишь 2 стойками. При этом верхняя была сдвинута относительно нижней, чтобы дать доступ сверху к подстроечникам. А неиспользуемые стойки были развернуты, чтобы упираться в поверхность стола и не подпускать колеса к чему-нибудь, на что можно опереться, чтобы убежать.
Скрин до переделки и настройки показан ниже:

Можно видеть, что передние фронты двух каналов валкодеров в начале оборота колеса приходят "сначала А потом В", а в середине последовательность меняется на противоположную. И цифирь это подтверждает. Естественно, с таким раскладом правильно определить направление вращения колеса невозможно.
А вот после переделки и настройки:

При длине периода 95 единиц (47.5 мс) сдвиг фазы на одном колесе колеблется от 18 до 25 единиц, среднее значение 21 (80°), а на другом - от 12 до 22, среднее 17 (64°), что вполне приемлемо. То есть, если мы даже будем опрашивать валкодер без прерываний, то при периодичности опроса менее 6 мс мы гарантированно не пропустим ни одного импульса.
Выводы
Если бы мне пришлось заново выбирать элементную базу для робота, я бы предпочел набор либо с готовыми щелевыми валкодерами, либо с мотором, имеющим выход вала с двух сторон, чтобы с одной стороны насадить колесо, а с другой - щелевой валкодер. Думаю, возни было бы меньше. Хотя, кто знаем, может, там возникли бы другие проблемы.
Но если уж от рефлективного валкодера никуда не деться, следует расположить оптопары по возможности ближе к внутренней поверхности колеса с помощью прокладок, чтобы уменьшить погрешность фазы.
Ну и после этого любым доступным способом добиться примерного равенства длительностей положительного и отрицательного импульсов с каждого датчика. Тут может помочь программа, вычисляющая количества "0" и "1" на выходе валкодера за достаточный интервал времени (скажем, 1-2 секунды), и выводящая их отношение в последовательный порт.
Ардуино - вещь универсальная, она может не только совершать какую-то работу, но при этом сама же наблюдать за качеством выполнения этой работы и результаты наблюдений докладывать хозяину :).
Часть 2
Аппаратная поддеожка валкодера
Стенд тестирования счетчика K555ИЕ7
Зачем это нужно
В доступных в И-нете статьях, да и на официальном сайте Ардуино встречаются настоятельные рекомендации для обработки сигналов валкодеров использовать аппаратные прерывания. Утверждается, что в противном случае неизбежно будет потеряна часть импульсов, и, следовательно, в результатах обработки окажутся ошибки: неверно будет вычислен пройденный путь, скорость, направление движения или все это одновременно. Попытаемся выяснить, насколько это соответствует действительности.
Итак, предполагаем, что у нас есть постоянно выполняющийся в цикле код, запрашивающий состояния валкодеров, производящий обработку результатов, и вычисляющий пройденные каждым колесом расстояния и скорости их вращения. Как было показано в предыдущем разделе, интервал между чтениями сигналов валкодеров не должен превышать 6 мс. Кстати, были проведены и дополнительные измерения, в которых двигатели гонялись продолжительное время на разных скоростях и при этом определялись минимальный и максимальный интервалы между двумя последовательными моментами изменения состояния валкодеров. Естественно, это отдельный скетч, но здесь я его не привожу. Как программист я привык, что на одну строку кода основной программы (которая, собственно, и является выходным результатом программиста) приходится не менее десятка строк всевозможных дополнительных программ, предназначенных для отладки и тестирования кода, обработки входных и выходных данных, получения необходимой для работы основной программы статистики и пр. Так что приводить в дополнение к основным файлам еще и десяток-другой используемых для отладки и проверки скетчей не вижу смысла.
В общем, цикл измерения показал, что при некотором повышении напряжения питания минимальный интервал между импульсами снижается до 5 мс, а максимальный интервал всегда менее 400 мс - при меньшей скорости вращения колесо просто останавливается.
Но раз минимальный измеренный интервал 5 мс, а нужно иметь хоть небольшой запас, установим, что период между опросами ни при каких обстоятельствах не должен превышать 4 мс.
Много это или мало?
Опыт подсказывал, что время выполнения кода цикла опроса и анализа валкодеров не должно превышать нескольких сотен мкс. Пусть, максимум, - 1 мс. Но кроме этого есть дополнительные задачи, среди которых:
- управление моторами,
- опрос датчика линии (для данной конструкции робота не нужно, но - вдруг?),
- измерение расстояний при помощи ультразвукового дальномера,
- измерение расстояний при помощи инфракрасного дальномера,
- опрос датчиков положения: акселерометра, гироскопа, компаса...,
- анализ данных и принятие решения на изменение направления движения,
- вычисление местоположения и построение фрагмента карты,
- прием команд от ПДУ через ИК-датчик.
Датчик линии сильно тормозить не будет. Моторы - тоже. ИК-дальномер - чуть хуже: измерение напряжения на аналоговом входе само по себе занимает около 110 мкс, но тоже не критично. Самое неприятное - ИК-датчик, тем более, что по прерыванию это может случиться когда угодно, - читай "в самый неподходящий момент". Но, думается, многобайтовые данные передавать не следует, а прием 4 байтов команды не приведет к катастрофическим последствиям.
Опрос датчиков положения по I2C, как оказалось, процесс не быстрый. Но также должен уложиться в 1 мс. Картография, включая как расчет (с плавающей точкой, что очень медленно), так и сохранение данных в I2C EEPROM имеет смысл делать только в узловых точках, там, где робот меняет направление своего движения. Т.е. это сопряжено с остановкой, сканированием окружающего пространства посредством сервы и дальномера. Ну а если мы стоим, колеса не крутятся, валкодеры не генерируют импульсы, то время на выполнение операций ограничено исключительно емкостью батарей питания.
На самом деле, это может длиться десятки и даже сотни миллисекунд, но в покое это заведомо не приведет к ошибкам валкодеров.
Итак, остается только ультразвуковой дальномер. Для определенности будем считать, что за один проход цикла мы используем не более одного периферийного устройства: т.е. если запросили данные с акселерометра, то компас будем опрашивать только при следующем проходе цикла, подачу очередной команды на моторы - через один, а ИК-дальномер - через два... Датчик ПДУ, однако, в эту картину не вписывается, т.к. его нужно обрабатывать немедленно, когда бы пользователю, нажавшему на кнопку пульта, это ни вздумалось. Примерно оценим, что время стандартного прохода цикла + время обработки ИК-команды с датчика не будет превосходить 1.0-1.5 мс.
С учетом того, что у нас всего есть не более 4 мс, на ИК-дальномер приходится, максимум, 2.5 мс.
Скорость звука примем равной 340 м/с. При дальности действия дальномера 2.6 м звук должен пройти туда и обратно 5.2 м, что он может сделать за 16 мс. Для нас это неприемлемо много. Пусть мы принудительно ограничили таймаут 2.5 мс. За 2.5 мс звук пройдет 85 см. Т.е. максимальное расстояние, которое мы можем измерить, составит не более 42 см. Вряд ли это можно считать приемлемым.
Другими словами, на ходу пользоваться эхолотом нельзя. Вариант без прерываний, действительно, не подходит.
Валкодеры требуют два прерывания - по одному на каждое из колес. Еще одно прерывание нужно для ИК-датчика ПДУ. В Arduino UNO есть только 2 стандартных. Не хватает. Есть, правда, еще PCINT, но как-то в первом проекте, без опыта сразу переходить к нестандартным возможностям не хочется. Гораздо логичнее, как мне кажется, обеспечить аппаратную поддержку валкодеров.
Эксперименты с СИС
обычный режим счета, сигнал на входе А (на В - логическая 1)
обычный режим счета, сигнал на входе B (на А - логическая 1)
Начинал возиться с электроникой я еще в школе - лет 40 назад. Потом, правда, лет на 20 забросил. По тем временам схема на сотне корпусов СИС (микросхем средней степени интеграции) была существенно доступнее самой простенькой ЭВМ (которая стоила заведомо дороже автомобиля). Поэтому первое пришедшее на ум решение - по одному реверсивному счетчику на колесо. Плюс входные сдвиговые регистры - еще два с небольшим запасом. С учетом того, что к ним же можно подключить датчики линии. Итого четыре микросхемы.
Каждый из каналов валкодера выдает по 12 импульсов за оборот, примерно 22 с-1 при максимальной скорости. Наиболее доступны 4-разрядные счетчики. Делят на 16. Т.е. переполнение наступит только через 0.7 секунды. Правда, распознать после этого в какую сторону вращалось колесо, будет проблематично. Но при периоде опроса до 0.3 с никакой неопределенности не возникает. Значит, 16-разрядного счетчика вполне достаточно, чтобы суметь восстановить пройденный колесом путь. Младшие 5 разрядов длины пути при этом в точности будут повторять показания счетчика (4 - с выходов счетчика и 1 - с выхода_валкодера-входа_счетчика).
Для данной конструкции наиболее подходят счетчики К561ИЕ11/MC14516A, но у меня в хозяйстве таковых не оказалось. Нашелся К555ИЕ7 (фото в начале статьи). Почитав документацию, я решил использовать его в недокументированном режиме, посчитав, что если указано, что в момент прихода положительного фронта на "+1" вход "-1" должен быть установлен в логическую единицу и наоборот, то при наличии логического нуля счет просто не будет производиться. Но не тут то было! Оказалось, что если на противоположном входе вместо логической 1 установлен 0, то счетчик... перестает быть счетчиком, т.е. не "замораживает" выходы (чего бы я хотел), а переключает их по одному ему известной логике, не имеющей ничего общего с логикой счетчика.
На рисунках показаны эпюры напряжения на выходах валкодера (каналы А и В) и на выходах счетчика (Q0, Q1, Q2, Q3). В процессе измерений валкодеры эмулировал сам Ардуино. Он же анализировал выход счетчика и передавал его по последовательному порту на PC. Этот скетч также не приводится.
Ну да ладно, не получилось на ИЕ7, должно получиться на другой микросхеме. Но тут возникла следующая проблема - во сколько это обойдется... Советские счетчики стоят копейки - по 3-5 рублей за штуку. Если ехать за ними в Москву (а их еще нужно заранее заказать, т.к. они не относятся к широко распространенным товарам), то это потраченный день и ~500 рублей на дорогу. Заказывать через почту - еще минимум 300 рублей к стоимости заказа. Анализ предложения в И-нет магазинах Китая показал, что по одной штуке они продаются очень дорого - порядка тех же самых 500 рублей (с доставкой), правда, при партии в 20 штук цена на каждую падает более чем на порядок, но заказ все равно обойдется рублей в 800.
Т.е. либо плати 500 рублей и получай пару, либо - 800, и еще 18 штук останется в запасе. Но ведь я не собираюсь выпускать роботов серийно!
Не то чтобы 500-800 рублей было неподъемной суммой, но жаба сидит в каждом из нас. В общем, масштаб цен на неходовую элементную базу заставил меня искать альтернативу...
Контроллер тележки на Arduino
...и она быстро нашлась - Arduino Pro Mini за 104 рубля с доставкой.
Пришелец из Китая
В конце концов, пусть за "тележкой" следит один контроллер, который и будет выполнять всю "грязную" работу, а основной будет наблюдать за окружающей обстановкой, получать у "извозчика" показания счетчиков валкодеров и отдавать ему же приказы на управление моторами.
Т.е. кроме счетчиков валкодеров (кстати, полноразрядных - long, вместо жалких аппаратных 4-5 разрядов) контроллер тележки будет управлять двигателями. А заодно (чтобы не простаивал) измерять значение потребляемого роботом тока, напряжение на батареях питания (чтобы вовремя подать сигнал о необходимости их зарядки), считывать значение датчика линии, а также управлять индикаторными светодиодами и пьезоизлучателем.
Для измерения тока служит блок на LSC712, для измерения напряжения - делитель на резисторах. В обоих случаях измерительный вход шунтируется конденсатором для уменьшения шумов.
Оценки показывают, что все это должно укладываться в 1.0-1.5 мс, а потому данные с валкодеров будут считываться в цикле. Безо всяких прерываний. Две критичных вещи - ультразвуковой датчик и датчик ПДУ контроллером "тележки" опрашиваться не будут. Не будут им опрашиваться и датчики положения, т.к. все они работают по I2C, по этому же протоколу будут обмениваться между собой основной контроллер Ардуино с Ардуино-"извозчиком", а, как известно, в системе должен быть только один Мастер, каковым и будет основной Ардуино. "Извозчик" же будет простым Слейвом, и опрашивать другие слейв-устройства не сможет.
Принципиальная схема
На рисунке показана принципиальная схема, которая была использована при отладке.
В итоговом устройстве, вероятно, в качестве основного контроллера будет использован Ferduino Uno, а для тележки - Arduino Pro Mini, но при отладке (пока не прибыла посылка с Pro Mini) роль основного выполнял Arduino Uno R3, а контроллера тележки - Ferduino Uno.
Особенность Mini - слабомощный стабилизатор питания. Если при отладке вся периферия запитывалась с платы Ferduino (а по сути - от USB), то в рабочем образце нужно будет ставить дополнительный стабилизатор. Я еще не решил, каким он будет, линейным или импульсным, но от него будут запитана вся периферия тележки (валкодеры, логическая часть драйвера мотора, схемы амперметра, датчики линии и светодиоды), а также сервопривод. Именно сервопривод, потребляющий основной ток и работающий в импульсном режиме, и заставляет склоняться в пользу линейного стабилизатора, не потребляющего тока в режиме без нагрузки.
Вся I2C периферия (акселерометр, гироскоп, компас, EEPROM, OLED дисплей), а также датчик ПДУ и дальномеры будут запитаны от стабилизатора основного контроллера.
Датчики тока, напряжения и буззер
Набор функций тележки
Итак, контроллер тележки должен управлять двигателями. Из одной темы настоящего форума я почерпнул информацию о том, что наибольшая погрешность положения (а заодно неконтролируемый разворот вокруг оси) возникает в моменты резкого старта и торможения, когда колеса проскальзывают. Ну и потребление тока в эти моменты возрастает более чем на порядок. А при резкой переполюсовке (смены направления движения с "вперед" на "назад" или наоборот) сила тока возрастает еще вдвое по сравнению со стартовым током.
Чтобы убить сразу двух зайцев, я решил сделать в качестве основных режимов плавный разгон и плавную остановку. Точнее, ступенчатую: величина напряжения (ШИМ), подаваемая на каждый из двигателей, меняется каждые 15 мс ступеньками не более 32 единиц в нужную сторону, пока не достигнет требуемого значения. Т.е. "переполюсовка" выглядит так:
было : 255
0 мс : 223
15 мс : 191
30 мс : 159
45 мс : 127
60 мс : 95
75 мс : 63
90 мс : 31
105 мс : -1
120 мс : -33
135 мс : -65
150 мс : -97
165 мс : -129
180 мс : -161
195 мс : -193
210 мс : -225
225 мс : -255
дальше: -255
Т.к. точного сдвига фаз между датчиками валкодеров добиться не удалось, погрешность положения фронтов оказалась довольно высокой. Собственно, валкодер в каждом канале формирует по 12 импульсов на оборот, т.е. 12 передних и 12 задних фронтов - всего по 24 изменения. Оба вместе - 48, но они за счет погрешности положения фронтов расположены не совсем равномерно. Да и эксцентриситет колес вносит свою лепту в погрешность. В общем, суммарную погрешность я оцениваю порядка 90 градусов валкодера. В идеале погрешность не превышает половину единицы младшего разряда (ошибка дискретизации), в среднем - четверть. У нас - порядка единицы младшего разряда. Тоже не так плохо. Для оценки расстояния. А для оценки скорости - никуда не годится. По сути, погрешность скорости получается порядка величины самой скорости. Чтобы существенно уменьшить погрешность, скорость вычисляется по сумме 4-х последних изменений состояний валкодеров, т.е. по 360 градусов их цикла. Таким образом, мы убираем погрешность от сдвига фаз между валкодерами не равного 90 градусов и от того, что скважность импульсов отличается от 2. Остаются лишь погрешности, связанные с полным оборотом, в частности, из-за эксцентриситета колеса и неточности изготовления отдельных зубцов. В принципе, можно было бы усреднить и по 48 отсчетам, но тогда получилась бы слишком большая задержка в определении скорости - в среднем на полоборота колеса, т.е. на 66 мм пути. Тогда как сам путь измеряется в единицах равных 2.75 мм.
Измерение любого аналогового сигнала - длительная операция (что связано со спецификой работы АЦП), кроме того, сопряженная со значительным уровнем шумов. Поэтому предусмотрены режимы работы как с проведением измерений, так и без них. Соответственно - команды включения и выключения режима измерения каждой величины по отдельности. Для уменьшения уровня шума применены как аппаратные средства (шунтирующий конденсатор), так и программные - усредняется значение 16 измерений. Одновременно такое усреднение позволяет увеличить чувствительность датчиков, т.к. по сути, производится не усреднение, а простое суммирование, т.е. выходная величина лежит уже не в диапазоне от 0 до 1023, а в диапазоне от 0 до 1023 * 16 = 16368. Т.е. результат получается не 10-, а 14-разрядным.
Если вдруг случайно будет пропущен один фронт одного из импульсов валкодеров, в некоторых случаях это можно детектировать (собственно, во всех случаях, когда пропущена ровно один фронт). Количество таких пропусков также подсчитывается для каждого из колес. Но в режиме нормальной работы пока ни одной ошибки зафиксировано не было. Но проверка осталась.
Если колеса не движутся, импульсы с валкодеров не поступают, состояния не меняются. А скорость вычисляется по 4-м последним интервалам смены состояний. Чтобы избежать ошибок в вычислении скорости (например, после часа стоянки будет возвращена скорость непосредственно перед остановкой), введены таймауты. Величина таймаута выбрана равной 400 мс, т.к. в процессе измерений выяснилось, что колесо скорее остановится совсем, чем интервал между сменами состояния достигнет такой величины. Количество таймаутов также подсчитывается. Кстати, можно вычислить _время_простоя_ = _количество_таймаутов_ * _длительность_таймаута_.
Команды передаются по протоколу I2C. Каждая команда - один байт. Если это команда управления, за ней может следовать несколько байтов данных. Команды запроса данных не передают байты данных от Мастера Слейву - только код команды. Но после этого Мастер должен прочитать какое-то количество байтов от Слейва. Во всех командах, где присутствуют данные, связанные с колесами, первыми следуют данные, относящиеся к левому колесу.
В процессе того, как "крутится" цикл, подводится статистика: распределение длительности выполнения цикла в 20 мкс единицах. Средняя длительность цикла без измерения аналоговых величин составляет около 300 мкс, если при каждом проходе цикла измерять обе величины, время выполнения цикла примерно удваивается. В случае, если Мастер запрашивает у Слейва данные, последний отдает их по прерываниям, т.е. этот процесс приостанавливает выполнение цикла. Верхняя оценка для времени приостановки цикла - 650 мкс. В случае, если Мастер запрашивает у Слейва данные, последний отдает их по прерываниям, т.е. этот процесс приостанавливает выполнение цикла. Верхняя оценка для времени приостановки цикла - 650 мкс. Но она разбивается на два фрагмента, каждый из которых вызывается по прерыванию: одно - для чтения кода команды, а другое - для передачи данных.
Тележка поддерживает следующие команды (в скобках - количество байтов данных, передаваемых от Мастера Слейву):
0x1a - плавно установить скорость левого мотора, (int - 2 байта),
0x2e - плавно установить скорость правого мотора, (int - 2 байта),
0x3a - мгновенно установить скорость левого мотора, (int - 2 байта),
0x4e - мгновенно установить скорость правого мотора, (int - 2 байта),
0x5b - плавно установить скорость двух моторов, (2 int - 4 байта),
0x6b - мгновенно установить скорость двух моторов (2 int - 4 байта),
0xc8 - разрешить измерение силы тока, (0 байтов),
0xc9 - запретить измерение силы тока, (0 байтов),
0xd8 - разрешить измерение напряжения, (0 байтов),
0xd9 - запретить измерение напряжения, (0 байтов),
0xe9 - установить режим работы пьезоизлучателя, (1 байт),
0xf9 - установить режим работы одного из светодиодов, (1 байт),
Команды запроса состояния (в скобках - количество байтов данных, передаваемых от Слейва Мастеру):
0x10 - путь обоих колес с учетом направления (5м и -3м = 2м), (2 long - 8 байтов),
0x30 - модуль пути обоих колес (5м и -3м = 8м), (2 long - 8 байтов),
0x43 - скорость обоих моторов, (2 int - 4 байта),
0x80 - количество ошибок обоих валкодеров, (2 long - 8 байтов),
0x81 - мин. и макс. интервалы между фронтами для обоих валкодеров, мс (4 int - 8 байтов),
0x82 - количество таймаутов для обоих колес, (2 long - 8 байтов),
0x90-0x9f - распределение длительности основного цикла в 20 мкс единицах, выдается порциями по 32 байта,
0xc2 - запрос силы тока (если измерение выключено, возвращает -1), (int - 2 байта),
0xd2 - запрос напряжения батареи (если выключено, возвращает -1), (int - 2 байта),
0xf0 - запрос состояния датчиков линии (1 байт, из которого используются 3 младшие бита).
Исходники
Приведены скетчи и библиотечные функции отладочного варианта.
Motor_Dolly_Control_03.ino - скетч основного контроллера (Мастер).
Motor_Dolly_03.ino - скетч контроллера тележки (Слейв). В начале работы самостоятельно некоторое время крутит колеса в разные стороны, после отладки это нужно убрать.
dolly.h - заголовочный файл библиотеки контроллера тележки.
dolly.cpp - исполняемый код библиотеки контроллера тележки.
(продолжение следует)
Часть 3
Исследуем мотор
(продолжение следует)
Часть 4
Исследуем серводвигатель
(продолжение следует)
Часть 5
I2C периферия - компас
(продолжение следует)
Часть 6
I2C периферия - акселерометр и гироскоп
(продолжение следует)
Часть 7
Датчики расстояния
(продолжение следует)
Часть 8
Внешнее управление - IR Control
(продолжение следует)
Часть 9
I2C периферия - дискетка на EEPROM
(продолжение следует)
Часть 10
Составляем карту
(продолжение следует)
Тексты программы Processing не привожу. Имея опыт использования этого инструмента ровно 0 дней, трудно написать программу, которая не показалась бы смешной опытному программисту.
начхай на "опытных" програмистов и выкладывай всё.. опытные пусть идет пасутся... а то развелось тут понимаешь.. худють топчут
начхай на "опытных" програмистов и выкладывай всё.. опытные пусть идет пасутся... а то развелось тут понимаешь.. худють топчут
500 строк за 3 вечера: выкладывать такое - неуважение и к себе и к окружающим. Это - типичный одноразовый код. Усугубляемый незнанием Processing'а. В нем вообще структуры предусмотрены? Или их нужно объевлять как class? И почему я не могу сразу задать массивы нужной мне длины, а вынужден под каждую пару чисел писать выделение памяти?
500 строк за 3 вечера: выкладывать такое - неуважение и к себе и к окружающим. Это - типичный одноразовый код. Усугубляемый незнанием Processing'а. В нем вообще структуры предусмотрены? Или их нужно объевлять как class? И почему я не могу сразу задать массивы нужной мне длины, а вынужден под каждую пару чисел писать выделение памяти?
а я его вообще в глаза никогда не видел. нафиг он нужен то.
Это типа "не занимать, сюдой щас придуть!" :)
С "картографом" не совсем соглашусь. Робот сможет мерять то пространство куда ОН можнт проехать.
Когда мне сообщают что у меня код написан не по фэншую, то предлагаю переписать самому или пойти на Йух. Поэтому стыд в ентом деле не уместен.
Когда мне сообщают что у меня код написан не по фэншую, то предлагаю переписать самому или пойти на Йух. Поэтому стыд в ентом деле не уместен.
помню, помню... дискусию про "лапшу" и удобо читаемость... злой ты
Это типа "не занимать, сюдой щас придуть!" :)
С "картографом" не совсем соглашусь. Робот сможет мерять то пространство куда ОН можнт проехать.
Да, конечно.
Как-то робототехника пока находится в том состоянии, что мы, люди, пытаемся создать для роботов наиболее комфортные условия для работы. Иначе они не справятся.
В частности, предполагается, что если мы решили закрыть дверь в комнату, то для робота Вселенная заканчивается по внешней поверхности двери. И даже расставленные по полу картонные коробки отделяют реальное пространство от несуществующего.
Кстати, пришедший ко мне в посылке китайский робот уже был оснащен датчиками линии (по сути три пороговых дальномера). Зачем картографу датчик линии - я не знаю. Вот и думаю, может переделать их в датчики края, чтобы обезопасить робота от падений с лестницы, со стола и прочих мест, где он может оказаться.
Когда мне сообщают что у меня код написан не по фэншую, то предлагаю переписать самому или пойти на Йух. Поэтому стыд в ентом деле не уместен.
Неужели у кого-то вызвал серьезный интерес мой явно одноразовый код?
Нет, если серьезно интересно, создайте отдельную темку в разделе "Программирование" и задайте там мне прямой вопрос - я размещу там текст программы и даже отвечу на некоторые вопросы по нему.
PS. Интересно, сможет робот-картограф послужить аргументом в споре с БТИ?
Меня - не заинтересовал, это если честно. Но так принято - если пишут в разделе проект, то выкладывают код. Может кто-то повторить 1-1 захочет?
С БТИ - не сможет. Или Вы будете его сертифицировать по ГОСТам?
у нас просто есть в планах проект который будет частью общей системы... если интересно присоединиться. то можешь накорябать мне в гугл+ . я обьясню в чем твой подход не очень правилен и как это можно исправить и сделать это частью общей системы :) у нас простони рук ни времени не хватает все сразу развивать.
Ты мне в хангауте уже надоел. Нафига я тебе еще в гуглеплюсе писать буду?!?!?!
Ты мне в хангауте уже надоел. Нафига я тебе еще в гуглеплюсе писать буду?!?!?!
а я вообще не тебе. и не нада тут ревновать :) а то щас все бросим и бум строить робота
Меня - не заинтересовал, это если честно. Но так принято - если пишут в разделе проект, то выкладывают код. Может кто-то повторить 1-1 захочет?
Код я выложил.
Который можно запустить на Ардуине. Форум ведь посвящен ей, а не Процессингу. Тем более, что в выложенном скетче кроме бинарного предусмотрен и текстовый вывод в консоль.
у нас просто есть в планах проект который будет частью общей системы... если интересно присоединиться. то можешь накорябать мне в гугл+ . я обьясню в чем твой подход не очень правилен и как это можно исправить и сделать это частью общей системы :) у нас простони рук ни времени не хватает все сразу развивать.
Вы всерьез полагаете, что меня может заинтересовать проект, о котором я ничего не знаю?
И потом, на данном этапе мой проект меня вполне устраивает. Тем более, что основная его цель - это не изготовить что-то, а понять возможности как контроллера, так и более или менее стандартной периферии для него. Ну, например, какой точности позиционирования можно добиться на коленке. Мне кажется, что вполне естественно, когда в первые недели знакомства с новой сущностью познавательные интересы существено преобладают над изготовительными.
Вы всерьез полагаете, что меня может заинтересовать проект, о котором я ничего не знаю?
И потом, на данном этапе мой проект меня вполне устраивает. Тем более, что основная его цель - это не изготовить что-то, а понять возможности как контроллера, так и более или менее стандартной периферии для него. Ну, например, какой точности позиционирования можно добиться на коленке. Мне кажется, что вполне естественно, когда в первые недели знакомства с новой сущностью познавательные интересы существено преобладают над изготовительными.
ну отлично. пойду за попкорном. колхоз дело добровольное. интересно просто как будут решаться некоторые проблемы с построением карты. ну например когда робот тупо не может проехать куда то.. имхо но карта будет какая то убогая...
да кстати для картографии комнат не нужно никуда особо ездить.. можно просто взять лидар хотя бы баксов за 80. он есть в исполненнии для ардуино с библиотеками. и просто отсканировать всю комнату :)
ну отлично. пойду за попкорном. колхоз дело добровольное. интересно просто как будут решаться некоторые проблемы с построением карты.
Мне тоже интересно. Собственно, ради этого интереса и вожусь с ним. :)
Есть проблемы, которые либо вообще не решаются, либо не решаются на данном уровне развития техники, либо решаются за совсем другие деньги. Согласитесь, составление карт видимой и обратной сторон Луны - это немного разные по ресурсоемкости задачи. Хотя, казалось бы, какая разница.
да кстати для картографии комнат не нужно никуда особо ездить.. можно просто взять лидар хотя бы баксов за 80. он есть в исполненнии для ардуино с библиотеками. и просто отсканировать всю комнату :)
Желательно рентгеновский лидар, чтобы построить план не единственной комнаты, а всей квартиры.
PS. Собственно, меня интересует в первую очередь доступная простыми средствами точность позиционирования. А "картограф" - это уже вторичное. Вплоть до не совсем удачного названия. Но ведь надо как-то назвать.
Собственно, меня интересует в первую очередь доступная простыми средствами точность позиционирования. А "картограф" - это уже вторичное. Вплоть до не совсем удачного названия. Но ведь надо как-то назвать.
позиционирование оно всегда относительно чего то... вот как только определишся относительно чего, тогда и можно смотреть решения... а их навалом и не дорого.
а мне интересно как будет решаться проблема движения не по прямой? есть валкодер как на картинке хорошо. но подстройки скорости нет. то есть изза разброса параметров моторов, сопротивления, движение в лучшем случае будет по дуге
это если не учитывать разные поверхности по котором будет ездить. математически вроде как можно рассчитать расстояние по разнице количества импульсов с валкодера и зная точный диаметр колеса. но как компенсировать поверхность хз.
ставить еще колесо с валкодером без мотора? чтобы по нему проверять моторы. может один уже буксует. но колесо только покажется движется шасси или нет, а не в какую сторону. то есть если случилось что одно колесо забуксовало, шасси повернулось. по колесу контрольному определили что случилось что то. остановили. но шасси уже повернулось
компас теоретически может эту проблему решит, но говорят он очень чувствителен к электромагнитным наводкам (сам не проверял). так что есть над чем подумать
так что есть над чем подумать
80 баксов за лидар на 40 метров.. покроет большинство комнат...
так что есть над чем подумать
80 баксов за лидар на 40 метров.. покроет большинство комнат...
ага. но тут получается путь проще. это не значит что это нереальный хоть и геморра много. с лидаром конечно намного проще
думаю вопрос не стоит как сделать картограф чтобы получать качественные карты, а личный интерес и энтузиазм
думаю вопрос не стоит как сделать картограф чтобы получать качественные карты, а личный интерес и энтузиазм
прям вечер воспоминаний какой то...
-Товарищ капитан, а может лучше не ломами а вениками подметать? Оно и чище будет.
-А мне не нужно чище, мне нужно что бы вы заипались и спали ночью, а не в самоходы бегали!
ну если так то и катера и самолеты мне бессмысленно собирать. купи готовый и балуйся. или твой проект с "искуственным интеллектом". подобное наверно уже есть
а мне интересно как будет решаться проблема движения не по прямой? есть валкодер как на картинке хорошо. но подстройки скорости нет. то есть изза разброса параметров моторов, сопротивления, движение в лучшем случае будет по дуге
это если не учитывать разные поверхности по котором будет ездить. математически вроде как можно рассчитать расстояние по разнице количества импульсов с валкодера и зная точный диаметр колеса. но как компенсировать поверхность хз.
ставить еще колесо с валкодером без мотора? чтобы по нему проверять моторы. может один уже буксует. но колесо только покажется движется шасси или нет, а не в какую сторону. то есть если случилось что одно колесо забуксовало, шасси повернулось. по колесу контрольному определили что случилось что то. остановили. но шасси уже повернулось
компас теоретически может эту проблему решит, но говорят он очень чувствителен к электромагнитным наводкам (сам не проверял). так что есть над чем подумать
ну если так то и катера и самолеты мне бессмысленно собирать. купи готовый и балуйся. или твой проект с "искуственным интеллектом". подобное наверно уже есть
дело не в этом... ты же собираешь катер из подходящих материалов.. а не тупа из гавна найденого в кладовке.. типа старывй ботинок и пропелер от бабушкиного вентилятора... ты ж не ограничиваеш себя в материялах для проекта.. типа хочу блин катер из туалетной бумаги.. типа это мой вызов всему миру..
в материалах ограничиваю, вариантов много, да и не все по трудоемкости мне подходят. некоторые по цене. но не из туалетной бумаги конечно))
в материалах ограничиваю, вариантов много, да и не все по трудоемкости мне подходят. некоторые по цене. но не из туалетной бумаги конечно))
не ну понятно что не из позолоченого титана пилишь... но тут то разговор идет о лидаре за 80 баксов... а не за 800
наверно хочется просто. я например в катере вместо того чтобы использовать готовый драйвер за 8-10 баксов, магазинной ардуины 3бакса, преобразователя за 1бакс сделал свою под конкретную задачу и небольшими габаритами. и основывался на удобстве использования и минимума проводов и контактов, влага все таки
и пока устранил все недостатки было 3 версии платы. точнее 2 + доп. диоды
хотя мог и на магазинных сделать, спаять, приделать клеммы, залить эпоксидкой, но не стал
наверно все таки основывается на том хочу сделать именно так
наверно хочется просто. я например в катере вместо того чтобы использовать готовый драйвер за 8-10 баксов, магазинной ардуины 3бакса, преобразователя за 1бакс сделал свою под конкретную задачу и небольшими габаритами. и основывался на удобстве использования и минимума проводов и контактов, влага все таки
и пока устранил все недостатки было 3 версии платы. точнее 2 + доп. диоды
хотя мог и на магазинных сделать, спаять, приделать клеммы, залить эпоксидкой, но не стал
наверно все таки основывается на том хочу сделать именно так
ну так по факту обошлось дороже чем если бы купил :)
у меня? как раз нет)))
а мне интересно как будет решаться проблема движения не по прямой? есть валкодер как на картинке хорошо. но подстройки скорости нет. то есть изза разброса параметров моторов, сопротивления, движение в лучшем случае будет по дуге
Валкодер в принципе не способен подстраивать скорость. Это - датчик, а не исполнительное устройство.
это если не учитывать разные поверхности по котором будет ездить. математически вроде как можно рассчитать расстояние по разнице количества импульсов с валкодера и зная точный диаметр колеса. но как компенсировать поверхность хз.
Пока поверхность предполагаю абсолютно ровной. Кстати, проходимость робота ожидается довольно низкой из-за того, что передняя и задняя опоры сделаны на шариках. Думаю, для таких уже 5 мм - непреодолимое препятствие. Но точно не знаю, как дойдет до "полевых испытаний", - проверю.
Пока робота целиком даже не собирал, проверяю отдельные детали.
ставить еще колесо с валкодером без мотора? чтобы по нему проверять моторы. может один уже буксует. но колесо только покажется движется шасси или нет, а не в какую сторону. то есть если случилось что одно колесо забуксовало, шасси повернулось. по колесу контрольному определили что случилось что то. остановили. но шасси уже повернулось
Пробуксовка - отдельная проблема. Пока считаю, что робот должен объезжать препятствия, не доезжая до них. Если окажется, что это не так, тогда буду думать.
компас теоретически может эту проблему решит, но говорят он очень чувствителен к электромагнитным наводкам (сам не проверял). так что есть над чем подумать
Аналогично. Компас заказал сразу вместе с тележкой, но пока даже не распаковывал. Сейчас продолжаю возиться с валкодерами - пытаюсь приспособить к ним аппаратный счетчик. Но под руками ничего кроме 555ИЕ7 не нашлось. А для него нужный режим счета не документирован. Пытаюсь понять, можно приспособить или нет. Если окажется, что нет, перейду к моторам, а потом к серве. Кстати, по серве получил интересные результаты. Только ток через нее пытался измерить на резисторе 0.1 Ома. По измерениям получается до 3 А. Но, скорее всего, дело в сопротивлении подводящих проводов и контактов, которые сами по себе больше 0.1 Ома, а то откуда в USB взяться трем амперам.
Не надо.
У GPS погрешность 10-30 м, а у меня характерный размер единицы метров, а желаемая точность 1-2 см.
Не надо.
У GPS погрешность 10-30 м, а у меня характерный размер единицы метров, а желаемая точность 1-2 см.
Боюсь, колеса такой точности не обеспечат.
Разговор о "лидаре за 80 баксов" пойдет только после того, как я обнаружу, что либо без него никак не справиться, либо, что лидар - оптимальное решение.
Пока собираюсь использовать одновременно ИК и УЗ датчтки и сравнивать их показания (хотя не очень понятно, как учитывать существенно различающиеся диаграммы направленности).
Что-то мне подсказывает, что лазерная мышка может довольно точно перемещение отслеживать.
Что-то мне подсказывает, что лазерная мышка может довольно точно перемещение отслеживать.
гыыыыы это вам ваша безграмотность подсказывает :)
Но должна же и от безграмотности быть какая-то польза.
Но должна же и от безграмотности быть какая-то польза.
ну теоретически. если на пузо роботу прилепить мыш лазерную и обеспечить плотное касание к поверхности, то конечно будет этакий сканер пола с 1300dpi..
но мне так видиться что это будет несколько трудновато в плане механики...
Что-то мне подсказывает, что лазерная мышка может довольно точно перемещение отслеживать.
гыыыыы это вам ваша безграмотность подсказывает :)
Да уж куда мне до такого гения, как ты.
Но должна же и от безграмотности быть какая-то польза.
ну теоретически. если на пузо роботу прилепить мыш лазерную и обеспечить плотное касание к поверхности, то конечно будет этакий сканер пола с 1300dpi..
но мне так видиться что это будет несколько трудновато в плане механики...
Но соизмеримо с энкодерором или валкодером.
Да уж куда мне до такого гения, как ты.
и это верно! :)
Но соизмеримо с энкодерором или валкодером.
не факт... например по надраеному паркету нифига не хочет мыша нормально ездить :(
Но соизмеримо с энкодерором или валкодером.
не факт... например по надраеному паркету нифига не хочет мыша нормально ездить :(
Выкини свою мышь! У меня defender made in Китай, работает ювелирно....уже почти год на двух батарейках по радио.