Здравствуйте. У меня стандартная платформа для робота-автомобиля, управляемая двумя моторами, через драйвер L298. Беда в том, что моторы вращаются с разной скоростью, и никак не удаётся заставить ехать робота прямо. С помощью ШИМ удалось подобрать коэффициент, чтобы он ехал более-менее ровно, но всё равно движение робота достаточно непредсказуемо. Думаю, что это задача весьма стандартная и наверняка многие её как-то решали. Буду благодарен, если поделитесь своим опытом.
наверно самое правильное решение - установка энкодеров, на многие платформы такая установка предусмотрена.
все моторы и редукторы разные, поэтому без синхронизации и установки следящей системы всегда будет уводить в сторону. или энкодеры или один мотор на движение, другой на руление...
Приделал к моторам энкодеры (диски такие с дырочками). Теперь думаю как интерпретировать их показания, чтобы ровно рулить? Есть какие-то готовые решения?
Считать и корректировать скорость вращения. Задаете разным двигателям одинаковую скорость, измеряете интервалы времени между импульсами каждого отдельного энкодера, отношение между интервалами времени с разных энкодеров дает поправочный коэффициент на задаваемую скорость. Ждете пока относительная погрешность не свалится под порог. Пишете автоматический тест. Калибруетесь сначала в холостом режиме, потом под нагрузкой. Снимаете показания для каждого значения скважности ШИМ, потом аппроксимируете эту зависимость какой-нибудь функцией.
Если без энкодеров, то один из самых простых способов которые я видел, такой: Берем потенциометр, выставляем его на середину и подключаем к аналоговому входу. Потом выставляем скорость на максимум, в коде пишем, чтобы значение с потенциометра отнималось от скорости одного из моторов, смотря в какую сторону повернуть крутилку. Ну и запускаем платформу. вращением потенциометра добиваемся, чтобы платформа ехала прямо. Более бустрый мотор должен стать медленнее, а медленный - на максимуме. Делим значение шим, что получилось при уравнивании быстрого мотора на 255 (шим медленного мотора), получаем коэффициент. Потом желаемую скорость быстрого мотора всегда домножаем на этот коэффициент и все. Коэффициент можно в EEPROM хранить. Примерно так мы сделали в коде катера, только вместо потенциометра кнопки стрелы использовали http://wiki.amperka.ru/projects:bottleboat
Заметил, что скорость моторов меняется от времени работы (и от заряда батарей), так что в функцию аппроксимировать наверно не получится. Попробую сделать подбор скорости на ходу, если что-нибудь выйдет из этого.
А еще частенько бывает, что различается не столько скорость моторов на марше, сколько переходные процессы при запуске и остановке. В результате при постоянной скорости тележка едет в основном почти прямо, а при старте, остановке или значительном изменении скорости ее немного разворачивает. Так что, действительно, функция может и не помочь. Надо постоянно следить за разницей в показаниях энкодеров и корректировать скорости моторов. Причем если тупо реагировать на каждое отклонение в один-два импульса, то тележка поедет зигзагами. А еще надо как-то обрабатывать "правильные" повороты, обусловленные командой оператора или алгоритмом движения, когда разница в количестве импульсов обоснована и должна быть в определенных пределах, определяемых характеристиками желаемого поворота.
А может можно поставить компас и при изменении градуса поворота - изменять скорость вращения соответствующего двигателя? Я думаю сейчас решать этот же самый вопрос..
Это уже следующее приближение. Вы можете полагаться исключительно на динамику, а можете превентивно устранять некоторую часть разбега калибровкой.
Ну понятно, что в идеале там будет что-то типа ПИД-регулятора, обновляющего свое состояние после каждого импульса энкодера, но начать можно и с чего-то попроще.
Тоже была такая мысль, но выяснилось, что компас, особенно на ходу, даёт довольно большую погрешность.
Написал функцию подбора коэффициента по показаниям энкодеров, но работает всё равно нестабильно. На этапе разгона успевает градусов на 20 повернуть, а ещё коэффициент достаточно сильно меняется по времени (может быть подсевшие аккумуляторы виноваты, заряжу перепроверю).