Подключаем мотор-колесо от гироскутера к ESP32 (среда программирования Arduino ide)

Разбираем его. К сожалению, воспользоваться драйверами самого скутера у меня не получилось, они ушли на запчасти, а вот мотор-колеса и батарея пригодится в нашем проекте.
В гироскутере пара таких драйверов

Мотор-колесо имеет три силовых фазы (это бесколлекторный трехфазный двигатель) и энкодер в виде трех датчиков Холла (с питанием датчиков это 5 контактов) . Контакты по краям разъема – питание, внутренние сигналы от датчиков Холла.

Как я уже заметил, подключить к контроллеру имеющийся в комплекте гироскутера драйвер у меня не получилось.
На помощь пришел знаменитый китайский магазин.
По итогу был выбран драйвер BLD-300B. Особенностью драйвера можно считать «заточенность» на управление через подстроечный резистор (внутренний либо внешний). Такой драйвер можно использовать для регулировки вращения шпинделя фрезерного станка. Но мне нужно использовать его для управления вращением колеса. При этом должна адекватно работать обратная связь по скорости. Т.е. если сопротивление вращению увеличивается драйвер должен это компенсировать, добавив мощности мотору доведя скорость до заданной.

Если требуется, чтобы драйвер держал заданную скорость, переключите тумблер в положение ON
Если SW2 в положении OFF , при малых оборотах мотор колесо можно остановить рукой. После включения SW2, это сделать затруднительно.
Самая элементарная схема подключения изображена ниже. Нужно заземлить EN и BRK. После этого можно управлять мотором посредством внутреннего подстроечного резистора. 
В качестве источника питания для мотора я буду использовать батарею от разобранного гироскутера на 36V емкостью 4 амперчаса.
Входы драйвера EN, BRK, F/R через резистор подтянуты к 5 вольтам питания, как следствие, если их не подключать никуда, они будут находиться в состоянии высокого сигнала (на них будет 5 вольт).

Я протестировал вращение с использованием внутреннего потенциометра. Единственное, что мне не понравилось, это отсутствие полной блокировки вращения колеса, даже при использовании функции тормоза (колесо можно провернуть). При этом я не тестировал вращения в разные стороны.
Следующая схема позволяет изменять направление вращения и подключать тормоз. Но мне она не интересна, мне требуется научиться управлять при помощи микроконтроллера. 
Подключаем микроконтроллер
Первое, что я попробовал сделать, это научить микроконтроллер управлять скоростью мотора. Для этого я подключил вывод контроллера к SV входу драйвера. Но согласно документации частота PWM управления должна быть не менее 1Кгц. Стандартный ШИМ от Arduino Nano генерируется на частоте 500Гц. Решено использовать контроллер на базе ESP32
Для согласования уровня сигнала я использовал преобразователь уровней сигнала вроде того, что показан в центре схемы ниже. 
Программа содержит два файла, один описывает класс мотора motor_init.h, а второй — главная программа, работающая в цикле testmk1.ino .
Испытания прошли успешно.
Управляю направлением и тормозом
Следующим этапом я подключил контакты направления вращения и тормоза по схеме ниже. В программу также включил возможность управления мотором. Но, к сожалению, схема оказалась не рабочей. Преобразователь уровня стал работать в обратном направлении и передавал напряжение со входов DIR и BREAK драйвера на контроллер. Контроллер зависал, перезагружался – «паниковал».


Поразмыслив, и используя элементарную логику, я составил еще пару схем, первую с использованием полевых транзисторов, а вторую с использование оптопары. Обе они приводили к замыканию/размыканию через полупроводниковый элемент DIR и BREAK на землю. Обе они оказались работоспособными.
Последняя схема мне нравится больше, т.к. оптопара еще является защитой от высокого потенциала для контроллера. Возможно ШИМ (контакт SV) нужно выполнить в таком же «стиле».
Тестовые программы прикреплены к статье.
CARduino – самодельный робот на Arduino

Как понятно из названия, это робот на контроллере Arduino UNO. К нему разработаны собственные библиотеки для простого и удобного использования. В обычной комплектации робот содержит два двигателя, два колеса и дальномер, установленный на передней панели. Также сверху на нём есть макетная плата для добавления разнообразных устройств на ваше усмотрение. Он работает и управляется автономно, однако к нему можно добавить радиоуправление. В этой статье описана работа с ним и библиотеками и есть несколько примеров.

