Как управлять моторчиком через ардуино с помощью переменного резистора без драйвера

Обновлено: 07.07.2024

В этом уроке мы рассмотрим два вида моторов: DC мотор и Сервопривод.

Сервопривод – это моторчик, который может держать заданный угол поворота. Так же есть сервы, которые могут удерживать заданную скорость, но сегодня мы не будем их рассматривать.

Нам понадобятся

  • Микросервопривод
  • DC мотор(я использовал FA-130 из Матрешки)
  • Конденсатор на 220 мкФ
  • MOSFET
  • Выпрямительный диод
  • Потенциометр
  • Соединительные провода «Папа-Папа»

DC мотор

Для начала рассмотрим обычный моторчик. Ток, который поддерживает Arduino на своих выходах до 40 мА. Моторчик без нагрузки потребляет 80мА, а при блокировке 1600мА (для разных моторчиков потребляемый ток может варьироваться), что определенно больше максимальных 40 мА. Поэтому, если моторчик просто подключить к пину Arduino, то велик шанс, в лучшем случае повредить мотор или сжечь пин, в худшем – вывести из строя микроконтроллер.

Для того, чтобы подключить мотор к Arduino, придуманы различные Motor-shieldы, придуманы микросхемы, например L298, MOSFET- транзисторы. В первой части курса мы рассмотрим только MOSFET-транзистор.

Что такое транзистор? Транзистор – это электронная кнопка, только «нажимаемая» током. О нем поподробнее.

MOSFET- транзистор – это транзистор для управления большими токами, малым напряжением.

Так как вывод Vin позволяет подключать нагрузку без ограничений по величине тока, мы сможем подключить моторчик и управлять им с помощью MOSFET и Arduino.

Соберем схему, которая позволит нам посмотреть, как в зависимости от подаваемого напряжения изменяется скорость вращения мотора.


Компонент сверку мотора – это выпрямительный диод. Если ты знаком с устройством коллекторного мотора, то ты знаешь, что при его работе возникает обратный ток, который может повредить наш MOSFET. Для того чтобы этого не произошло мы и используем выпрямительный диод.

Главное - не перепутать полярность подключения диода. Иначе - будет короткое замыкание.

Теперь перейдем к коду.

Код к мотору

Пояснения

Мотор подключается как аналоговый выход. То есть, питание выводится через analogWrite(MOTOR, Значение) А в зависимости от значения, MOSFET дает сигнал о подаче нужного напряжения.

Сервопривод

Отлично! С моторчиком разобрались. Теперь переходим к сервомотору. Без определенных знаний при управлении сервомотором не обойтись. Но хорошие люди уже постарались для нас и сделали библиотеку для управления сервой. Поэтому управлять сервомотором достаточно простая задача.

Соберем простенькую схемку, в которой серва будет поворачиваться сначала до упора в право, а потом обратно влево и так бесконечно. Где нам это пригодится, мы узнаем во Второй части нашего курса. А проявив фантазию, ты уже сейчас можешь найти применение этой схеме. Внимание на картинку.


Бочонок на схеме – это конденсатор. Конденсатор – это такая маленькая батарейка, которая очень быстро заряжается и быстро разряжается. О нем подробнее.

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

Цвета проводов на твоей серве могут отличаться. Например, там может быть коричневый провод вместо черного, а вместо желтого оранжевый. Не надо пугаться. Ничего не меняется. Коричневый или черный – это земля. Красный, он есть почти всегда, - питание. Желтый или оранжевый – сигнал.

Код для сервомотора

Пояснения

Servo servo Мы создаем Объект типа Servo. Объект Servo имеет свои свойства, как и другие объекты int, byte, char, например. Нам не надо создавать и описывать объект Servo т. к. он уже описан в подключаемой библиотеке. А второе, «маленькое», слово servo – это просто имя нашего сервомотора. Вы можете называть его как вам угодно, не забывая о грамотности в C++ ,конечно.

servo.attach(пин) С помощью этой команды мы прикрепляем нашу серву к 13 пину. Текст до точки – это имя, объявленное при создании объекта Servo. Параметром принимает номер пина, к которому подключена наша серва.

