[Из песочницы] Как мы GLK в автопилот превращали

qq1ccrg2wvno4w5r5dqnoaqtssk.jpeg


Однажды вечером мне захотелось проапгрейдить машинку на радиоуправлении, сделать её почти «беспилотником» и немного изучить ардуино и программирование. Дома без дела лежала модель Mersedes-Benz GLK…
b0n5xignpcwssdafx86xvvpuwdi.jpeg

Заказал набор ардуино, из других элементов можно собрать не менее интересные проекты, но об этом, в следующих статьях. Когда пришла посылка, arduino определилась виндой, сделал пару начинающих уроков. Скетчи, огоньки, кнопки — это было «здорово!» Решил пойти дальше.

Первые шаги


Разобрал машинку, оставил внутренности: Рама, крепления, 2-dc мотора

mznj3qnsimap_n1nqbhztozodlm.jpeg

Из набора взял:

  • Arduino UNO R3
  • Ультразвуковой датчик расстояния HCSR-04, Сервопривод, Макетная плата, Драйвер L293D, набор проводов.
  • В качестве питания используется 9В крона и блок из 4ех батареек по 1,5В каждая.


Нашел отличную статью по подключению L293D к Arduino Uno с двигателем постоянного тока (DC motor). Там всё живо и в картинках расписано, даже узнал то, чего не проходил на схемотехнике или забыл уже:)На разобранном мерседесе я нашел пару проводов, идущих от нужного двигателя. Нужно было найти + и -. Плюс обычно rрасный, минус черный. Так и получилось. Соединил первый двигатель по статье, заставил его вращаться.В статье есть простейшие скетчи.

На официальном сайте я скачал программу для ардуино, установил её, порт для arduino не всегда моментально определяется.Запустил и сразу открылась среда для написания кода. Вообще начать программировать под ардуино просто. Среда сама предлагает две функции setup () и Loop (). Setup () выполнится один раз при запуске, а Loop () будет повторяться бесконечно. Код в ней пишут на C++, но даже если Вы не умеете в любой статье есть примеры.Просто используйте его и, применяя логику, сами поймете как его усовершенствовать.

Затем, я подключил второй двигатель аналогично первому.

Загрузив в плату скетч для их вращения, то в одну, то в другую сторону, мне удалось управлять их мощностью. Это хороший результат, смог оживить, то что сломал.

Работа двух dc-моторов


Управление поворотным двигателем


Драйвер двигателя L293D поддерживает 2 мотора постоянного тока. Надо сразу сказать что рулежка штука непростая и реализовать её можно по-разному. В этой машине самый простой способ— это обычный двигатель. Отдаете команду повернуть колеса и он просто бесконечно крутится в одну сторону. Колеса повернутся до упора, а двигатель будет продолжать крутиться.

Поворачивать колеса двигатель не хотел, часто слетали провода, т.к я не хотел паять, нашел движки с открытыми контактами, задавал ему слишком большое значение для мощности, потом в статье прочел, что для ШИМ максимальное значение 255, но лучше назначать 180–210.

Подключение сервопривода


Принцип работы: получая на входе значение управляющего сигналом, сервомотор стремится поддерживать это значение на выходе своего исполнительного элемента.Подробно про управление сервоприводом здесь

Углы поворота я установил 30, 75, 130 градусов (влево, прямо и вправо соответственно).Было немало попыток для определения нужных мне углов, но каждый раз при новом подключении углы сбивались, приходилось прописывать их заново. Потом при установке на 75 сразу, все получилось.

Ультразвуковые датчики


Способность ультразвукового датчика определять расстояние до объекта основано на принципе сонара — посылая пучок ультразвука, и получая его отражение с задержкой, устройство определяет наличие объектов и расстояние до них.Иногда датчик не срабатывал на поверхность, не отображался в мониторе порта Arduino IDE, переподключал, все налаживалось. Закрепил его суперклеем, сверху на сервоприводе, в наборе шла стойка для него выглядит почти как » Валли».

Про подключение датчиков расстояния подробно рассказано здесь.

Питание


Для «автономности» 9В крону подключаем к платформе, к ШИМ подключаем блок из 4 батареек, это увеличит мощность на обоих моторах, и сервопривод будет быстрее срабатывать. Питание — одна из основных проблем, в начале не хотел ездить от кроны, но без проблем катался от сети или ноутбука, был ограничен проводом, в плату подключил ещё 4 батарейки и он почти летает.

Ход работы:


В самом начале удалось запрогать его, чтобы он тормозил перед объектом, если расстояние до объекта становится здесь, и на других ресурсах.


Затем научил его определять расстояние до объектов, и в зависимости от этого ехать вперед-назад, поворачивать колеса влево-вправо. Очень помогло изучение циклов в C++, Arduino.


Продумал все крепления, все провода почти скрыты под макетной платой, нигде не отходит контакт в ненужный момент.

В итоге общая схема подключения:

xxlccq9nan2oyx8nxfxnj20yic8.png

Сначала писал скетчи для каждого процесса отдельно, потом объявил все переменные, пины, подключаемые библиотеки, расписал цикл.

Описание цикла: дальномер измеряет расстояние впереди, если оно > 20 см (в скетче параметр const int vmindistance), то продолжаем двигаться вперед, если < 20 см, то: останавливаем моторы; крутим сервопривод на углы от 30° до 130° с шагом в 45° и измеряем расстояния на этих углах; заносим полученные значения в массив; поворачиваем сервопривод прямо на угол 75°; ищем в массиве позицию с максимальным значением данных; если это значение < 30 см, то едем назад, если > 30 см, то проверяем какому углу поворота сервопривода оно соответствует и в зависимости от этого поворачиваем влево или вправо.


Вопросы под катом.

© Habrahabr.ru