Что такое библиотека?
Библиотека облегчает управление CARduino. Этот проект рассчитан на людей с небольшим опытом в программировании, которые хотят делать простых роботов. Вам даже не нужно знать, как управлять мотором. Библиотека сводит программу до простых команд «Повернуть направо и проехать 1 секунду» или «Ехать вперед 3 секунды, а затем ускориться». Библиотека также содержит примеры программ, которые помогут вам. Более подробная информация о библиотеке содержится в конце статьи.
Если у меня нет таких же материалов, я могу использовать другие?
Конечно, вы можете собирать робота как вам угодно. Библиотека будет работать практически независимо от сборки. Например, вы можете использовать другой материал для шасси. Я использовал дерево, потому что смог найти только его.
Что может сделать робот?
Он может делать все что угодно. Даже без дополнительных устройств его возможности практически не ограничены. При помощи библиотеки CARduino, писать программу для Arduino очень легко. Дополнительная макетная плата позволяет добавлять разнообразные датчики.
Какая стоимость робота?
Если собирать его с нуля, то около 100$. У меня были почти все части, поэтому он обошелся мне примерно в 30$. Все компоненты достаточно распространены и должны у вас быть.
Детали

1х Arduino Uno.
1х Макетная плата.
1х Разъёмы для Arduino и макетной платы.
1х Дальномер Sharp.
2х Микро мотора.
Пара колес 49×19мм.
Пара кронштейнов для двигателя.
Пара шариковых колёс .
Драйвер моторов для Arduino.
1х Кусок дерева 15×10.75 см.
12х Шурупов.
1х 9В батарея
Подготовка шасси робота
Перед началом сборки необходимо вырезать кусок дерева необходимых размеров, прикрепить шариковые колёса как описано ниже, прикрепить основные колёса, установит макетную плату и Arduino на основу.
Установка шариковых колёс
Установите оба колеса сзади, с обеих сторон. Отметить места, на которые попадают их крепёжные отверстия и просверлите их. Используйте шурупы для крепления.

Установка моторчиков
Это довольно просто. Все, что вам нужно сделать — это вставить двигатели в кронштейн и прикрепить их на углах доски. Вы можете припаять провода к ним. Не перепутайте положительные и отрицательные контакты.

Установка Arduino и макетной платы
Вы должны начать с центрирования Arduino и макетной платы на шасси. Отметьте отверстия держателя и просверлите их. Потом прикрепите основу с макетной платой и Arduino шурупами.
Установка датчика

Расположите датчик спереди и посередине, отметьте крепёжные отверстия и просверлите их. Вы должны использовать отверстия на обоих сторонах датчика. Используйте шурупы для крепежа. Убедитесь, что при установке JST выводы находится вверху. Вставьте JST провода в датчик.
Красный провод присоедините к + макетной платы, черный к GND, а желтый в любую другую точку. После этого подключите драйвер моторов к Arduino.

Подключение двигателей колес к драйверу
Подключите положительный контакт правого двигателя к отрицательному контакту А драйвера.
Подключите отрицательный контакт правого двигателя к отрицательному контакту А драйвера.
Подключите положительный контакт левого двигателя к отрицательному контакту В драйвера.
Подключите отрицательный контакт левого двигателя к отрицательному контакту В драйвера.

Подключение питания и датчика

Подключите 5В к + макетной платы, а GND к GND макетной платы. Желтый провод датчика подключите ко второму контакту АЦП.
Установка батареи
Просто приклейте её супер клеем на задней панели CARduino. Затем присоедините + и GND к + и GND Carduino.

Вы закончили сборку робота! На нем без изменений будет работать библиотека и тестовые программы. Подробнее о этом написано ниже.
Библиотека
Для установки библиотеки скачайте Carduino.zip ниже. Найдите / arduino-1.0/libraries. Извлеките содержимое архива в эту папку.. Чтобы использовать её, откройте Arduino IDE и последуйте по пути -> import library -> Carduino.
Значение функций:
void mycarduino.begin ()
Инициализация CARduino. Напишите эту команду в начале программы.
void mycarduino.goforward (время в секундах, скорость)
Эта функция перемещает CARduino вперед в течении указанного времени с указанной скоростью. Скорость может быть любым числом от 1 до 1023, 1023 – максимальная скорость.
void mycarduino.goback (время в секундах, скорость)
То же самое, только назад.
void mycarduino.turnright (время)
Поворот направо в течении указанного в времени(в миллисекундах).
void mycarduino.turnleft (время)
Тоже самое налево.
Int mycarduino.proximity ()
Возвращает значение с датчика в сантиметрах
Примеры:
Перейдите по адресу File -> Examples -> Carduino -> [имя на ваш вкус]
Blink — CARduino секунду двигается вперед, на секунду останавливается, секунду движется вперёд, и т.д.
Object Avoid — CARduino постоянно движется вперед, пока объект находится на расстоянии более 25 сантиметров. Затем он случайным образом выбирает сторону и поворачивает в неё на 800 или 2300 миллисекунд.
Cautious Driving – работает как предыдущая программа, но замечая объект на расстоянии 40 см замедляет скорость.
Вы полностью закончили проект!
Ниже видео робота в действии (из-за проблем с дальномером он отключен, но робот работал)
Робот, ездящий по линии под управлением Arduino
В данной статье будет описан процесс создания робота, ездящего по линии. Эта задача является классической, идейно простая, она может решаться много раз, и каждый раз вы будете открывать для себя что-то новое. Решение этой задачи и реализация полученного решения позволяют приобрести необходимые начальные навыки для дальнейшего совершенствования в робототехнике.
Существует множество подходов для решения задачи следования по линии. Выбор одного из них зависит от конкретной конструкции робота, от количества сенсоров, их расположения относительно колёс и друг друга.
В нашем примере будет собран робот на лёгкой платформе с двумя колёсами и двумя датчиками линии, расположенными на днище робота перед колёсами.
В результате выглядеть он будет так:

Что понадобится
Для нашего примера понадобятся следующие детали:

Вообще говоря, лучше было бы использовать NiMH-аккумуляторы: они лучше отдают ток и значительно дольше держат напряжение, но для целей этого проекта одной батарейки на 9 В вполне хватило.
Собираем робота
Сначала соберём робота, установим всю механику и электронику.
Собираем платформу
Для начала прикрепим колёса к моторам.

Затем с помощью пластиковых П-образных креплений прикручиваем моторчики к платформе. Обратите внимание на взаимное расположение крепления и моторчики: в креплении есть небольшие углубления, так что если всё соединить правильно, то моторчики будут крепко держаться и никуда не выскочат.

Теперь крепим балансировочный шар.

Отлично! Платформа собрана. Если вам кажется, что колёсам отведено слишком мало места и они трутся о платформу, то скорее всего вам нужно посильнее надавить на колёса, чтобы они плотнее сели на вал мотора.
Крепим сенсоры
Закрепим их, как показано на фото:

Можно было бы выбрать и другое место. Это могло бы сделать контроль проще или сложнее, а самого робота более или менее эффективным. Оптимальное расположение — вопрос серии экспериментов. Для этого проекта просто был выбран такой способ крепления.
Крепим Arduino
Arduino закрепим с противоположной стороны двумя винтиками и гайками.

Опять же, можно выбрать и другое место. Например над колёсами, если приподнять Arduino на латунных стойках. Это изменило бы положение центра масс и повлияло бы на эффективность робота в лучшую или худшую сторону.
Крепим Motor Shield и соединительные провода
Установим Motor Shield на Arduino и подсоединим соединительные провода. Обратите внимание, чтобы соотвествовать программному коду из примера ниже, моторчики соединены с Motor Shield так: правый — к клеммам M1 с прямой полярностью (плюс к плюсу), а левый — к M2 с обратной (плюс к минусу).

В этом проекте, для экономии времени концы соединительных проводов просто скручены с контактами моторов. При работе «начисто» стоит жёстко припаять провода к моторам.
Крепим Troyka Shield
Присоединяем сверху Troyka Shield и подключаем датчики к 8 и 9 цифровым контактам. В итоге получаем следующую конструкцию:

Программирование
Теперь напишем программу, которая заставит собранную конструкцию двигаться по нарисованной линии. В проекте мы будем использовать чёрную линию, напечатанную на белых листах бумаги.
Основная идея алгоритма
Пусть у нас усть белое поле, и на нём чёрным нарисован трек для нашего робота. Используемые датчики линии выдают логический ноль, когда «видят» чёрное и единицу, когда «видят» белое.
На прямой робот должен пропускать трек между сенсоров, то есть оба сенсора должны показывать единички.
При повороте траектории направо, правый сенсор наезжает на трек и начинает показывать логический ноль. При повороте налево, ноль показывает левый сенсор.
Таким образом получаем простую систему с тремя состояниями:
На вход системы поступает информация с сенсоров. Получаем следующую логику переходов:
| Левый | Правый | Целевое состояние |
|---|---|---|
| 0 | 0 | STATE_FORWARD |
| 0 | 1 | STATE_RIGHT |
| 1 | 0 | STATE_LEFT |
| 1 | 1 | STATE_FORWARD |
Реализация на Arduino
Проблема инертности и её решение
Однако если выставить скорость моторов побольше, мы столкнёмся со следующей проблемой: наш робот будет вылетать с трека, не успевая отреагировать на поворот. Это связано с тем, что наши моторчики не умеют тормозить мгновенно.
В этом легко убедиться поставив следующий эксперимент: с заданной скоростью робот будет двигаться по поверхности, и в некоторый момент будет установлена нулевая скорость и измерен тормозной путь робота. Пусть робот разгоняется по монотонной поверхности и тормозится при фиксировании импровизированной стоп-линии.
Эксперимент проведём для разных скоростей. Код программы для эксперимента таков:
На той поверхности, на которой проводился эксперимент, были получены следующие результаты:

Таким образом, начиная с некоторого момента у нашего робота нет никакой возможности успеть среагировать и остаться на треке.
Что можно сделать?! После того, как сенсоры улавливают поворот, можно остановиться и вернуться назад на некоторое расстояние, зависящее от скорости перед остановкой. Однако мы можем отдать команду роботу ехать с какой-то скоростью, но не можем приказать ему проехать какое-то расстояние.
Для того, чтобы понять зависимость расстояния при заднем ходе от времени, был проведён ещё один замер:
На скорости 50, например, робот проделывал путь, зависящий от времени следующим образом:

Полученные две зависимости были линейно аппроксимированы, затем была выведена формула зависимости времени, которое надо двигаться назад, от скорости перед остановкой.
Обратим внимание на то, что у вас значения могут оказаться другими: из-за особенностей сборки либо из-за поверхности, поэтому в общем случае лучше провести все измерения самостоятельно.
Адаптивное поведение
Перед финальным экспериментом произведём ещё несколько поправок.
Во-первых, нам необязательно давать команду ехать назад перед каждым поворотом, как мы помним, на маленькой скорости робот прекрасно справляется и без этого. К тому же лучше ему двигаться не прямо назад, а немного поворачивая, всё-таки робот находится перед поворотом.
Во-вторых, нам стоит различать состояния робота: когда он движется по прямой, и ничто ему не мешает ускоряться; и когда робот входит в поворот. В первом случае действительно будем увеличивать скорость робота для более динамичного прохождения трека, во втором случае будем сбрасывать скорость до значения, достаточного для успешного прохождения поворота, и будем держать эту скорость ещё какое-то время.
В итоге наш код будет выглядит следующим образом:
Результат
Что дальше?
Представленный алгоритм оставляет множество возможностей для улучшения и оптимизации. Скорость поворота можно так же менять адаптивно. Можно добавить контроль заноса. Можно поиграть с расположением сенсоров и центром масс. В конце концов можно получить непобедимого на треке робота.
roboforum.ru
Прошу прощения за идиотский вопрос.
Посоветуйте, плз, как закрепить колеса или шестерни на оси таких вот моторчиков:
Ось гладкая, поэтому на силе трения мало что удержится. Пока там крепятся крышки от бутылок на честном слове. ))
Есть колеса от разных игрушек (с диаметром отверстия гораздо большим, чем ось моторчика) — крепил их, наматывая слои изоленты — но не сильно помогает.
Есть колеса с вставленной пластиковой осью — но не знаю, как просверлить отверстие в оси колеса строго по центру никуда его не перекосив..
В общем, кто как решает такую проблему? (совет покупать моторчики уже с шестеренками, конечно, хорош, но хочется альтернативных вариантов. )