servo.write(угол) С помощью этой функции, мы даем команду серве повернуться на нужный угол. А для постоянного вращения «туда-сюда» мы использовали цикл for.

++ и -- Это инкремент и декремент соответственно. Они нужны для более быстрой записи выражений. X++ означает то же, что и x == x+1, а x-- означает то же, что и x == x-1. Вариации.

Итог

Сегодня мы научились подключать сервомотор и DC мотор к Arduino. Это пригодится нам позже. Например, при создании мобильного робота или Робо-руки. Но это позже.


В этом уроке мы рассмотрим как управлять обычным мотором постоянного тока при помощи Ардуино.

У вас наверняка есть такие моторчики дома от старых игрушек или машинок. Так давайте их используем, нечего им валяться без дела. И не важно на какое они напряжение 5 вольт или 12 вольт, главное что бы были постоянного тока, а не переменного.

Управлять будем с помощью Ардуино, а точнее с помощью ШИМ выводов которые есть на этих платах.
Можно конечно купить специальную плату-драйвер для управления моторами, но мы не будем этого делать, а обойдёмся только Ардуино.

В управлении мотором нет ничего сложного, надо только подключить мотор к выводу ШИМ, а потенциометр которым будем управлять, к аналоговому входу.


ШИМ – это Широтно-Импульсная Модуляция, или по другому PWM – Pulse-Width Modulation — процесс управления мощности методом пульсирующего включения и выключения прибора.

ШИМ выходов на платах Ардуино несколько.


На платах Arduino UNO такие выходы отмечены знаком тильда.
Выходы которые можно использовать как ШИМ - это 3, 5, 6, 9, 10, 11

У Arduino Mega они обозначаются как PWM со 2 по 13 пин и 44-46.


У Arduino NANO никаких обозначений на плате нет. Надо просто запомнить это 3, 5, 6, 9, 10, 11.
Точно так же как и у Ардуино УНО.


Напрямую подключать моторы к Ардуино нельзя, так как они потребляют большой ток и могут питаться не 5 вольтами, а больше. Поэтому я подключил мотор через транзистор и параллельно мотору установил диод..

Описание скетчей.

Сегодня будет несколько скетчей.
Первый для управления скоростью вращения мотора. Управлять будем с помощью потенциометра. А в следующем уроке я покажу, как управлять вращением мотора программно. Плавно меняя скорость вращения.
Во втором мы объединим то что делали в двух последних уроках.
Это используем датчик ХОЛЛА и индикатор TM1637 для подсчёта оборотов вращения.
Короче сделаем тахометр на Ардуино. А для любителей велоспорта это прям почти готовый проект для определения скорости по количеству оборотов.
На мотор я приклеил магнит, а напротив установил датчик ХОЛЛА. И каждый раз когда магнит находится рядом с датчиком, датчик посылает сигнал на Ардуино и выводит значения на индикатор TM1637.

Данный пример демонстрирует как управлять двигателем постоянного тока с помощью Arduino и потенциометром. Код примера демонстрирует управление скоростью вращения двигателя постоянного тока с помощью потенциометра. В зависимости от положения ручки потенциометра, двигатель будет "разгонятся", либо замедляться.

Необходимое оборудование

При сборке схемы обратите внимание на распиновку транзистора - эмитор соединяется с минусом, база через резистор на 1кОм соединяется с 9 выходом Arduino, а коллектор с одним из выводов двигателя, другой вывод двигателя соединяется с плюсом источника питания на 9В. Параллельно двигателю подключаетсякерамический конденсатор(для фильтрации помех от работы двигателя) и диод(для защиты блока питания от обратного напряжения при выключении двигателя). Крайний левый контакт потенциометра соединяется с 5В шиной Arduino, крайний правый с GND Arduino, средний контакт идет на 0-ой аналоговый вход Arduino. Не забудьте объединить минус источника питания и GND Arduino.

Arduino uno and dc motor and pot.jpg

Двигатели постоянного тока, потребляют ток больше чем может выдать Arduino. Также они создают опасные выбросы напряжения. Для этого необходимо изолировать двигатель постоянного тока от платы Arduino и запитывать его через отдельный источник питания. Использование транзистора позволит безопасно управлять двигателем используя ШИМ. Транзистор работает как простой электрически управляемый переключатель. Каждый биполярный транзистор имеет три контакта: эмиттер, база, коллектор. Между коллектором и эмиттером течет большой ток, при малом токе базы. Изменяя ток базы, мы будем регулировать ток через коллектор-эмиттер и менять скорость вращения двигателя. Т.к. двигатель обладает инерцией, быстрое переключения транзистора с помощью ШИМ приведет к регулировке скорости вращения.

Реверс постоянного мотора через Ардуино без драйвера

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

Cesium137 аватар

Всем привет. Меня интересует как можно реализовать через ардуино реверс обычного постоянного мотора (например от лотка дисковода)? Мотор собираюсь запускать через транзистор подавая на базу сигнал с ардуино. Спасибо за вашу помощь заранее.

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

Cesium137 аватар

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

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

ЕвгенийП аватар

Лучше и проще поставить мостовой драйвер. Готовый или самому спаять.

А так, ну намудрите чтобы один пин вкючал мотор в одной полярности, а второй (независимо на разных транзисторах) - в другой, только следите, чтобы не вкючить оба пина сразу.

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

Включать мотор (с возможностью реверса) через транзистор не получится. Нужно собирать мостовую схему на транзисторАХ. Если мотор потребляет ток до 40 мА, можно поэкспериментировать с подключением напрямую к выводам микроконтроллера. Но я бы не стал это делать (индуктивность, знаете ли).

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

Cesium137 аватар

А для реверса мотора (схема Н-моста) 4 транзистора npn нужны или два npn и два pnp?

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

ЕвгенийП аватар

Так в гугле же этого добра . и схемы и методики расчёта .

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

Cesium137 аватар

Спасибо читаю уже. И ещё один вопросик по поводу pnp npn переходов. Если на npn транзистор на базу подать HIGH он откроется. А вот чтобы pnp открылся надо LOW подать? ПРавильно? Хочу удостовериться мой транзистор не сгорел. ДАташиты на нних нашел . npn КТ819Г и pnp КТ837Ф

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

ЕвгенийП аватар

Правильно. Притянуть к земле. Тоже самое про полевые транзисторы. N-канальный - к питанию, P-канльный к земле.

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

Cesium137 аватар

Спасибо за ответ. А разные можно использовать марки тразисторов для Н моста (одинаковый у них переход npn и Uбэ 5в макс?) .

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

ЕвгенийП аватар

Там в тех статьях есть правила расчёта в том числе и параметров транзистора.

Что касается Uбэ - оно почти у всех транзисторов примерно такое (ну, там 6 или 7 бывает, но не больше).

Вопрос связан с тем как его к питанию прижимать для PNP транзисторов? Так там же на эмиттере питание сидит - смотрите схему. ТАк что когда Вы на базу дадите питание, напряжение между базой и эмиттером станет нулём.

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

Cesium137 аватар

Закажука наверное L293. Мне вроде как принцып понятен как работает аш мост. Вчера пробывал это все на релюшках реализовать. Схему нарисовал. В теории смена полярности должна заработать. ПОка не проверял на практике. Есть два реле для ардуино.

Вопрос такой L293 может управлять 12В моторами? Какое количество моторов можно задействовать максимально. Я так понимаю он служит вроде ключа для открывания (пропукскания) питания на моторы, а также реверсы делать.

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

Jeka_M аватар

В даташите всё написано:

Wide Supply-Voltage Range: 4.5 V to 36 V
Output Current 1 A Per Channel (600 mA for L293D)
Peak Output Current 2 A Per Channel (1.2 A for L293D)

P.S. Что за дурацкая привычка создать кучу тем и писать в них одно и то же?

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

Cesium137 аватар

БЛАГОДАРЮ ВСЕХ ЗА ОКАЗАННУЮ ВАМИ МНЕ ПОМОЩЬ))))))))))))))))))))))))))))))))))

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

Cesium137 аватар

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

Теоретически должен, если частота ШИМа будет не велика. Насколько невелика - не знаю. Думаю сотни Гц.

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

Cesium137 аватар

Если ШИМ с ардуино уно?

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

Cesium137 аватар

Мне интересно будет ли управление ШИМ для моторов с Н-моста?

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

Cesium137 аватар

Здравствуйте. Мне интересно будет ли управление ШИМ ардуино ЮНО для мотора с Н-моста? Мне нужно управлять скоростью вращения.


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

ЕвгенийП аватар

Так, если интересно - соберите и попробуйте. И нам расскажете.

Обязательно следите за нагревом транзисторов.

И ещё, обратите внимание на то, что в этой схеме отсутствуе какая-либо защита (обработка) от одновременного включения высокого уровня в обеиъ отчках A и B. Прдеставьте себе, что произойдёт если транзисторы Т1 и Т3 (или Т2 и Т4) откроются одновременно! Убедитесь, что Ваш скетч никогда такой бяки не допустит.

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

Cesium137 аватар

Спасибо насчет защиты и кода в скетче. думал об этом уже. Хочу управлять реверсом переключателем который двигается в два положения. А в скетче на всякий случай дописать код:

digitalWrite(Точка A, HIGH);

И наоборот для точки В.

Вот только неуверен успеет эта логика сработать раньше чем будет КЗ)))))

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

ЕвгенийП аватар

Так делайте наоборот. Переставьте местами. Первую строку исполняйте только после проверки, что там на B. Если в какой-то момент окажется везде LOW - это не страшно, а вот HIGH не допускайте никогда.

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

Cesium137 аватар

Кстати эту схему собирал. только резисторы везде использовал на 1КОм. Транзисторы разные. Все они были проверены на открывание подачаей сигнала на базу (+ или - взависимости pnp или npn). Измерял напряжение мультиметров где должен быть мотор. Источник питания 9В земли питание и ардуино обьединил.

При подачи сигнала + на точку В 9 воль проходят спокойно. и ноль вольт если не подвать сигнал.

С точкой А по другому все. До подачи сигнала показывает какие то 2,2 В а при подачи 0,2 или 0. ПОка не пойму почему так.

Сейчас хочу резисторы найти подходящие для моих транзисторов или транзисторы ту которые в присланной статье указаны заново собрать схемуи проверить.

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

Cesium137 аватар

Хочу своей племяннице маленький подьемный кран сделать. два мотора и одна серва. Один мотор вокруг своей оси поворачивает кран. серва вверх стрелу поднимает за счет потенциометра. а второй мотор тросик поднимал бы.

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

Cesium137 аватар

Точно. сразу не подумал проверку в самом начале сделать.)))))

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

Cesium137 аватар

Конечно это не супер сложное изобретение будет как вплане технической или программной реализации. Тут проекты и по круче будут и сложностью и пользой. но я пока учусь. с чего то надо начать осваивать ардуино и электронику

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

ЕвгенийП аватар

Я бы на Вашем месте взял бы простенькую микросхемку TA7291 и не парился бы.

Там работа двигателя управляется не ШИМом, а опорным напряжением. Его, конечно, тоже их ШИМа делать надо, но зато на мотор идёт плавно, а не рывками.

Но самое главное её преимущество - режим торможения, т.е. быстрой остановки двигателя (как раз на оба входа HIGH подать). Режим классно работает. Двигатель быстро останавливается. А без такого режима, народу приходится его иммитиировать - после отключения питания "в одну сторону" подавать ненадолго "в другую", чтобы быстрее остановился.

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

Cesium137 аватар

НА одном канале В который работает пробывал ШИМ подавать. в градации от analogWrite от 1 до 10 напряжение от 2до 9в меняется (питание крона на 9В). Вроде как работает. Микросхему вашу себе запишу . приобрету.

А l293d для моих целей подойдет? (в плане ШИМ). или все же лучше TA7291?

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

ЕвгенийП аватар

А l293d для моих целей подойдет? (в плане ШИМ). или все же лучше TA7291?

