Изменения: Т.к. штатно установка энкодеров в этот корпус не предусмотрена, пришлось изобретать своё. Долго мучался, очень не хотелось вести шлейф из проводов (6 жил на один энкодер), придумал такую плату
Сигнал с энкодеров аналоговый, на сайте pololu есть рекомендация как сигнал должен выглядеть (синусоида), но после экспериментов я решил что прямоугольный сигнал лучше, поэтому для усиления отражающей поверхности я наклеил фольгу (есть такой фольгированный скотч, применяется для герметизации вентиляции). получилось так
Но излучатели в энкодере очень мощьные поэтому очень важно, чтобы энкодеры друг на друга не светили, а то на что они светят должно отражать как можно меньше, иначе сигнал не будет иметь максимальный размах.
STM32F103 и STM32F405 отличаются, требуются дополнительные конденсаторы которых не было у STM32F103 Пришлось немного поколдовать с платой, но ничего сложного, фото не делал.
размещение элементов на olimexino Отличается от оригинального arduino , поэтому плата не встанет в шилд ZUMO без изменений. Пришлось двигать элементы как на olimexino так и на шилде.
Питание:
Аккумулятор подключен к плате защиты от перезаряда/переразряда и защита от высоких токов. С выхода этой платы питание идёт на шилд.
С выключателя точку OFF, через полевой транзистор N-канальный, я завёл на контроллер, чтобы можно было самоотключиться, положение OFF основное рабочее. Выключить можно программно, или если нажать кнопку reset. Для включения кратковременно переводим выключатель в положение ON и затем в OFF.
В точку VRP через диод приходит входное напряжение зарядки (12в) это же напряжение через резистор приходит на базу Q1 и тем самым закрывает его, т.е. в момент зарядки аккумулятор отключается от бортовой электроники.
Зарядка подключена к аккумулятору аналогично приведенной выше схеме (simple ups for robot), через Q2 который отрывается когда появляется питание на зарядке. Другими словами, если питания на зарядке нет то аккумулятор отключен от зарядки.
Olimexino имеет встроенный импульсный стабилизатор на 5в, поэтому входное напряжение заряда 12в не страшно. Повышающий преобразователь на шилде тоже нормально переносит 12в.
Напряжение аккумулятора через делитель приходит на АЦП контроллера, так что можно отслеживать как разряд так и заряд.
Зарядка тоже управляется отдельно (вкл/выкл) для этого я использую дополнительный транзистор который сажает на землю одну ножку на зарядке, в результате заряд прекращается. Таким образом я программно отключаю зарядку когда напряжение достигнет 7.2в.
Вся конструкция сборно разборная, на коннекторах, отдельно корпус, шилд, контроллер, так что разобрать, в случае необходимости, не составляет труда.
Программная часть: 1)операционка Chibios 2)как основной процесс elua
Отдельный поток на управление моторами Отдельный поток на IMU
Программа управления пишется на Lua, lua скрипты хранятся на micro-sd карте (fat32), так что достаточно просто запустить другую программу и поведение робота меняется. На борту есть встроенный редактор vi так что небольшие изменения я делаю на самом роботе.
Lua файлы можно загружать удалённо по протоколу xmodem.
Единственное изменение, данные компаса (вектор) я пропускаю через медианный фильтр на 50 значений, так дёргается меньше и минимум-максимум более средние получаются, на скорость изменения положения не влияет. Частота опроса компаса 200Гц, основной алгоритм расчёта положения ведётся с частотой 50Гц.
_________________ R3 forum87/topic15337.html R2 roboforum.ru/forum102/topic13980.html R4 roboforum.ru/post336339.html#p336339 Делать надо хорошо - плохо получится само!
Последний раз редактировалось linvinus 26 май 2016, 16:16, всего редактировалось 11 раз(а).
_________________ R3 forum87/topic15337.html R2 roboforum.ru/forum102/topic13980.html R4 roboforum.ru/post336339.html#p336339 Делать надо хорошо - плохо получится само!
_________________ R3 forum87/topic15337.html R2 roboforum.ru/forum102/topic13980.html R4 roboforum.ru/post336339.html#p336339 Делать надо хорошо - плохо получится само!
_________________ R3 forum87/topic15337.html R2 roboforum.ru/forum102/topic13980.html R4 roboforum.ru/post336339.html#p336339 Делать надо хорошо - плохо получится само!
Текущие выводы. О том как вычисляют положение по показаниям гироскопа, акселерометра и компаса написано много, для новичков вот неплохая статься http://www.starlino.com/imu_guide.html
Для меня важен курс, для вычисления курса (yaw в английской терминологии) можно использовать только гироскоп и компас. (очень хитро можно и через акселерометр, но это я оставлю вам в качестве домашнего задания )
Гироскоп - путём интегрирования данных гироскопа, получаем курс, соответственно чем точнее интегрирование тем лучше. В современных цифровых MEMS гироскопах есть функция буфера, можно настроить гироскоп так чтобы он снимал показания с определённой частотой и складывал показания в свой буфер, как только буфер заполнится на половину можно получить прерывание и считать все значения, таким образом получается очень точное интегрирование (без пропусков), и небольшая нагрузка на центральный процессор.
update, я полагал что датчик показывает изменение между опросами, это не так, это тоже самое как если бы вы оцифровывали данные аналогово гироскопа, так что часть про "очень точное интегрирование (без пропусков)" это скорее мечты, но близкие к реальности, с другой стороны обычные домашние роботы не выделяются скоростью реакции на управляющее воздействие, поэтому частота интегрирования более 30Гц вполне пригодна. Я использую режим STREAM для чтения данных с гироскопа,при частоте измерения гироскопа 380гц и частоте вычисления положения в 50Гц я получаю усреднение по 7 показаниям гироскопа
В датчике от пололу гироскоп поддерживает эту функцию но ножку, на которой появляется сигнал для прерывания при заполнении буфера, они не вывели. update: да и не особо нужно, частота шины i2c всго 400кГц max (за исключением устройстве поддерживающих другие стандарты (до 1Мгц) ), одно измерение gyro: uint16t x,y,z это 6 байт, чтобы получить 32 измерения из FIFO при частоте 400кГц нужно чуть более 40мс (к слову 50Гц это период в 20мс), за это время FiFo буфер уже пополнится новыми данными
Данные гироскопа, по курсу, можно компенсировать компасом, происходит это так, при быстрых изменениях основными считаются показания гироскопа (фильтр высоких частот), а в статике считаются правильными показания компаса, т.е. в статике курс задаётся значениями компаса.
Что такое показания компаса? Это измерение силы магнитного поля в гауссах по трём осям, Но заранее не известно какое значение силы поля считается направлением на север а какое на юг (упрощенно), поэтому требуется калибровка, путём вращения по всем направлениям вычисляются минимум и максимум магнитного поля в данной точке земного шара при текущих помехах, и затем, относительно минимума и максимума определяется положение в пространстве.
В общем на эту тему много чего написано, для меня главное что показания компаса меняются, уплывают минимум и максимум от калибровочных значений, поэтому, при изменившихся условиях, если компас говорит что направление на север это может быть совсем не север. В моих экспериментах я всё время поворачивал датчик на 90градусов , так вот, если поворачивать там где калибровал то всё отлично, но стоит переместиться туда где другие помехи и показания уже не точные, к примеру значение 90 градусов может соответствовать повороту на 70 или 110 физических градусов, при этом поворот на 360 градусов по прежнему будет соответствовать физическому повороту на 360 градусов. т.е. может быть так 0 -> 70 ->170 -> 240 -> 360
Другими словами не все повороты можно считать соответствующими действительности.
Таким образом я пришёл к выводу что для моих целей целесообразнее использовать "правильный" точный гироскоп и забыть про компас, я остановился на модели MPU-9150 (но уже есть и более новая модель), жду когда приедет. Понятно что идеального гироскопа не бывает, а очень точные стоят денег. Пока задача точно поворачивать , т.е. интересует не абсолютное значение курса, а точные показания изменения курса за небольшой промежуток времени (до 10 сек)
_________________ R3 forum87/topic15337.html R2 roboforum.ru/forum102/topic13980.html R4 roboforum.ru/post336339.html#p336339 Делать надо хорошо - плохо получится само!
Последний раз редактировалось linvinus 17 апр 2015, 23:24, всего редактировалось 3 раз(а).
Основные плюсы схемы: 1) Частота пульсаций тока на моторе вдвое больше частоты генерируемых сигналов PWM (к примеру у меня PWM 15кГц, при этом на моторе 30кГц поэтому я не слышу писк) 2) Не меняя PWM возможен режим как генерации так и регенерации. 3) Сквозной сигнал управления для вращения в одну и в другую сторону. Т.е. если таймер считает до 255 то 0 - соответствует вращению в одну сторону а 255 в другую, при 128 мотор стоит на месте и не греется, хотя pwm работает.
Это свойство очень пригождается в pid контроллере, если значение pid приближается к 128 или уходит в минус то мотор очень быстро, но контролируемо, замедляется. Особенно это заметно если мы меняем скорость с максимальной на минимальную но при этом хотим продолжить движение в том же направлении.
Особенности физического подключение драйвера к контроллеру для того чтобы использовать режим "Unipolar 4-Quadrant PWM Technique (Form II)":
В шилде от pololu стоит драйвер DRV8835, этот драйвер умеет работать в двух режимах, 1) Режим IN/IN MODE - когда управляющие сигналы управляют непосредственно верхним и нижним транзистором в плече
2) PHASE/ENABLE MODE - когда ножкой EN включаем плечё а ножкой PH задаётся куда подключена ножка мотора к плюсу или минусу.
PHASE/ENABLE режим используется в шилде по умолчанию, он проще с точки зрения управления, нужен только один вывод PWM на один мотор. Но этот режим имеет ограничение, нельзя оставить мотор в свободном вращении.
Обычно в режиме PHASE/ENABLE направление вращения мотора задаётся на ножке PHASE, а PWM задаётся на ножке ENABLE. И именно так организовано в оригинальной схеме шилда ZUMO.
В этом режиме не возможно получить "Unipolar 4-Quadrant PWM (Form II)"
загнался, получится другой режим, называется Unipolar 4-Quadrant PWMs” (Form 1), https://e2e.ti.com/blogs_/b/motordrivec ... est-part-3. Но для того чтобы сигналы соответствовали режиму работы "Unipolar 4-Quadrant PWM", PWM сигналы должны приходить на ножку PHASE, а ENABLE всё время должен быть 1.
Но такая схема невозможна в схеме подключения adruino, т.к. на ножках D7,D8 нет PWM. (нужно менять местами D7<->D9, D8<->D10)
Выбор режима IN/IN или PH/EN задаётся ножкой mode, если на ней + то DRV8835 работает в режиме PH/EN,иначе IN/IN
В общем, я решил использовать режим IN/IN поэтому я подрезал дорожку которая шла с 12 ножки на 11ю у драйвера DRV8835. Но теперь для управления нужен не один сигнал PWM а два, поэтому пришлось выискивать ножки где есть PWM , менять местами так чтобы четыре PWM сигнала приходило на DRV8835 (я менял местами ножки на шилде).
Настройка таймера: Чтобы получить необходимые сигналы нам нужен таймер в режиме генерации PWM и счёта вверх-вниз (center-aligned PWM). При этом один канал таймер (ch1) идёт на одну ножку IN а второй канал ch2 на вторую ножку IN одного мотора.
Значения для каналов задаются по следующей формуле ch1=SPEED ch2=TIMER_MAX-SPEED. если SPEED = TIMER_MAX/2 то мотор не вращается. если SPEED > TIMER_MAX/2 То вращается в одну сторону если SPEED < TIMER_MAX/2 То вращается в другую сторону
Всё просто
================================================================================= Добавлено спустя 1 минуту 46 секунд: оказывается появился новый робот ZUMO https://www.pololu.com/product/3124
Кстати у меня энкодеры обсчитываются таймерами TIM3,TIM5 контроллера STM32F405, есть специальный режим для энкодеров, так что никак не нагружают процессор
_________________ R3 forum87/topic15337.html R2 roboforum.ru/forum102/topic13980.html R4 roboforum.ru/post336339.html#p336339 Делать надо хорошо - плохо получится само!
Зарегистрирован: 07 сен 2014, 19:29 Сообщения: 645 Откуда: Севастополь
Skype: slom_3d
прог. языки: 3d max :)
посмотрел промо видео
чуть слюной не захлебнулся
но прежде чем покупать, хочу получше узнать об этой штуковине, ее возможностях и сложности использования...
вы говорите определяет объекты только по цветам? то есть формы он не воспринимает? если ему показать синий куб и залочить.... он будет отслеживать его перемещения, а если подменить куб на шар того же цвета то робот подмену не заметит, для него что синий куб что синий шар - фиолетово = одинаковый обьект?
как я понял сделать следящего, ездеющего за цветным предметом робота не проблема, есть готовые скетчи, подключил, залил и поехало? а как насчет более сложной задачи, например сделать так чтобы робот с открытой клешней занял определенную позицию перед обьектом, так чтобы предмет попал в определенную заранее известную часть кадра, вакурат в клешню, и после этого включал алгоритм, схватить, поднять и отпустить... и ехать искать следующий предмет...
тоесть чтобы робот оставленный в помещении с рассыпаными кубиками или шариками мог все их собрать к себе в корзинку своим манипулятором. ?
Зарегистрирован: 29 апр 2011, 12:37 Сообщения: 1672 Откуда: Москва
прог. языки: С
Цитата:
вы говорите определяет объекты только по цветам? то есть формы он не воспринимает? если ему показать синий куб и залочить.... он будет отслеживать его перемещения, а если подменить куб на шар того же цвета то робот подмену не заметит, для него что синий куб что синий шар - фиолетово = одинаковый обьект?
да, всё так, единственное камера различает размеры, если синий шар сильно отличается по размеру от куба то можно это использовать. Если одинаковые то не отличить.
Если куб и шар будут рядом то будет виден один большой синий объект. Тут нужно использовать смекалку, например попробовать потолкать объекты, чтобы их разделить
Сейчас прошивку развивают в направлении определения объектов по двум цветам. Вот тут описано как использовать http://www.cmucam.org/projects/cmucam5/ ... olor_Codes т.е если куб и шар будут иметь разные полоски то можно различить, и даже понять под каким углом лежит объект.
Цитата:
как я понял сделать следящего, ездеющего за цветным предметом робота не проблема, есть готовые скетчи, подключил, залил и поехало?
Да на выходе мы получаем массив прямоугольников - объектов обнаруженных в кадре , каждый прямоугольник описывается координатами x,y, высотой, шириной и индексом цвета (синий зелёный и т.д).
Цитата:
а как насчет более сложной задачи, например сделать так чтобы робот с открытой клешней занял определенную позицию перед обьектом, так чтобы предмет попал в определенную заранее известную часть кадра, вакурат в клешню, и после этого включал алгоритм, схватить, поднять и отпустить... и ехать искать следующий предмет...
Вполне реально, главное чтобы на обоях таких рисунков не было =) а то убъётся об стену
Цитата:
то есть чтобы робот оставленный в помещении с рассыпанными кубиками или шариками мог все их собрать к себе в корзинку своим манипулятором. ?
если между объектами есть пространство или объекты разных цветов то можно.
_________________ R3 forum87/topic15337.html R2 roboforum.ru/forum102/topic13980.html R4 roboforum.ru/post336339.html#p336339 Делать надо хорошо - плохо получится само!
Зарегистрирован: 29 апр 2011, 12:37 Сообщения: 1672 Откуда: Москва
прог. языки: С
Покупал тут http://www.ebay.com/itm/261806347905 планы пока точно не определены, я пока с гироскопом разбираюсь, и жду когда появится прошивка которую можно собрать в gcc.
_________________ R3 forum87/topic15337.html R2 roboforum.ru/forum102/topic13980.html R4 roboforum.ru/post336339.html#p336339 Делать надо хорошо - плохо получится само!
Зарегистрирован: 07 сен 2014, 19:29 Сообщения: 645 Откуда: Севастополь
Skype: slom_3d
прог. языки: 3d max :)
я боюсь с ебея в Крым не довезут, санкции и все такое... на алиекспрес нашел за 4500 на 1000 дороже... насчет поворотного механизма то у меня точ в точь как вы показали на 2й ссылке...
под ведроид есть opencv и vuforia. но пока для вас это слишком сложно будет. от готовых проектов толку будет не сильно больше для копания в коде и адаптации как ни крути, а уметь программировать нужно слегка получше.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения