Arduino машинка своими руками. Управление с помощью джойстика.
Arduino машинку собрать своими руками достаточно просто и в интернете есть много примеров с исходными материалами и с инструкций по сборке. Я также собирал машинку с радио управлением на Arduino. Подробнее читайте тут.
Сегодня речь пойдет про Arduino машину, которую просто собрать при относительно небольшой стоимости комплектующих. Для управления будем использовать ни bluetooth и ни Wi-Fi, а обычную проводную связь. В качестве пульта будет выступать джойстик. Давайте рассмотрим подробнее этапы сборки и программирования машинки на Arduino.
Собираем Arduino машину.
Машинку можно собрать на базе «робоплатформы на ардуино», которую можно купить тут. Или самостоятельно напечатать на 3D принтере раму. Исходные материалы вы можете скачать внизу статьи в разделе «Файлы для скачивания».
В связи с тем, что робоплатформу использовал уже в предыдущем проекте. А часть схемы оставили без изменения. Поэтому останавливаться на описании не буду. Вы можете купить готовую робоплатформу, чтобы не думать о том, как её сделать или собрать. В данном разделе статьи рассмотрим схему питания и драйвер l298n.
Драйвер L298N используется для управления двигателями постоянного тока. Схема модуля, состоящая из двух H-мостов, позволяет подключать к нему два щёточных двигателя постоянного тока. При этом есть возможность изменять скорость и направление вращения моторов.
Описание драйвера L298n:
OUT1 и OUT2 – разъёмы для подключения первого щёточного двигателя;
OUT3 и OUT4 – разъёмы для подключения второго щёточного двигателя;
VSS – вход для питания двигателей (максимальный уровень +35V);
GND – общий провод (не забываем соединить с аналогичным входом Arduino);
Vs – вход для питания логики +5V. Через него непосредственно запитывается сама микросхема L298N. Есть ещё второй способ питания, при котором 5V для L298N берётся от встроенного в модуль стабилизатора напряжения. В таком случае на разъём подаётся только питание для двигателей (Vss), контакт Vs остаётся не подключенным, а на плате устанавливается перемычка питания от стабилизатора, который ограничит питающее моторы напряжение до приемлемых 5V.
IN1, IN2 – контакты управления первым щёточным двигателем.
IN3, IN4 – контакты управления вторым щёточным.
ENA, ENB –контакты для активации / деактивации первого и второго двигателей. Подача логической единицы на эти контакты разрешает вращение двигателей, а логический ноль – запрещает.
В связи с тем, что на борту драйвера есть стабилизатор на 5 В. Записать Arduino UNO можно от драйвера.
Также нам понадобиться подключить джойстик по схеме, которую рассмотрим ниже. Провода сделал самодельные. Если у вас нет Dupont разъёмов, можно провода припаять к джойстику и Arduino.
Схема подключения электроники робота машину на Ардуино.
Всю электронику робо машины на Ардуино подключаем по следующей схеме. Красным с пунктиром, который отмечен проводник, подключает питание драйвера L298n от аккумулятора 18650. Красным проводником обозначено питание 5В.
У драйвера убираем перемычки, что позволяет плавно регулировать скорость вращения и подключаем 6 проводов управления драйвером L298n к Arduino. Но в связи с тем, что ход перемещения джойстика не большой, плавное регулирование скорости практически не заметно. Поэтому подключить можно и по 4 провода и использовать другие драйвера, например L9110S.
Для управления подключаем джойстик по 4 проводам. Пятый контакт на джойстике нужен для получения сигнала нажатия на джойстик. Данную функцию использовать не будем. Поэтому достаточно 4 провода для подключения.
Описание кода Arduino машинки.
Если вы раньше не работали с Arduino, рекомендую прочитать статьи:
В связи с тем, что машинка делалась по принципу как можно проще. Код также получился небольшой и простой. При желании его можно изменить или дополнить. Например, убрать изменение скорости вращения двигателя. Оставить просто включение или выключение вращение двигателя в нужном направлении.
Первым делом в скетче управления машинкой на Arduino инициализируем пины подключения джойстика. Подключаем к 2 аналоговым входам A0, A1.
#define pinX A0 // Горизонтальное положение джойстика (аналоговый пин)
#define pinY A1 // Вертикальное положение джойстика (аналоговый пин)
Затем инициализируем пины подключения драйвера L298n. Можно подключить и к другим драйверам по 4 проводам. В таком случае не нужно подключаться к выводам ENA и ENB, вернув перемычки на место. При таком подключении не будет плавного изменения скорости вращения двигателя.
int ENA = 9; // Включение 1 движка (цифровой пин ШИМ)
int in1 = 7;// Поворот 1 движка (цифровой пин)
int in2 = 8; // Поворот 1 движка (цифровой пин)
int ENB = 10; // Включение 2 движка (цифровой пин ШИМ)
int in3 = 5; // Поворот 2 движка (цифровой пин)
int in4 = 6;// Поворот 2 движка (цифровой пин)
Затем добавим 4 переменные необходимые для определения центрального положения джойстика для авто калибровки и выделения зоны чувствительности джойстика.
int x_min; //нижняя граница нейтрали по оси x
int x_max; //верхняя граница нейтрали по оси x
int y_min; //нижняя граница нейтрали по оси y
int y_max; //верхняя граница нейтрали по оси y
В блоке setup() инициализируем пины подключения драйвера как выход.
int x_min; //нижняя граница нейтрали по оси x
int x_max; //верхняя граница нейтрали по оси x
int y_min; //нижняя граница нейтрали по оси y
int y_max; //верхняя граница нейтрали по оси y
Затем считываем значения с джойстикаи сохраняем в созданные ранее переменные с увеличением и уменьшением полученного значения на 30. Тем самым определим рабочие зоны для каждой оси.
int x = analogRead(pinX);
int y = analogRead(pinY);
x_min = x - 30;
x_max = x + 30;
y_min = y - 30;
y_max = y + 30;
Также необходимо создать небольшую функцию Motor(), которая позволит управлять двумя моторами постоянного тока.
В основном цикле loop() считываем положение джойстика и определяем ШИМ сигнал, приводим полученное значению к диапазону от 0 до 255. Что позволяет плавно изменить скорость двигателей.
int x = analogRead(pinX); // считываем положение джойстика
int y = analogRead(pinY);
if (y < y_min ) {
int sh = map(y, y_min, 0, 0, 255);
Motor(sh, HIGH, LOW, HIGH, LOW);
}
else if (y > y_max ) {
int sh = map(y, y_max, 1024, 0, 255);
Motor(sh, LOW, HIGH, LOW, HIGH);
}
В зависимости от положения джойстика по оси Y двигателя вращаются вперёд или назад.
При изменение положения по оси X вращаем двигатели на встречу друг другу, что позволяет производить поворот машины на Arduino влево и вправо.
else if (x < x_min ) {
int sh = map(x, x_min, 0, 0, 255);
Motor(sh, HIGH, LOW, LOW, HIGH);
}
else if (x > x_max ) {
int sh = map(x, x_max, 1024, 0, 255);
Motor(sh, LOW, HIGH, HIGH, LOW);
}
Внимание! Если у вас машина поворачивает не в том направлении, переверните провода подключения одного из моторов. Если стало работать, но в зеркальном отражении переверните у обоих двигателей провода.
И последние строки кода отключают двигатели машинки при расположении джойстика в центральном положении.
else
{
Motor(0, LOW, LOW, LOW, LOW);
}
Скетч прост и его можно доработать или дополнить по вашему желанию.
Подведем итог.
В связи с тем, что машинка планировалась как бюджетная модель с минимальными возможностями и простотой схемой подключении, которую можно легко повторить. Это привело к ряду минусов:
Проводное управление ограничивает перемещение и при повороте больше чем на 360 градусов провод попадает под колеса.
Машинка умеет только ездить и поворачивать. На этом ее возможности заканчиваются.
Но благодаря этому есть и преимущества которые оценят новички впервые решившие сделать машинку на Arduino:
Недорогие комплектующие.
Простота сборки электроники.
Несложная программа.
Не используются сторонние библиотеки, не нужно ни чего дополнительно устанавливать. Достаточно взять код и загрузить его в Arduino.
Если вас интересуют более сложные реализации машин на радиоуправлении или беспроводном управлении, смотрите предыдущие проекты:
Комментарии