Это для холивара фанатов той и другой микросхемы.

Принципиальная разница между ними:

293 - подаёт на двигатель всё напряжение сразу, так что управлять скоростью вращения надо через ШИМ, т.е. часто включая и выключая. А 7291 - подаёт на двигатель напряжение, равное опорному, которое на неё подали. Т.е. для управления оборотами мы не включаем/выключаем питание мотора постоянно, а просто подаём на него нужное напряжение.

293 - два полумоста в одном курпусе, а 7291 - один полный мост в корпусе

Ну и у 7291 есть режим торможения, а у 293 нет.

Мне больш нравится 7291, возможно потому. что в крупном проекте мне было очень важно как можно быстрее останавливать и торможение меня просто спасало.

Но, Вы не думайте, что это единственный выбор. Таких драйверов сотни и с торможением, и без, и полумостов и полных мостов. MAX14871, A3968, LV8716, DRV8837, вот ещё десяток на выбор

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

Cesium137 аватар

НУ спасибо вам огромное. ТЕперь я точно определился что лучше выбрать для моей затеии. Я так понял что ШИМ работает по принцыпу вкл выкл сигнала с очень болшое скоростью (этим задается ширина импульца) визуально кажется что это и есть ззамедление мотора или затухание плавное светодиода.

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

Cesium137 аватар

Если даст бог получится сделать кран подьемный то выложу фото и коды как я его реализовал

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

Cesium137 аватар

А какую модель лучше брать TA7291? TA7291sg или TA7291p? есть разницы в функциях ? У разных моделях кол-во ножек разное

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

ЕвгенийП аватар

Ну, это к Вам попрос. Я же не знаю, какой ток у Ваших двигателей.

ТА7291Р - 1,2А, в пике до 2А

ТА7291S и ТА7291F - 0,4А, в пике до 1А

Разница между S и F только в корпусе. S - в корпусе SIP-9, а F - в корпусе HSOP-16. Опять же, никто, кроме Вас не знает какой корпус удобнее в Вашей конструкции. Я вот, например HSOP боюсь как огня - я их паять не умею :)

На количество ножек не парьтесь - часть не используются. Так-то это одинаковые микросхемы.

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

ЕвгенийП аватар

В принципе, такие драйверы на мало-мальски большой ток - достаточно дорогие. Поэтому иногда проще сделать самогонный по той схеме, что Вы приводили (ну, а если ток совсем большой, то на полевых транзисторах). Например, нужен Вам драйвер на 4-5 ампер, берёте 4 штуки копеечных TIP122 (12 рублей за штуку), и делаете.

Торможение в самодельном мосте сделать совсем нетрудно. Я не буду давать схему, только идею подскажу, дальше подумайте, запустите какой-нибудь протеус или мультисим и "решите задачу". А идея там такая. Если у Вас есть двигатель, который можно раскрутить рукой и он будет вращаться (без питания), попробуйте во время вращения закоротить его обмотку. Увидите, как он начнёт заметно притормаживать и быстро остановится. Это главная идея. Только не "дораскручивайте" при замкнутой обмотке - можно спалить.

Если в Вашей схеме открыть одновоременно два нижних транзистора, а верхние оставить закрымыми, то Вы по сути закоротите обмотку двигателя на землю. Отдельно заметим, что если двигатель вращается, то он вырабатывает ЭДС - он же как электро-генератор работает. Так вот, когда к обмотке с двух сторон приложена земля, эта ЭДС будет будет уходить в землю, а двигатель тормозить. Это и есть "динамическое торможение".

Таким образом, динамическое торможение даже специально делать не надо. Если мы сделаем защиту от одновременного включения по сигналам в точка А и Б такую, что при открытии любого из нижних транзисторов, соответсвующий верхний будет автоматически наглухо закрываться, то это будет защитой от КЗ и одновременно режимом торможения!

Если же наоборот - открыть оба верхних и закрыть оба нижних, будет тоже самое - на обмотке с двух сторон питание - обмотка замкнута. Так что без рахницы, как придумаете.

Читайте также: