Микроконтроллер CM-530 и сервопривод Dynamixel AX-12A
Dynamixel AX-12A Dynamixel AX-12A Добрый день, уважаемые читатель. Сегодня мы изучаем самые базовые принципы работы с сервоприводами Dynamixel AX-12A на контроллере CM-530.
Платформа для меня вообще не знакомая, разве что в R+ Motion визуально запрограммить биолоида. Но когда решил собрать первую модель робота с набора ТехноЛаб (профессиональный уровень), столкнулся с тем, что информации в интернете мало, либо она не совсем конкретна, а примеры работ, которые встроены в ПО, уж больно раздуты и сложны для базового понимания.
Обратился к методичке для преподователя от ТехноЛаб (исследовательский уровень). Там конечно всё более менее понятно, но опять таки много лишнего. Н.р., зачем то нужно использовать проверки правильного ID мотора, функцию правильности сборки механизма и настройки приводов и прочее, прочее, прочее. Уже начал подумывать, что просто надо принять логику новой платформы и языка программирования. Но всё же как-то не то, усложнено до безобразия, в сравнении например с той же Arduino. В общем оставалось продолжать копать дальше, чтобы понять, есть ли более простые способы просто заставить двигаться моторчик или нет. И при этом программу смотрел для устройства «Шлагбаум», где один мотор и всё. Забугровые ютуб каналы, каналы ТехноЛаба, сайты, методички ничего не проясняли. Похоже тупик, подумал я, но… Решил зайти в Robotis e-Manual, может быть сам разработчик прояснит в своих руководствах как наначальном уровне управлять моторами. В общем нырнул и о чудо, нашёл. Не явную информацию, но достаточную, чтобы попробовать поэкспериментировать.
PORT[3]:Servo Motor Position = 802, именно эта строчка натолкнула на мысль о том, что можно банально указать какой мотор используем, его конечную позицию и всё. Аллилуйя, заработало. Даже не понимаю сейчас, как же ранее не получалось, я ведь тоже пытался банально встроить в код минимум строк и запустить, но при загрузке кода в микроконтроллер и запуске программы, ничего не происходило. Программа запускалась и тут же завершалась, так и не сдвинув ни на миллиметр мотор.
Фух, странно, вам может покажется, что вообще плёвое дело, мол друг, ты вообще с какой планеты? Но ведь всё самое простое и лёгкое не всегда на поверхности. В общем всё работает. И теперь можно заставить работать шлагбаум как нам надо с минимумом строчек кода и лишних на начальном этапе, функций.
И вот, настроил мотор на минимум действий. Включаю и мотор лихо поворачивается на градусов 15. Было неожиданно, да и не удивительно, столько провалов. Тут пришло в голову подрегулировать скорость работы мотора. Всё сработало, никаких проблем. Стал понимать, что оказывается программирование через R+ Task не то чтобы сложно, а очень просто. Что-то среднее между ПО LEGO® MINDSTORMS® Education EV3 и ArduinoIDE.
Итак, имеем шлагбаум в закрытом состоянии.
Задача не тривиальная: поднять на 90° шлагбаум, а по прошествии секунды, опустить его. Давайте попробуем. Эмм, и тут конечно началось. Очень забавная штука, этот таймер. Не совсем понял его логику работы, т.к. здесь на результат влияет так же и скорость, с которой мотор работает. Но опытным путём получаем, что, выставив таймер на 2 секунды, у нас всё получается, хотя и не точно. =)
А вот и код:
Здесь я использую цикл «WAIT WHILE», который ждёт пока таймер не дойдёт до нуля.
А теперь давайте управлять кнопочками, так же интереснее, хоть какой-то контроль. Попробовал накидать код, всё сработало, отлично и никаких тебе таймеров:
И тут как раз кстати нашёл экспорт кода в PNG и TXT. Удобно, теперь можно вставлять не только красиво выглядящий код, хоть в 100 строк, но и получить его текстовую версию, вставил и запустил.
Единственное, что пришлось добавить, так это «ENDLESS LOOP» (бесконечный цикл), иначе мы не сможем нажимать кнопочки до посинения. =))) И что интересно, если мы подняли шлагбаум, то повторное нажатие кнопки на подъём ни к чему не приведёт. Я думаю, что дело в том, что мотор передаёт значения своего положения, поэтому и не двигается. С таким я столкнулся впервые, когда только пытался заставить работать мотор. Т.е. как ни выкручивай его, он всегда повернёт на 90 градусов и всё, т.к. в моторе я как понимаю есть своя прошивка и он всегда знает где 90, а где 360. Тут сразу вспомнилась Ардуинка, где работая с сервой, ты повернув его на 90 градусов относительно нынешнего положения и снова отправив команду на поворот, увидишь, что серва снова попытается повернуть на 90 градусов. Т.е. мы имеем дело с очень умными так сказать моторами. =) Dynamixel













