Итак, мы умеем управлять коллекторными моторами постоянного тока. Пора приступать к сборке тележки, которая станет нашим мобильным роботом. Мы уже имеем управляющую электронику, у нас есть источник питания, моторы и колеса. Чего не хватает? Моторов и колес у нас по 2 штуки, поэтому нам понадобится еще третья опора. В качестве нее мы возьмем вот такой вот шар, который позволит роботу и ездить, и поворачивать вокруг центра оси, проходящей через колеса. Нам нужна рама, ее мы изготовим из знакомых нам деталей. Воспользуемся еще новыми для крепления шаровой опоры и моторов. Кроме этого, нам нужно организовать питание. В экспериментах с моторами мы давали питание контроллеру от компьютера. Здесь же мы используем тот же батарейный отсек, который питает моторы. У нас 4 аккумулятора по 1,2 вольта, то есть 4,8 вольта будет недостаточно для Arduino. Следовательно, нам понадобится повышающий преобразователь напряжения. Давайте повнимательней посмотрим на то, как у нас будет устроено питание. С батарейного отсека провода приходят в повышающий преобразователь напряжения. В этот же клеммник вставлены провода, которые идут напрямую в Motor Shield. То есть безо всякого преобразования 4,8 вольта идут на моторы. Затем из выхода преобразователя провода идут в контроллер Vin и землю. Туда, с помощью подстроечного резистора, мы подадим от 7 до 9 вольт, приемлемых для контроллера. Давайте выставим нужное для контроллера напряжение. [БЕЗ_ЗВУКА] [БЕЗ_ЗВУКА] Вот у меня получилось напряжение порядка 9 вольт, этого для Iskra будет достаточно. Ну что же, у нас получился вот такой вот симпатяга. Прежде чем мы будем учить его ездить, давайте посмотрим, как наш прежний тестовый скетч с проверкой Motor шилда работает в нем. [БЕЗ_ЗВУКА] Я подключил питание просто проводом, пока что у нас нет отдельного выключателя. [СИГНАЛ] Мы снова слышим, как разгоняется мотор. Напряжения еще недостаточно. [ШУМ] Еще два слова о сборке. Я специально не акцентировал ваше внимание на том, как именно мы собираем робота, потому что вы можете экспериментировать как угодно. Напомню, что наша задача – чтобы робот ехал по линии. Она может превратиться в задачу гонки по линии, когда важна будет скорость перемещения. И здесь уже роль начнут играть вещи, влияющие на динамику робота. Например, ширина колесной базы, высота дорожного просвета, расположение центра тяжести, а именно батарейного отсека, и так далее. Сейчас же все это не так важно, нам нужна просто экспериментальная тележка, которая поедет. И мы, наконец, приступим к программированию езды. Посмотрим, что нового у нас появилось в программе. Во-первых, мы добавили макроопределение для пинов второго мотора, enable input. Ну, естественно, сделали их выходами, а затем запустили оба мотора вперед. Кстати, если вы загрузите этот код и робот не поедет у вас вперед – ничего страшного, это зависит от того, как вы подключили моторы. Вы можете, либо поменять местами провода в клеммниках, либо заменить high на low. И запустили оба мотора с максимальной скоростью. Затем мы делаем 1,5-секундную задержку, чтобы увидеть, что происходит, и меняем направление на «полный назад». Снова задержка, после которой один мотор мы запускаем вперед, а другой назад, чтобы робот вращался. Затем проделываем все наоборот, вращаемся в обратную сторону. Кстати, вы можете поворачивать разными способами, не обязательно крутиться вокруг середины робота. Вы можете ехать по дуге, когда у вас оба колеса крутятся вперед, только одно медленно, а другое быстро. [ШУМ] [ШУМ] Должно быть, вы обратили внимание, что робот не всегда едет прямо, а его повороты кончаются в разных местах, то есть угол поворота, проделанного за одно и то же время, различается. Это естественно, и без обратной связи, то есть без отслеживания того, насколько фактически провернулось колесо, мы никогда не сможем добиться идеально ровной езды. Даже одинаковые моторы одного производителя могут немножко отличаться друг от друга, с чем постоянно мы и сталкиваемся. Давайте на секунду задумаемся, удобно ли нам будет каждый раз, когда нужно изменить какой-то из параметров езды, будь то скорость или направление какого-то из моторов, добавлять несколько строк в код? Я думаю, что нет. Поэтому мы сделаем раз и навсегда функцию для управления моторами. Назовем эту нашу функцию drive. Передавать мы в нее будем 2 параметра: скорость для левого колеса и скорость для правого. Причем мы можем одновременно задавать направление, меняя знак этих параметров. То есть если мы подадим значение –100, например, значит нужно крутиться назад со скоростью 100. Затем мы убедимся, что моторы будут работать с корректными значениями, потому что функция drive может быть вызвана с каким-то параметром, вычисленным автоматически, и нужно убедиться, что он попадает в диапазон допустимых значений от –255 до 255. Иначе аналог right отработает неизвестным нам образом. Затем нам нужно понять, с каким знаком пришел параметр, то есть если он положительный, мы будем крутить мотор вперед. Если отрицательный – назад. То же самое делаем для правого мотора. А затем задаем скорости для обоих, причем параметры left и right берем абсолютные, берем абсолютные их значения. Теперь мы можем просто вызывать эту функцию, задавая скорость для левого и для правого колеса. Проведем небольшой тест, покрутим оба вперед с максимальной скоростью, затем оба назад с разными скоростями. Кстати, не факт, что вот этих 80-ти хватит для того, чтобы сдвинуть мотор с места. Посмотрим. И в разные стороны с разными скоростями. Давайте убедимся, что это работает. [ШУМ] В самом деле, выполняются все три действия. 80-ти, действительно, не хватает для вращения левого колеса назад. Но это не беда. Давайте проведем промежуточный итог. Посмотрим на нашу самую главную схему. На ней у нас появился новый элементарный исполнитель – коллектор и моторчик постоянного тока вместе с редуктором и колесом. Им мы управляем не просто сигналом с Arduino, а используя посредника в виде драйвера двигателя. Мы управляем драйвером двигателя, отправляя элементарные цифровые и аналоговые сигналы, и все это вместе вращает колеса. Затем мы взяли два мотора с колесами и построили тележку, то есть у нас получился более сложный исполнитель. Управляется он все той же одной микросхемой. И мы подготовили специальную функцию drive, с помощью которой мы можем не задумываться о комбинации сигналов, которые идут на оба мотора, а просто задавать скорости для левых и правых колес. Потом мы немного поэкспериментировали с беспорядочной ездой, которая не использует никакую обратную связь. Просто у нас был набор команд для перемещения в разные стороны.